Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

32.1. 数据库连接控制函数 #

32.1.1. 连接字符串
32.1.2. 参数关键字

以下函数用于连接到 PostgreSQL 后端服务器。应用程序可以同时建立多个后端连接。(这样做的一项原因是为了访问多个数据库。)每个连接都由 PGconn 对象表示,该对象通过函数 PQconnectdbPQconnectdbParamsPQsetdbLogin 获取。请注意,除非甚至没有足够的内存来分配 PGconn 对象,否则,这些函数始终会返回一个非空对象指针。PQstatus 函数应被调用以在通过连接对象发送查询之前,检查返回值是否为成功连接。

警告

如果有不受信任的用户可以访问尚未采用 安全模式使用模式 的数据库,请在每个会话开始时,从 search_path 中移除可供公众写入的模式。可以将参数关键字 options 设置为值 -csearch_path=。或者,可以在连接后发出 PQexec(conn, "SELECT pg_catalog.set_config('search_path', '', false)")。这种考虑不特定于 libpq;它适用于执行任意 SQL 命令的每个接口。

警告

在 Unix 上,使用开启的 libpq 连接派生进程会产生不可预测的结果,因为父进程和子进程共享相同的套接字和操作系统资源。因此,不建议这样使用,尽管从子进程执行一个 exec 以加载一个新可执行文件是安全的。

PQconnectdbParams #

新建到数据库服务器的连接。

PGconn *PQconnectdbParams(const char * const *keywords,
                          const char * const *values,
                          int expand_dbname);

此函数使用从两个 NULL 终止的数组中获取的参数打开一个新的数据库连接。第一个 keywords 定义为一种字符串数组,其中每一个都是一个关键字。第二个 values 为每个关键字提供值。与下面的 PQsetdbLogin 不同,参数设置可在不更改函数签名的情况下得到扩展,因此,首选将此函数(或其非阻塞类似项 PQconnectStartParamsPQconnectPoll)用于新的应用程序编程。

当前识别的参数关键字列在第 32.1.2 节中。

为了使用所有默认参数,传递的数组可以为空,也可以包含一个或多个参数设置。这些参数的长度必须相匹配。处理会在 keywords 数组中的第一个 NULL 条目处停止。此外,如果与非 NULL keywords 条目关联的 values 条目为 NULL 或空字符串,那么将忽略该条目,并继续处理下一组数组条目。

expand_dbname 为非零时,将检查用于第一个 dbname 关键字的值,以查看其是否是一个 连接字符串。如果它是,那么将使用从字符串提取的各个连接参数将其 扩展 到各个连接参数中。如果值中包含一个等号 (=) 或以 URI 方案标志符开头,则该值将被视为一个连接字符串,而不仅仅是一个数据库名。(连接字符串格式的更多详细信息出现在 第 32.1.1 节中。)仅第一个出现的 dbname 将以这种方式进行对待;任何随后的 dbname 参数都将被视为一个普通的数据库名进行处理。

总的来说,参数数组会从开始到结束进行处理。如果任何关键字重复出现,则将使用最后一个值(不是 NULL 或空的值)。当连接字符串中发现的关键字与 keywords 数组中出现的关键字冲突时,此规则尤其适用。因此,程序员可以确定数组条目是否可以覆盖或被连接字符串中的值覆盖。在 dbname 条目扩展之前出现的数组条目可以通过连接字符串字段覆盖,而这些字段又会被 dbname 之后出现的数组条目覆盖(但前提是这些条目提供非空值)。

处理所有数组条目及任何扩展连接字符串之后,所有仍未设置的连接参数均填充为默认值。如果已设置未设置参数的相应环境变量(见 第 32.15 节),则使用其值。如果未设置环境变量,则使用参数的内置默认值。

PQconnectdb #

新建到数据库服务器的连接。

PGconn *PQconnectdb(const char *conninfo);

该函数使用从字符串 conninfo 中获取的参数打开一个新的数据库连接。

传递的字符串可以为空,以使用所有默认参数,或者它可以包含一个或多个由空格分隔的参数设置,或者它可以包含一个URI。有关详情,请参阅 第 32.1.1 节

PQsetdbLogin #

新建到数据库服务器的连接。

PGconn *PQsetdbLogin(const char *pghost,
                     const char *pgport,
                     const char *pgoptions,
                     const char *pgtty,
                     const char *dbName,
                     const char *login,
                     const char *pwd);

这是 PQconnectdb 的前身,具有固定的一组参数。它具有相同的功能,不同之处在于缺失的参数将始终采用默认值。对于要设置为默认值的所有固定参数,请写入 NULL 或空字符串。

如果 dbName 包含 = 符号或具有有效的连接URI前缀,则它将被视为一个 conninfo 字符串,与将其传递给 PQconnectdb 的方式完全相同,然后将剩余参数根据 PQconnectdbParams 的说明进行应用。

pgtty 不再使用,传递的任何值都将被忽略。

PQsetdb #

新建到数据库服务器的连接。

PGconn *PQsetdb(char *pghost,
                char *pgport,
                char *pgoptions,
                char *pgtty,
                char *dbName);

这是一个宏,它为 loginpwd 参数调用 PQsetdbLogin,其中包含空指针。它是为了向后兼容非常旧的程序。

PQconnectStartParams
PQconnectStart
PQconnectPoll #

以非阻塞方式连接到数据库服务器。

PGconn *PQconnectStartParams(const char * const *keywords,
                             const char * const *values,
                             int expand_dbname);

PGconn *PQconnectStart(const char *conninfo);

PostgresPollingStatusType PQconnectPoll(PGconn *conn);

