暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

postgresql 基于libpq — C Library的环境变量

原创 贾勇智 2022-04-14
647

以下环境变量可用于选择默认连接参数值,如果调用代码没有直接指定值,这些参数则将由 PQconnectdb、PQsetdbLogin 和 PQsetdb 使用。这些对于避免将数据库连接信息硬编码到客户端应用程序中很有用,例如:

环境变量 解释
PGHOST 要连接的主机名,当多个主机名时,以逗号分隔,按顺序尝试。 可以是存储套接字文件的绝对路径。当 host 未指定或为空时,默认行为是连接到 /tmp 中的域套接字或指定的任何套接字目录;没有套接字文件时,默认连接到 localhost。
PGHOSTADDR 要连接的主机的数字 IP 地址,多地址时用逗号隔开,支持IPV4/6,如果为空,则通过host解析IP地址,当 PQconnectPoll 第一次解析这个主机名时,可能会导致 PQconnectPoll 阻塞很长一段时间;如果指定hostaddr,没有指定host,则直接使用hostaddr,然而通过主机验证身份时,则会失败;如果host与hostaddr都指定,在不使用主机名验证身份的情况下,则会直接使用hostaddr,忽略host值
PGPORT 在服务器主机上连接的端口号,或 Unix 域连接的套接字文件扩展名。如果在 host 或 hostaddr 参数中给出了多个主机,则此参数可以指定与主机列表长度相同的以逗号分隔的端口列表,或者它可以指定要用于所有主机的单个端口号。一个空字符串,或逗号分隔列表中的一个空项,指定在构建 PostgreSQL 时建立的默认端口号。
PGDATABASE 数据库名称。默认与用户名相同。在某些情况下,会检查扩展格式的值
PGUSER 要连接的 PostgreSQL 用户名。默认与运行应用程序的操作系统用户的名称相同。
PGPASSWORD 服务器要求密码验证时使用的密码。出于安全原因,不建议使用此环境变量,因为某些操作系统允许非 root 用户通过 ps 查看进程环境变量;而是考虑使用密码文件
PGPASSFILE 指定用于存储密码的文件的名称。默认为 ~/.pgpass
PGCHANNELBINDING 此选项控制客户端对通道绑定的使用。 require 的设置意味着连接必须使用通道绑定,prefer 意味着客户端将选择通道绑定(如果可用),并且禁用阻止使用通道绑定。如果 PostgreSQL 使用 SSL 支持编译,则默认值是首选;否则默认为禁用。
PGSERVICE 用于附加参数的服务名称。它在 pg_service.conf 中指定一个服务名称,其中包含附加的连接参数。这允许应用程序仅指定服务名称,以便可以集中维护连接参数。连接服务文件允许将 libpq 连接参数与单个服务名称相关联。然后可以在 libpq 连接字符串中指定该服务名称,并使用相关设置。这允许修改连接参数,而无需重新编译使用 libpq 的应用程序。服务名称也可以使用 PGSERVICE 环境变量来指定。服务名称可以在每个用户的服务文件或系统范围的文件中定义。如果用户文件和系统文件中存在相同的服务名称,则用户文件优先。
PGSERVICEFILE 指定每用户连接服务文件的名称。如果未设置,默认情况下,每个用户的服务文件位于 ~/.pg_service.conf;这可以通过设置环境变量 PGSERVICEFILE 来覆盖。系统范围的文件名为 pg_service.conf。默认情况下,它在 PostgreSQL 安装的 etc 目录中查找(使用 pg_config --sysconfdir 来精确识别该目录)。可以通过设置环境变量 PGSYSCONFDIR 来指定另一个目录,但不能指定不同的文件名。
PGOPTIONS 指定在连接开始时发送到服务器的命令行选项。例如,将此设置为 -c geqo=off 会将会话的 geqo 参数值设置为 off。此字符串中的空格被视为分隔命令行参数,除非使用反斜杠 (\) 进行转义;写 \\ 来表示文字反斜杠。
PGAPPNAME 指定 application_name 配置参数的值。application_name 可以是任何少于 NAMEDATALEN 字符的字符串(标准构建中为 64 个字符)。它通常由应用程序在连接到服务器时设置。该名称将显示在 pg_stat_activity 视图中并包含在 CSV 日志条目中。它也可以通过 log_line_prefix 参数包含在常规日志条目中。 application_name 值中只能使用可打印的 ASCII 字符。其他字符将替换为问号 (?)。
PGSSLMODE 此选项确定是否或以何种优先级与服务器协商安全 SSL TCP/IP 连接。有六种模式:disable:只尝试非 SSL 连接;allow:首先尝试非 SSL 连接;如果失败,请尝试 SSL 连接;prefer (default):首先尝试 SSL 连接;如果失败,请尝试非 SSL 连接;require:只尝试 SSL 连接。如果存在根 CA 文件,则以与指定 verify-ca 相同的方式验证证书 ;verify-ca:仅尝试 SSL 连接,并验证服务器证书是否由受信任的证书颁发机构 (CA) 颁发;verify-full:仅尝试 SSL 连接,验证服务器证书是否由受信任的 CA 颁发,并且请求的服务器主机名与证书中的主机名匹配
PGREQUIRESSL 行为与 requiressl 连接参数相同。此环境变量已弃用,取而代之的是 PGSSLMODE 变量;如果设置为 1,则需要到服务器的 SSL 连接(这相当于 sslmode 要求)。如果服务器不接受 SSL 连接,libpq 将拒绝连接。如果设置为 0(默认),libpq 将与服务器协商连接类型(相当于 sslmode prefer)。仅当 PostgreSQL 使用 SSL 支持编译时,此选项才可用。
PGSSLCOMPRESSION 如果设置为 1,通过 SSL 连接发送的数据将被压缩。如果设置为 0,压缩将被禁用。默认值为 0。如果建立没有 SSL 的连接,则忽略此参数。SSL 压缩现在被认为是不安全的,不再推荐使用它。 OpenSSL 1.1.0 默认禁用压缩,许多操作系统发行版在之前的版本中也禁用了它,因此如果服务器不接受压缩,将此参数设置为 on 将没有任何效果。 PostgreSQL 14 在后端完全禁用压缩。如果安全不是主要问题,如果网络是瓶颈,压缩可以提高吞吐量。如果 CPU 性能是限制因素,则禁用压缩可以提高响应时间和吞吐量。
PGSSLCERT 此参数指定客户端 SSL 证书的文件名,替换默认的 ~/.postgresql/postgresql.crt。如果未建立 SSL 连接,则忽略此参数。
PGSSLKEY 此参数指定用于客户端证书的密钥的位置。它可以指定将使用的文件名而不是默认的 ~/.postgresql/postgresql.key,也可以指定从外部“引擎”获取的密钥(引擎是 OpenSSL 可加载模块)。外部引擎规范应由冒号分隔的引擎名称和特定于引擎的密钥标识符组成。如果未建立 SSL 连接,则忽略此参数。
PGSSLROOTCERT 此参数指定包含 SSL 证书颁发机构 (CA) 证书的文件的名称。如果文件存在,服务器的证书将被验证为由这些机构之一签名。默认为 ~/.postgresql/root.crt。
PGSSLCRL 此参数指定 SSL 服务器证书撤销列表 (CRL) 的文件名。此文件中列出的证书(如果存在)将在尝试验证服务器证书时被拒绝。如果 sslcrl 和 sslcrldir 均未设置,则此设置被视为 ~/.postgresql/root.crl。
PGSSLCRLDIR 此参数指定 SSL 服务器证书撤销列表 (CRL) 的目录名称。此目录中的文件中列出的证书(如果存在)将在尝试验证服务器证书时被拒绝。需要使用 OpenSSL 命令 openssl rehash 或 c_rehash 准备该目录。有关详细信息,请参阅其文档。sslcrl 和 sslcrldir 可以一起指定。
PGSSLSNI 感知 SSL 的代理可以使用服务器名称指示来路由连接,而无需解密 SSL 流。 (请注意,这需要一个知道 PostgreSQL 协议握手的代理,而不仅仅是任何 SSL 代理。)但是,SNI 使目标主机名以明文形式出现在网络流量中,因此在某些情况下它可能是不可取的。
PGREQUIREPEER 此参数指定服务器的操作系统用户名,例如 requirepeer=postgres。建立 Unix 域套接字连接时,如果设置了此参数,客户端会在连接开始时检查服务器进程是否以指定的用户名运行;如果不是,则连接因错误而中止。此参数可用于提供类似于 TCP/IP 连接上 SSL 证书可用的服务器身份验证。 (请注意,如果 Unix 域套接字位于 /tmp 或其他可公开写入的位置,则任何用户都可以在那里启动服务器侦听。使用此参数可确保您连接到受信任用户运行的服务器。)此选项是仅在实现对等身份验证方法的平台上支持。对等身份验证方法通过从内核获取客户端的操作系统用户名并将其用作允许的数据库用户名(带有可选的用户名映射)来工作。此方法仅在本地连接上受支持。对等身份验证仅在提供 getpeereid() 函数、SO_PEERCRED 套接字参数或类似机制的操作系统上可用。目前包括 Linux、大多数 BSD 风格,包括 macOS 和 Solaris。
PGSSLMINPROTOCOLVERSION 此参数指定允许连接的最低 SSL/TLS 协议版本。有效值为 TLSv1、TLSv1.1、TLSv1.2 和 TLSv1.3。支持的协议取决于所使用的 OpenSSL 版本,旧版本不支持最现代的协议版本。如果未指定,则默认为 TLSv1.2,它满足撰写本文时的行业最佳实践。
PGSSLMAXPROTOCOLVERSION 此参数指定允许连接的最大 SSL/TLS 协议版本。有效值为 TLSv1、TLSv1.1、TLSv1.2 和 TLSv1.3。支持的协议取决于所使用的 OpenSSL 版本,旧版本不支持最现代的协议版本。如果未设置,则忽略此参数,并且连接将使用后端定义的最大界限(如果设置)。设置最大协议版本主要用于测试或某些组件在使用较新协议时出现问题。
PGGSSENCMODE 此选项确定是否或以何种优先级与服务器协商安全 GSS TCP/IP 连接。共有三种模式:disable:只尝试非 GSSAPI 加密的连接;prefer (default):如果存在 GSSAPI 凭证(即在凭证缓存中),首先尝试 GSSAPI 加密连接;如果失败或没有凭据,请尝试非 GSSAPI 加密连接。这是使用 GSSAPI 支持编译 PostgreSQL 时的默认设置;require:只尝试 GSSAPI 加密的连接。Unix 域套接字通信忽略 gssencmode。如果 PostgreSQL 在不支持 GSSAPI 的情况下编译,则使用 require 选项将导致错误,而 prefer 将被接受,但 libpq 实际上不会尝试 GSSAPI 加密的连接。
PGKRBSRVNAME 使用 GSSAPI 进行身份验证时使用的 Kerberos 服务名称。这必须与服务器配置中指定的服务名称匹配,才能使 Kerberos 身份验证成功。 默认值通常是 postgres,但可以在构建 PostgreSQL 时通过 configure 的 --with-krb-srvnam 选项进行更改。在大多数环境中,永远不需要更改此参数。某些 Kerberos 实现可能需要不同的服务名称,例如要求服务名称为大写 (POSTGRES) 的 Microsoft Active Directory。
PGGSSLIB 用于 GSSAPI 身份验证的 GSS 库。目前,这被忽略,除了同时包含 GSSAPI 和 SSPI 支持的 Windows 版本。在这种情况下,将此设置为 gssapi 以使 libpq 使用 GSSAPI 库而不是默认的 SSPI 进行身份验证。
PGCONNECT_TIMEOUT 连接时等待的最长时间,以秒为单位(写为十进制整数,例如 10)。零、负数或未指定意味着无限期等待。允许的最小超时为 2 秒,因此值 1 被解释为 2。此超时分别适用于每个主机名或 IP 地址。例如指定两台主机,connect_timeout 为 5,如果 5 秒内没有建立连接,每台主机都会超时,因此等待连接的总时间可能长达 10 秒。
PGCLIENTENCODING 这会为此连接设置 client_encoding 配置参数。除了相应服务器选项接受的值之外,您还可以使用 auto 从客户端的当前语言环境中确定正确的编码(Unix 系统上的 LC_CTYPE 环境变量)。
PGTARGETSESSIONATTRS 此选项确定会话是否必须具有某些属性才能被接受。它通常与多个主机名结合使用,以在多个主机中选择第一个可接受的替代方案。有六种模式:any (default):任何成功的连接都是可以接受的;read-write:session 必须默认接受读写事务(即服务器不能处于热备模式且default_transaction_read_only参数必须关闭);read-only:默认情况下,会话不得接受读写事务(反之亦然);primary:服务器不得处于热备用模式;standby:服务器必须处于热备模式;prefer-standby:首先尝试找到备用服务器,但如果列出的主机都不是备用服务器,请在任何模式下重试

 

以下环境变量可用于指定每个 PostgreSQL 会话的默认行为。 (另请参阅 ALTER ROLEALTER DATABASE 命令,了解在每个用户或每个数据库的基础上设置默认行为的方法。)

  • PGD​​ATESTYLE 设置日期/时间表示的默认样式。 (相当于 SET datestyle TO …)

  • PGTZ sets the default time zone. (Equivalent to SET timezone TO …)

  • PGGEQO 设置遗传查询优化器的默认模式。 (相当于 SET geqo TO …)

有关这些环境变量的正确值的信息,请参阅 SQL 命令 SET

以下环境变量决定了 libpq 的内部行为;它们覆盖编译的默认值。

  • PGSYSCONFDIR 设置包含 pg_service.conf 文件的目录,在未来的版本中可能还有其他系统范围的配置文件。

  • PGLOCALEDIR 设置包含用于消息本地化的语言环境文件的目录。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论