这三个函数用于打开与数据库服务器的连接,目的是在执行此操作时,应用程序的执行线程不会被远端 I/O 阻塞。这种方式的目的是,等待 I/O 完成的操作发生在应用程序的主循环中,而不是在 PQconnectdbParamsPQconnectdb 中,以便应用程序可以与其他活动并行处理此操作。

使用 PQconnectStartParams,将使用从 keywordsvalues 数组中获取的参数建立数据库连接,并受 expand_dbname 控制,如上述 PQconnectdbParams 所述。

使用 PQconnectStart,将使用从字符串 conninfo 中获取的参数建立数据库连接,如上述 PQconnectdb 所述。

只要满足一些限制,PQconnectStartParamsPQconnectStartPQconnectPoll 都不会阻塞

  • 必须适当地使用 hostaddr 参数,以避免进行 DNS 查询。有关此参数的详细信息,请参阅 第 32.1.2 节 中的文档。

  • 如果您调用 PQtrace,请确保跟踪到的流对象不会阻塞。

  • 您必须在调用 PQconnectPoll 之前确保套接字处于适当的状态,如下所述。

要开始一个非阻塞连接请求,请调用 PQconnectStartPQconnectStartParams。如果结果为 null,则 libpq 无法分配一个新的 PGconn 结构。否则,会返回一个有效的 PGconn 指针(虽然它还不表示与数据库的有效连接)。接下来调用 PQstatus(conn)。如果结果为 CONNECTION_BAD,那么连接尝试已经失败,通常是因为连接参数无效。

如果 PQconnectStartPQconnectStartParams 成功,下一步是对 libpq 进行轮询以便其能继续连接序列。使用 PQsocket(conn) 获得基础数据库连接的套接字的描述符。(谨慎:不要假设套接字在 PQconnectPoll 调用时保持不变。)因此进行循环:如果 PQconnectPoll(conn) 上次返回 PGRES_POLLING_READING,则一直等到套接字准备读取(由 select()poll() 或类似系统函数指示)。请注意,如果系统上提供了 select(2)poll(2)PQsocketPoll 可通过抽取设置来帮助减少样板文件。然后再次调用 PQconnectPoll(conn)。相反,如果 PQconnectPoll(conn) 上次返回 PGRES_POLLING_WRITING,则一直等到套接字准备写入,然后再次调用 PQconnectPoll(conn)。在第一次迭代(即如果你尚未调用 PQconnectPoll)中,请像其上次返回 PGRES_POLLING_WRITING 一样行事。继续此循环,直到 PQconnectPoll(conn) 返回 PGRES_POLLING_FAILED(指示连接过程已失败)或返回 PGRES_POLLING_OK(指示连接已成功建立)。

在连接期间的任何时候,都可以通过调用 PQstatus 检查连接状态。如果此调用返回 CONNECTION_BAD,则连接过程失败;如果调用返回 CONNECTION_OK,则连接准备就绪。以上述所述 PQconnectPoll 的返回值可以等量地检测到这两种状态。在异步连接过程中(且只在该过程中),也可能出现其他状态。这些状态可指示连接过程的当前阶段,并且可能可用于向用户提供反馈,例如,这些状态是

CONNECTION_STARTED #

正在等待建立连接。

CONNECTION_MADE #

连接正常;正在等待发送。

CONNECTION_AWAITING_RESPONSE #

正在等待服务器的响应。

CONNECTION_AUTH_OK #

已收到身份验证;正在等待后端启动完成。

CONNECTION_SSL_STARTUP #

正在协商 SSL 加密。

CONNECTION_GSS_STARTUP #

正在协商 GSS 加密。

CONNECTION_CHECK_WRITABLE #

检查连接是否能够处理写事务。

CONNECTION_CHECK_STANDBY #

检查连接是否连接到处于备用模式的服务器。

CONNECTION_CONSUME #

处理连接上所有剩余的响应消息。

请注意,尽管这些常量将保留(为了保持兼容性),但应用程序切勿依赖于这些常量按特定顺序(或按任意顺序)发生,也切勿依赖于状态始终为这些记录值之一。应用程序可以执行类似于以下操作

switch(PQstatus(conn))
{
        case CONNECTION_STARTED:
            feedback = "Connecting...";
            break;

        case CONNECTION_MADE:
            feedback = "Connected to server...";
            break;
.
.
.
        default:
            feedback = "Connecting...";
}

使用 PQconnectPoll 时,忽略 connect_timeout 连接参数;应用程序负责决定是否过了过长的时间。否则,PQconnectStart 后跟 PQconnectPoll 循环等效于 PQconnectdb

请注意,当 PQconnectStartPQconnectStartParams 返回一个非空指针时,在使用完指针后必须调用 PQfinish 以处置结构体和任何关联的内存块。即使连接尝试失败或被终止,也必须执行此操作。

PQsocketPoll #

轮询使用 PQsocket 检索的连接基础套接字描述符。此函数的主要用途是遍历 PQconnectStartParams 文档中介绍的连接序列。

typedef pg_int64 pg_usec_time_t;

int PQsocketPoll(int sock, int forRead, int forWrite,
                 pg_usec_time_t end_time);

此函数会轮询一个文件描述符(可以带超时设置)。如果 forRead 为非零,则当套接字可供读取时,函数将终止。如果 forWrite 为非零,则当套接字可供写入时,函数将终止。

超时由end_time指定,它是在 Unix 时间戳(即time_t乘以 100 万)后停止等待的时间数(以微秒为单位)。如果end_time-1,则超时时间为无限。如果 end_time 为 0(或实际上是任何时间,只要在当前时间之前),那么超时时间为立即(无阻塞)。可以通过将所需的微秒数添加到PQgetCurrentTimeUSec 的结果中来方便地计算超时值。请注意,底层系统调用可能精确度低于微秒,因此实际延迟可能不准确。

如果满足指定条件,该函数将返回大于0 的值;如果发生超时,则返回0;如果出错,则返回-1。可以通过检查errno(3) 值来检索错误。在forReadforWrite 同时为零时,该函数将立即返回超时指示。

PQsocketPoll 使用 poll(2)select(2)(取决于平台)实现。请参阅poll(2)中的POLLINPOLLOUT,或select(2)中的readfdswritefds,以了解更多信息。

PQconndefaults #

返回默认连接选项。

PQconninfoOption *PQconndefaults(void);

typedef struct
{
    char   *keyword;   /* The keyword of the option */
    char   *envvar;    /* Fallback environment variable name */
    char   *compiled;  /* Fallback compiled in default value */
    char   *val;       /* Option's current value, or NULL */
    char   *label;     /* Label for field in connect dialog */
    char   *dispchar;  /* Indicates how to display this field
                          in a connect dialog. Values are:
                          ""        Display entered value as is
                          "*"       Password field - hide value
                          "D"       Debug option - don't show by default */
    int     dispsize;  /* Field size in characters for dialog */
} PQconninfoOption;

返回连接选项数组。可用于确定所有可能的PQconnectdb 选项及其当前默认值。返回值指向PQconninfoOption 结构的数组,该数组以具有空keyword 指针的条目结尾。如果无法分配内存,则返回空指针。请注意,当前默认值(val 字段)将取决于环境变量和其他上下文。将忽略缺少或无效的服务文件。调用方必须将连接选项数据视为只读。

处理选项数组后,通过将其传递给PQconninfoFree 来释放。如果不执行此操作,那么每次调用PQconndefaults 都会泄漏少量内存。

PQconninfo #

返回活动连接所使用的连接选项。

PQconninfoOption *PQconninfo(PGconn *conn);

返回连接选项数组。这可用于确定所有可能的 PQconnectdb 选项以及用于连接到服务器的值。返回值指向 PQconninfoOption 结构的数组,其以一个具有空 keyword 指针的条目结尾。对于 PQconndefaults 的所有上述说明也适用于 PQconninfo 的结果。

PQconninfoParse #

从提供的连接字符串返回已解析的连接选项。

PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);

解析连接字符串并返回所得选项作为数组;或在连接字符串出现问题时返回 NULL。该函数可用于提取提供的连接字符串中的 PQconnectdb 选项。返回值指向 PQconninfoOption 结构的数组,其以一个具有空 keyword 指针的条目结尾。

所有合法选项都将在结果数组中出现,但连接字符串中不存在的任何选项的 PQconninfoOption 将使 val 设置为 NULL;不会插入默认值。

如果 errmsg 不为 NULL,则 *errmsg 在成功时将被设置为 NULL,否则被设置为解释该问题的一个 malloc'd 错误字符串。(也有可能 *errmsg 被设置为 NULL 且函数返回 NULL;这表明内存不足。)

处理选项数组后,通过将其传递给 PQconninfoFree 来释放该数组。如果没有这样做,则对于 PQconninfoParse 的每次调用,都会泄露一些内存。相反,如果出错并且 errmsg 不为 NULL,请务必使用 PQfreemem 释放错误字符串。

PQfinish #

关闭与服务器的连接。还释放 PGconn 对象所使用的内存。

void PQfinish(PGconn *conn);

请注意,即使服务器连接尝试失败(如 PQstatus 所示),应用程序也应该调用 PQfinish 释放 PGconn 对象使用的内存。在调用了 PQfinish 之后,PGconn 指针不得再次使用。

PQreset #

重置与服务器的通信通道。

void PQreset(PGconn *conn);

该函数会关闭与服务器的连接并尝试建立一个新连接,使用此前使用的所有相同参数。如果工作连接中断,这对于错误修复可能很有用。

PQresetStart
PQresetPoll #

以非阻塞的方式重置与服务器的通信通道。

int PQresetStart(PGconn *conn);

PostgresPollingStatusType PQresetPoll(PGconn *conn);

这些函数会关闭与服务器的连接并尝试建立一个新连接,使用此前使用的所有相同参数。如果工作连接中断,这对于错误修复可能很有用。它们与上述 PQreset 的不同之处在于,它们以非阻塞的方式起作用。这些函数受到与 PQconnectStartParamsPQconnectStartPQconnectPoll 相同的限制。

要启动连接重置,请调用 PQresetStart。如果它返回 0,则重置失败。如果它返回 1,则使用 PQresetPoll 轮询重置,其方式与使用 PQconnectPoll 创建连接时完全相同。

PQpingParams #

PQpingParams 报告服务器状态。它接受与 PQconnectdbParams 完全相同的连接参数,如上所述。获取服务器状态无需提供正确的用户名、密码或数据库名称值;但是,如果提供了不正确的参数,服务器将记录一个连接尝试失败。

PGPing PQpingParams(const char * const *keywords,
                    const char * const *values,
                    int expand_dbname);

该函数返回以下值之一

PQPING_OK #

服务器正在运行,并且似乎正在接受连接。

PQPING_REJECT #

服务器正在运行,但是处于不允许连接的状态(启动、关闭或崩溃恢复)。

PQPING_NO_RESPONSE #

无法连接服务器。这可能表明服务器未运行,或者给定的连接参数有问题(例如,端口号错误),或者存在网络连接问题(例如,防火墙阻止了连接请求)。

PQPING_NO_ATTEMPT #

未尝试连接服务器,因为提供的参数明显不正确,或者存在某些客户端问题(例如,内存不足)。

PQping #

PQping 报告服务器状态。它接受与上面描述的 PQconnectdb 相同的连接参数。无需提供正确的用户名、密码或数据库名称值即可获取服务器状态;但是,如果提供了不正确的值,服务器将记录失败的连接尝试。

PGPing PQping(const char *conninfo);

返回值与 PQpingParams 相同。

PQsetSSLKeyPassHook_OpenSSL #

PQsetSSLKeyPassHook_OpenSSL 允许应用程序使用 默认处理加密客户端证书密钥文件 或交互式提示,覆盖 libpqsslpassword

void PQsetSSLKeyPassHook_OpenSSL(PQsslKeyPassHook_OpenSSL_type hook);

应用程序传递一个具有签名回调函数的指针

int callback_fn(char *buf, int size, PGconn *conn);

然后,libpq 将调用它而不是其默认 PQdefaultSSLKeyPassHook_OpenSSL 处理程序。回调函数应确定密钥的密码,并将其复制到大小为 size 的结果缓冲区 bufbuf 中的字符串必须以 null 结尾。回调函数必须返回存储在 buf 中的密码的长度(不包括 null 结尾符)。如果失败,回调函数应设置 buf[0] = '\0' 并返回 0。有关示例,请参阅 libpq 源代码中的 PQdefaultSSLKeyPassHook_OpenSSL

如果用户指定了显式密钥位置,当调用回调函数时,其路径将在 conn->sslkey 中。如果使用默认密钥路径,则此处将为空。对于引擎说明符密钥,是否使用 OpenSSL 密码回调函数或定义自己的处理方式由引擎实现决定。

应用程序回调可以选择委托 PQdefaultSSLKeyPassHook_OpenSSL 处理未处理的情况,或先调用它,如果它返回 0 则尝试其他操作,或完全覆盖它。

回调 绝不能 使用异常、longjmp(...) 等来转义正常的流控制。它必须正常返回。

PQgetSSLKeyPassHook_OpenSSL #

PQgetSSLKeyPassHook_OpenSSL 返回当前客户端证书密钥密码钩子,如果没有设置任何密码钩子,则返回 NULL

PQsslKeyPassHook_OpenSSL_type PQgetSSLKeyPassHook_OpenSSL(void);

32.1.1. 连接字符串 #

几个 libpq 函数分析用户指定的字符串以获取连接参数。这些字符串有两种接受的格式:简单的关键字/值字符串和 URI。URI 通常遵循 RFC 3986,但多主机连接字符串除外,如下所述。

32.1.1.1. 关键字/值连接字符串 #

在关键字/值格式中,每个参数设置的格式为 关键字 = ,设置之间有空格。设置的等号周围的空格是可选的。要编写空值或包含空格的值,请用单引号将其引起来,例如 关键字 = '值'。值中的单引号和反斜杠必须用反斜杠转义,即 \'\\

示例

host=localhost port=5432 dbname=mydb connect_timeout=10

已识别的参数关键字列于 第 32.1.2 节

32.1.1.2. 连接 URI #

连接的一般形式为URIis

postgresql://[userspec@][hostspec][/dbname][?paramspec]

where userspec is:

user[:password]

and hostspec is:

[host][:port][,...]

and paramspec is:

name=value[&...]

TheURIscheme designator can be either postgresql:// or postgres://. Each of the remainingURIparts is optional. The following examples illustrate validURIsyntax

postgresql://
postgresql://127.0.0.1
postgresql://127.0.0.1:5433
postgresql://127.0.0.1/mydb
postgresql://user@localhost
postgresql://user:secret@localhost
postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp
postgresql://host1:123,host2:456/somedb?target_session_attrs=any&application_name=myapp

Values that would normally appear in the hierarchical part of theURIcan alternatively be given as named parameters. For example

postgresql:///mydb?host=localhost&port=5433

All named parameters must match key words listed in 第 32.1.2 节,但为了与 JDBC 连接保持兼容,URIs 的实例 ssl=true 被转换为 sslmode=require

连接URI如果其任何部分中包含具有特殊含义的符号,则需要使用 百分号编码 进行编码。以下是一个示例,其中等号 (=) 被 %3D 替换,空格字符被 %20 替换

postgresql://user@localhost:5433/mydb?options=-c%20synchronous_commit%3Doff

主机部分可以是主机名或 IP 地址。要指定 IPv6 地址,请将其括在方括号中

postgresql://[2001:db8::1234]/database

如对参数 host 所述,主机部分将被解释。特别是,如果主机部分为空或看起来像绝对路径名,则会选择 Unix 域套接字连接,否则会启动 TCP/IP 连接。但是,请注意斜杠是 URI 分层部分中保留的字符。因此,要指定非标准 Unix 域套接字目录,请忽略 URI 的主机部分并指定 host 作为命名参数,或对 URI 主机部分中的路径进行百分比编码

postgresql:///dbname?host=/var/lib/postgresql
postgresql://%2Fvar%2Flib%2Fpostgresql/dbname

可以在单个 URI 中指定多个主机组件,每个组件都具有一个可选的端口组件。形式为 postgresql://host1:port1,host2:port2,host3:port3/ 的 URI 等效于形式为 host=host1,host2,host3 port=port1,port2,port3 的连接字符串。如下文所述,每个主机将被依次尝试,直至成功建立连接。

32.1.1.3. 指定多个主机 #

可以指定要连接的多个主机,以便按给定顺序尝试。在关键词/值格式中,hosthostaddrport 选项接受以逗号分隔的值列表。在指定的每个选项中必须给定的元素数量必须相同,例如第一个 hostaddr 对应于第一个主机名,第二个 hostaddr 对应于第二个主机名,依此类推。作为例外,如果仅指定了一个 port,它适用于所有主机。

在连接 URI 格式中,可以列出多个 host:port 对,由 URI 的 host 组件中的逗号分隔。

在这两种格式中,一个主机名可以转换为多个网络地址。这方面的一个常见示例是既有 IPv4 又有 IPv6 地址的主机。

当指定了多个主机或单个主机名被转换为多个地址时,所有主机和地址将按顺序尝试,直至有一个成功。如果无法访问任何主机,则连接失败。如果成功建立连接,但身份验证失败,则不会尝试列表中的其余主机。

如果使用了密码文件,那么不同主机可以使用不同的密码。对于列表中的每个主机,其他所有连接选项都是相同的;例如,无法为不同的主机指定不同的用户名。

32.1.2. 参数关键字 #

目前识别的参数关键字是

host #

要连接到的主机的名称。 如果一个主机名看上去像一个绝对路径名,那么它指定 Unix-domain 通信,而不是 TCP/IP 通信;该值是存储套接字文件的目录的名称。(在 Unix 上,一个绝对路径名以斜线开头。在 Windows 上,以驱动器字母开头的路径也被识别。)如果主机名以 @ 开头,那么它被视作抽象命名空间中的 Unix-domain 套接字(目前在 Linux 和 Windows 上受支持)。当未指定 host 或者该值为空时,默认行为是在 /tmp(或 PostgreSQL 构建时指定的任何套接字目录)中连接到 Unix-domain 套接字。在 Windows 上,默认连接到 localhost

还接受主机名以逗号分隔的列表,在这种情况下,列表中的每个主机名都将按顺序尝试;列表中的空项选择如上所示的默认行为。有关详细信息,请参阅 第 32.1.1.3 节

hostaddr #

要连接到的主机的数字 IP 地址。这应采用标准的 IPv4 地址格式,例如 172.28.40.9。如果您的机器支持 IPv6,您还可以使用那些地址。当非空字符串被指定为此参数时,TCP/IP 通信总是被使用。如果未指定此参数,将查找 host 的值以找到相应的 IP 地址——或者,如果 host 指定了一个 IP 地址,该值将直接使用。

使用 hostaddr 允许应用程序避免主机名查找,在有时间约束的应用程序中,这可能很重要。但是,主机名对于 GSSAPI 或 SSPI 身份验证方法,以及 verify-full SSL 证书验证都是必需的。使用以下规则

  • 如果指定了 host 而未指定 hostaddr,则会执行主机名查找。(当使用 PQconnectPoll 时,该查找将在 PQconnectPoll 首次考虑该主机名时发生,它可能导致 PQconnectPoll 阻塞大量时间。)

  • 如果指定了 hostaddr 而没有指定 hosthostaddr 的值会给出服务器网络地址。如果认证方法要求提供主机名,会连接尝试会失败。

  • 如果指定了 hosthostaddrhostaddr 的值会给出服务器网络地址。host 的值会被忽略,除非验证方法需要,在这种情况下它会被用作主机名。

请注意,如果 host 不是网络地址 hostaddr 的服务器名称,认证很可能会失败。此外,当同时指定 hosthostaddr 时,host 会用于在密码文件中标识连接(请参阅 第 32.16 节)。

逗号分隔的 hostaddr 值的列表也可以被接受,在这种情况下列表中的每个主机都会被按顺序尝试。列表中的一个空项会让对应的主机名会被使用,如果那个也为空,那默认主机名会使用。详细信息请参阅 第 32.1.1.3 节

如果没有主机名或主机地址,libpq 将使用本地 Unix 域套接字连接;或者在 Windows 中,它将尝试连接到 localhost

port #

用于连接到服务器主机的端口号,或用于 Unix 域连接的套接字文件的后缀名。如果在 hosthostaddr 参数中指定了多个主机,则此参数可以指定一个与主机列表长度相同的逗号分隔的端口列表,或者可以指定一个要在所有主机中使用的单个端口号。一个空字符串或一个逗号分隔列表中的一个空项目,则指定了在构建 PostgreSQL 时建立的默认端口号。

dbname #

数据库名称。默认为与用户名相同。在某些情况下,会检查值的扩展格式;有关这些格式的更多详细信息,请参阅 第 32.1.1 节

user #

PostgreSQL 连接时使用的用户名。默认为正在运行应用程序的用户操作系统名。

password #

如果服务器要求密码认证时使用的密码。

passfile #

指定用于存储密码的文件名称(请参阅 第 32.16 节)。默认为 ~/.pgpass,或 Microsoft Windows 上的 %APPDATA%\postgresql\pgpass.conf。(如果此文件不存在,则不会报告错误。)

require_auth #

指定客户端要求服务器使用的认证方法。如果服务器未使用要求的方法认证客户端,或者服务器未完全完成认证握手,则连接将失败。还可以提供一个由逗号分隔的方法列表,其中服务器必须仅使用其中之一才能使连接成功。默认情况下,接受任何认证方法,并且服务器可以完全跳过认证。

可以使用添加 ! 前缀的方法应用否定,在这种情况下,服务器不能 尝试列出的方法;接受任何其他方法,并且服务器可以自由地根本不认证客户端。如果提供了由逗号分隔的列表,则服务器不能 尝试任何列出的否定方法。否定和非否定形式不能在同一设置中结合。

作为最后一个特殊情况,none 方法要求服务器不使用认证挑战。(也可以对它应用否定,以要求某种形式的认证。)

可以指定以下方法

password

服务器必须请求纯文本密码认证。

md5

服务器必须请求 MD5 哈希密码认证。

gss

服务器必须通过这两种方式请求 Kerberos 握手GSSAPI或创建GSS-已加密通道(另请参阅 gssencmode)。

sspi

服务器必须请求 WindowsSSPI认证。

scram-sha-256

服务器必须与客户端成功完成 SCRAM-SHA-256 认证交换。

none

服务器不能提示客户端进行认证交换。(这不禁止通过 TLS 进行客户端证书认证,也不禁止通过其加密传输进行 GSS 认证。)

channel_binding #

此选项控制客户端使用通道绑定的方式。设置为 require 表示连接必须使用通道绑定,设置为 prefer 表示如果可用,客户端将选择通道绑定,而 disable 则防止使用通道绑定。如果是搭配 SSL 支持编译的 PostgreSQL,则默认值为 prefer。否则,默认值为 disable

通道绑定是服务器向自身验证客户端的一种方法。仅在搭配使用 SCRAM 认证方法的 PostgreSQL 11 或更高版本服务器时才通过 SSL 连接支持。

connect_timeout #

连接时最长等待时间(以秒为单位,用十进制整数方式编写,例如 10)。零、负数或未指定表示无限期等待。此超时适用于每个主机名或 IP 地址。例如,如果指定两个主机且 connect_timeout 为 5,则如果在 5 秒内未建立任何连接,每个主机都将超时,因此等待连接所花费的总时间可能长达 10 秒。

client_encoding #

此选项为该连接设置 client_encoding 配置参数。除了相应服务器选项接受的值,您还可以将 auto 用来从客户端当前位置信息确定正确的编码(在 Unix 系统上的 LC_CTYPE 环境变量)。

options #

规定连接启动时要发送给服务器的命令行选项。例如,将此项设置为 -c geqo=off--geqo=off 将会话的 geqo 参数值设置为 off。此字符串中的空格被视为分隔命令行参数,除非使用反斜杠 (\) 转义。编写 \\ 来表示一个实际的反斜杠。有关可用选项的详细说明,请参考 第 19 章

application_name #

规定 application_name 配置参数的数值。

fallback_application_name #

application_name 配置参数指定一个后备值。此值将使用,如果未通过连接参数或 PGAPPNAME 环境变量为 application_name 提供值。为通用实用程序指定一个后备名称很有用,通用实用程序希望设置一个默认的应用程序名称,但允许用户覆盖它。

keepalives #

控制是否使用客户端 TCP keepalive。默认值为 1(启用),但如果你不希望使用 keepalive,你可以将此值更改为 0(禁用)。通过 Unix 域套接字建立的连接将忽略此参数。

keepalives_idle #

控制在 TCP 向服务器发送 keepalive 消息之前应经过多少秒的非活动时间。零值使用系统默认值。通过 Unix 域套接字建立的连接或禁用 keepalive 时,将忽略此参数。它仅在提供 TCP_KEEPIDLE 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上,它没有效果。

keepalives_interval #

控制服务器未确认 TCP keepalive 消息后应在多少秒后重新传输该消息。零值使用系统默认值。通过 Unix 域套接字建立的连接或禁用 keepalive 时,将忽略此参数。它仅在提供 TCP_KEEPINTVL 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上,它没有效果。

keepalives_count #

控制在客户端与服务器的连接被视作死连接之前,可以丢失多少个 TCP keepalive。零值使用系统默认值。通过 Unix 域套接字建立的连接或禁用 keepalive 时,将忽略此参数。它仅在提供 TCP_KEEPCNT 或等效套接字选项的系统上受支持;在其他系统上,它没有效果。

tcp_user_timeout #

控制强制关闭连接前,已传输的数据可以保持未确认状态的毫秒数。值为零时将使用系统默认值。对于通过 Unix 域套接字建立的连接将忽略此参数。仅支持 TCP_USER_TIMEOUT 可用的系统;在其他系统上,它不起作用。

replication #

此选项确定连接是否应使用复制协议而不是普通协议。这是 PostgreSQL 复制连接以及 pg_basebackup 等工具在内部使用的方法,但也可以由第三方应用程序使用。有关复制协议的说明,请参阅 第 53.4 节

支持以下不区分大小写的值

true, on, yes, 1

连接进入物理复制模式。

database

连接进入逻辑复制模式,连接到 dbname 参数中指定的数据库。

false, off, no, 0

连接是正常连接,这是默认行为。

在物理或逻辑复制模式下,只能使用简单的查询协议。

gssencmode #

此选项确定是否以及以何优先级与服务器协商安全GSSTCP/IP 连接。有三种模式

disable

仅尝试非GSSAPI-加密的连接

prefer(默认值)

如果有GSSAPI凭据(即存在凭据缓存中),首先尝试GSSAPI-加密的连接;如果失败或没有凭据,则尝试非GSSAPI-加密的连接。当 PostgreSQL 已使用GSSAPI支持编译时,这是默认值。

require

仅尝试GSSAPI-加密的连接

gssencmode 会忽略 Unix 域套接字通信。如果 PostgreSQL 是在没有 GSSAPI 支持的情况下编译的,则使用 require 选项将导致出现错误,而 prefer 将被接受,但 libpq 实际上不会尝试GSSAPI-加密的连接。

sslmode #

此选项确定是否以及以何优先级与服务器协商安全SSL将与服务器协商 TCP/IP 连接。有六种模式

disable

仅尝试非SSL连接

允许

先尝试非SSL连接;如果失败,请尝试SSL连接

prefer(默认值)

先尝试SSL连接;如果失败,请尝试非SSL连接

require

仅尝试SSL连接。如果存在根 CA 文件,请像指定 verify-ca 一样验证证书

verify-ca

仅尝试SSL连接,并验证服务器证书是由受信任的证书颁发机构颁发的 (CA)

verify-full

仅尝试SSL连接,验证服务器证书是由受信任的颁发的CA并且请求的服务器主机名与其在证书中的主机名匹配

请参阅第 32.19 节,了解有关这些选项如何工作的详细说明。

对于 Unix 域套接字通信,将忽略 sslmode。如果在没有 SSL 支持的情况下编译 PostgreSQL,则使用选项 requireverify-caverify-full 将导致错误,而选项 allowprefer 将被接受,但 libpq 实际上不会尝试SSL连接。

请注意,如果GSSAPI可能采用加密,则将优先使用加密SSL加密,而不管 sslmode 的值如何。若要在具有正常工作SSL基础设施(例如 Kerberos 服务器)的环境中强制使用GSSAPI加密,还需将 gssencmode 设置为 disable

requiressl #

该选项已弃用,建议使用 sslmode 设置。

如果设置为 1,则SSL需要连接到服务器(这等效于 sslmode require)。如果不接受SSL连接,则 libpq 将拒绝连接。如果设置为 0(默认值),则 libpq 将与服务器协商连接类型(等效于 sslmode prefer)。仅当使用 SSL 支持编译 PostgreSQL 时,此选项才可用。

sslnegotiation #

该选项控制在使用 SSL 时的 SSL 加密与服务器协商的方式。在默认 postgres 模式下,客户端首先询问服务器是否支持 SSL。在 direct 模式下,客户端在建立 TCP/IP 连接后直接启动标准 SSL 握手。传统的 PostgreSQL 协议协商在使用不同的服务器配置时灵活性最高。如果服务器已知支持直接SSL连接,那么后者只需要一个更少的往返,从而减少连接延迟并允许使用与协议无关的 SSL 网络工具。直接 SSL 选项在 PostgreSQL 版本 17 中引入。

postgres

执行 PostgreSQL 协议协商。如果未提供该选项,则这是默认值。

direct

在建立 TCP/IP 连接后直接启动 SSL 握手。这仅允许使用 sslmode=require 或更高,因为当服务器不支持直接 SSL 握手时,较弱的设置可能导致意外回退到明文身份验证。

sslcompression #

如果设为 1,则通过 SSL 连接发送的数据将被压缩。如果设为 0,则将禁用压缩。默认值是 0。如果没有建立 SSL 连接,则忽略此参数。

如今,SSL 压缩被认为不安全,不再建议使用。 OpenSSL 1.1.0 在默认情况下禁用压缩,并且许多操作系统发行版也已在之前的版本中禁用它,因此如果服务器不接受压缩,则将此参数设为启用不会有任何效果。 PostgreSQL 14 已在后端完全禁用了压缩。

如果安全性不是主要关注点,则如果网络是瓶颈,压缩可以提高吞吐量。如果 CPU 性能是限制因素,则禁用压缩可以提高响应时间和吞吐量。

sslcert #

该参数指定客户端 SSL 证书的文件名,替换默认的 ~/.postgresql/postgresql.crt。如果没有建立 SSL 连接,则忽略此参数。

sslkey #

该参数指定用于客户端证书的密钥的位置。它可以指定一个将用来代替默认 ~/.postgresql/postgresql.key 的文件名,或者可以指定从外部 引擎 获取的密钥(引擎是 OpenSSL 可加载的模块)。外部引擎规范应由用冒号分隔的引擎名称和特定于引擎的密钥标识符组成。如果没有建立 SSL 连接,则忽略此参数。

sslpassword #

此参数指定 sslkey 中指定的密钥的密码,允许客户端证书的私钥以加密形式存储在磁盘上,即使用户无法进行交互式密码输入。

使用任何非空值指定此参数会禁止当向 libpq 提供加密的客户端证书密钥时,OpenSSL 默认发出的 输入 PEM 通行短语: 提示。

如果密钥未加密,则此参数将被忽略。该参数对由 OpenSSL 引擎指定的密钥无效,除非该引擎对提示使用 OpenSSL 密码回调机制。

没有与此选项等效的环境变量,也无功能可用于在 .pgpass 中查找它。可以在服务文件连接定义中使用它。对于用途更复杂的,用户应考虑使用 OpenSSL 引擎和 PKCS#11 或 USB 加密卸载设备等工具。

sslcertmode #

此选项决定是否可以将客户端证书发送到服务器,以及是否要求服务器请求证书。共有三种模式

disable

即使有可用的客户端证书(默认位置或通过 sslcert 提供),也绝不发送客户端证书。

allow(默认)

如果服务器请求证书并且客户端有可发送的证书,则可以发送证书。

require

服务器一定请求证书。如果客户端未发送证书,而服务器成功认证了客户端,连接将失败。

注意

sslcertmode=require 不会增加任何其他安全性,因为无法保证服务器正在正确验证证书;PostgreSQL 服务器通常向客户端请求 TLS 证书,无论它们是否对证书进行验证。在对更复杂的 TLS 设置进行故障排除时,该选项可能很有用。

sslrootcert #

此参数指定包含 SSL 证书颁发机构()的证书(.CA) 如果文件存在,将验证服务器的证书已由这些颁发机构之一签名。默认值是 ~/.postgresql/root.crt

也可以指定特殊值 system,在这种情况下,系统受信任的 CA 根证书将被加载。这些根证书的确切位置因 SSL 实现和平台而异。对于 OpenSSL 来说尤其如此,位置可以通过 SSL_CERT_DIRSSL_CERT_FILE 环境变量进行进一步修改。

注意

使用 sslrootcert=system 时,默认 sslmode 将更改为 verify-full,并且任何较弱的设置都将导致错误。在大多数情况下,任何人要为其控制的主机名获取系统受信任的证书都非常容易,因此 verify-ca 和所有较弱的模式都毫无用处。

神气活现的 system 值将优先于具有相同名称的本地证书文件。如果您出于某种原因发现自己身处这种情况,请改用其他路径,例如 sslrootcert=./system

sslcrl #

此参数指定 SSL 服务器证书吊销列表 (CRL) 的文件名。如果尝试对服务器的证书进行验证,则将拒绝此文件(如果存在)中列出的证书。如果没有设置 sslcrlsslcrldir,则此设置将视为 ~/.postgresql/root.crl

sslcrldir #

此参数指定 SSL 服务器证书吊销列表 (CRL) 的目录名称。如果尝试对服务器的证书进行验证,则将拒绝此目录中文件(如果存在)中列出的证书。

此目录需要使用 OpenSSL 命令 openssl rehashc_rehash 准备。有关详细信息,请参阅其文档。

可以同时指定 sslcrlsslcrldir

sslsni #

如果设置为 1(默认值),libpq 在启用了 SSL 的连接上设置 TLS 扩展 服务器名称指示 (SNI)。将此参数设置为 0 时,将关闭此功能。

SSL 感知代理可以使用服务器名称指示在不必解密 SSL 流的情况下路由连接。(注意,除非代理能觉察到 PostgreSQL 协议握手,否则将需要将 sslnegotiation 设置为 direct。)但是,SNI会使目标主机名以纯文本形式显示在网络流量中,因此在某些情况下可能不希望这样做。

requirepeer #

此参数指定服务器的操作系统用户名,例如 requirepeer=postgres

ssl_min_protocol_version #

此参数指定针对连接允许的最小 SSL/TLS 协议版本。有效值为 TLSv1TLSv1.1TLSv1.2TLSv1.3。受支持的协议取决于所用 OpenSSL 的版本,旧版本不支持最新协议版本。如果没有指定,则默认为 TLSv1.2,此版本满足截至撰写本文时尚佳行业惯例。

ssl_max_protocol_version #

此参数指定针对连接允许的最大 SSL/TLS 协议版本。有效值为 TLSv1TLSv1.1TLSv1.2TLSv1.3。受支持的协议取决于所用 OpenSSL 的版本,旧版本不支持最新协议版本。如果没有设置该参数,则会忽略此参数,连接将使用后端定义的最大限制(如果已设置)。设置最大协议版本主要用于测试或某些组件出现涉及较新协议问题的情况。

krbsrvname #

使用 GSSAPI 进行身份验证时要使用的 Kerberos 服务名称。这必须与服务器配置中指定的 Kerberos 身份验证服务名称相匹配,以使其成功。

gsslib #

需要用于 GSSAPI 身份验证的 GSS 库。除了在同时包含 GSSAPI 和 SSPI 支持的 Windows 版本中,此项设置通常将被忽略。在此情况下,将其设为 gssapi 以指示 libpq 使用 GSSAPI 库执行身份验证,而不是默认 SSPI。

gssdelegation #

将 GSS 凭证转发(委托)给服务器。默认值为 0,表示凭证不会转发给服务器。将此项设为 1,以在可能的情况下转发凭证。

service #

用于附加参数的服务名称。它指定 pg_service.conf 中的服务名称,其中包含其他连接参数。此项允许应用程序仅指定服务名称,以便对连接参数进行集中维护。参见 第 32.17 节

target_session_attrs #

此选项决定会话是否必须具有一些可接受的属性。此选项通常与多个主机名结合使用,以从多个主机中选择第一个可接受的备选方案。有六种模式

any(默认值)

任何成功的连接均可接受

read-write

会话必须默认接受读写事务(即,服务器不能处于热备用模式,并且 default_transaction_read_only 参数必须为 off

read-only

会话必须默认不接受读写事务(相反)

primary

服务器不能处于热备用模式

standby

服务器必须处于热备用模式

prefer-standby

首先尝试查找备用服务器,但如果所列主机中没有一个是备用服务器,则在 any 模式中再次尝试

load_balance_hosts #

控制客户端尝试连接到可用主机和地址的顺序。一旦连接尝试成功,将不再尝试其他主机和地址。此参数通常与多个主机名或返回多个 IP 的 DNS 记录结合使用。此参数可与 target_session_attrs 结合使用,例如,仅对备用服务器进行负载均衡。成功连接后,对已返回连接执行的后续查询都将发送到同一台服务器。目前有两种模式

disable(默认值)

不在主机之间执行负载均衡。按照提供的顺序尝试主机,并且按照从 DNS 或主机文件接收到的顺序尝试地址。

random

主机和地址按随机顺序尝试。此值主要在同时建立多个连接时有用,可能来自不同的机器。这种方式可使连接跨多个 PostgreSQL 服务器实现负载均衡。

尽管随机负载均衡由于其随机性几乎永远不会导致完全一致的分布,但从统计学上来看却非常接近。此处的重点是,此算法采用两级随机选择:首先,以随机顺序解析主机。其次,在解析下一个主机之前,将会随机顺序尝试当前主机的所有已解析地址。在某些情况下,此行为会极大地扭曲每个节点获取的连接数,例如,当某些主机解析为比其他主机更多的地址时。但这种扭曲也可以有意使用,例如,通过在主机字符串中多次提供较大服务器的主机名来增加其获取的连接数。

使用此值时,建议同时为 connect_timeout 配置一个合理的值。因为那时,如果用于负载均衡的某个节点无响应,将尝试使用一个新节点。