2024 年 9 月 26 日:PostgreSQL 17 发布!
支持的版本:最新版本17)/16/15/14/13/12
开发版本:devel
不支持的版本:11/10/9.6/9.5/9.4/9.3/9.2/9.1/9.0/8.4/8.3/8.2/7.3/7.2

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

下列函数用于连接到 PostgreSQL 服务器。应用程序可以同时打开多个服务器后端连接。(这样做的一般原因是访问多个数据库。)每一个连接都由一个 PGconn 对象来表示,由函数 PQconnectdbPQconnectdbParamsPQsetdbLogin 取得。请注意,这些函数通常会返回一个非空的指针,除非内存太少,以至于无法分配 PGconn 对象。应该调用 PQstatus 函数来检查返回的值,以确保在通过连接对象发送查询之前已经成功连接。

警告

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

警告

在 Unix 中,使用已经打开的 libpq 连接fork一个进程会导致不可预测的结果,这是因为父进程和子进程共享相同的套接字和操作系统资源。出于这个原因,不建议这样做,尽管从子进程进行 exec 以加载一个新的可执行文件是安全的。

PQconnectdbParams #

创建一个新的数据库服务器连接。

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

该函数使用从两个以 NULL 结尾的数组获取的参数打开一个新的数据库连接。第一个数组 keywords 定义为字符串数组,每一个都是一个关键字。第二个数组 values 为每个关键字提供值。与下面的 PQsetdbLogin 不同,参数设置可以在不改变函数签名的前提下得到扩展,因此对于新的应用程序编程,优先使用这个函数(或其非阻塞类似函数 PQconnectStartParamsPQconnectPoll)。

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

传递的数组可以为空,表示使用所有默认参数,或者可以包含一个或多个参数设置。长度必须一致。处理将在 NULL 条目出现于 keywords 数组中的位置处停止。此外,如果与非 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);

这是一个宏,它调用 PQsetdbLogin,其中 loginpwd 参数的空指针为 null。提供此功能是为了向后兼容非常旧的程序。

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。如果结果为空,则 libpq 无法分配新的 PGconn 结构。否则,将返回一个有效的 PGconn 指针(尽管它尚未表示与数据库的有效连接)。接下来调用 PQstatus(conn)。如果结果为 CONNECTION_BAD,则连接尝试已失败,通常是因为连接参数无效。

如果 PQconnectStartPQconnectStartParams 成功,下一阶段是轮询 libpq 以便它可以继续执行连接序列。使用 PQsocket(conn) 获取作为数据库连接基础的套接字的描述符。(注意:不要假设套接字在 PQconnectPoll 调用时保持不变。)循环进行如下操作:如果 PQconnectPoll(conn) 上次返回 PGRES_POLLING_READING,则等到套接字准备好读取(由 select()poll() 或类似的系统函数指示)。请注意,PQsocketPoll 可以在您的系统上设置 select(2)poll(2) 时帮助减少样板文本,从而实现抽象化。然后再次调用 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 指针为 null 的条目结束。如果无法分配内存,则返回 null 指针。请注意,当前默认值(val 字段)取决于环境变量和其他上下文。将忽略缺失或无效的服务文件。调用方必须将连接选项数据视为只读。

在处理 options 数组之后,将其传递给 PQconninfoFree 以释放它。如果没有这样作,每次调用 PQconndefaults 会轻微泄漏一些内存。

PQconninfo #

返回实时连接使用的连接选项。

PQconninfoOption *PQconninfo(PGconn *conn);

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

PQconninfoParse #

返回提供的连接字符串中解析出的连接选项。

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

解析一个连接字符串并返回作为数组的结果选项;或者如果连接字符串存在问题,则返回 NULL。此函数可用于提取提供的连接字符串中的 PQconnectdb 选项。返回值指向一个 PQconninfoOption 结构体数组,该数组以一个 keyword 指针为 null 的条目结束。

所有合法的选项都将出现在结果数组中,但如果连接字符串中不存在某个选项,则该选项的 PQconninfoOption 将具有设置为 NULLval;不会插入默认值。

如果 errmsg 不为 NULL,则在成功时将 *errmsg 设置为 NULL,否则将其设置为解释该问题的 malloc'd 错误字符串。(还可以将 *errmsg 设置为 NULL 且该函数返回 NULL;这表示内存不足情况。)

在处理 options 数组之后,将其传递给 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 允许应用程序使用 sslpassword 或交互式提示重写 libpq默认加密客户端证书密钥文件处理方式

void PQsetSSLKeyPassHook_OpenSSL(PQsslKeyPassHook_OpenSSL_type hook);

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

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

然后,libpq 会调用而不是其默认 PQdefaultSSLKeyPassHook_OpenSSL 处理器。回调应该确定密钥的密码并将其复制到大小为 size 的结果缓冲区 buf 中。 buf 中的字符串必须以 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. 关键字/值连接字符串 #

在关键字/值格式中,每个参数设置都采用 keyword = value 的形式,设置之间用空格分隔。设置周围等号的空格是可选的。要写入空值或包含空格的值,请用单引号引起来,例如 keyword = 'a value'。值中的单引号和反斜杠必须使用反斜杠进行转义,即 \'\\

示例

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

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

32.1.1.2. 连接 URI #

连接的一般形式URI

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

where userspec is:

user[:password]

and hostspec is:

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

and paramspec is:

name=value[&...]

URI方案限定符可以是 postgresql://postgres://。其余的每一个URI部分是可选的。以下示例说明了有效的URI语法

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

通常出现在URI的分层部分中的值也可以作为命名参数给出。例如

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

所有命名参数都必须与 第 32.1.2 节 中列出的关键字匹配,但为了与 JDBC 连接URI兼容,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 的主机部分,并指定主机作为命名参数,或者对 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 格式中,您可以在 URI 的 host 组件中用逗号分隔列出多个 host:port 对。

在任一格式中,单个主机名都可以翻译为多个网络地址。一个常见的示例是一个同时具有 IPv4 和 IPv6 地址的主机。

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

如果使用密码文件,则可以为不同的主机设置不同的密码。列表中每个主机的所有其他连接选项都相同;不可能为不同的主机指定不同的用户名。

32.1.2. 参数关键字 #

当前认可的参数关键字是

host #

要连接到的主机的名称。如果主机名看起来像绝对路径名,则它指定的是 Unix 域通信,而不是 TCP/IP 通信;值为存储套接字文件所在的目录的名称。(在 Unix 中,绝对路径名以斜杠开头。在 Windows 中,从驱动器号开头的路径也会得到认可。)如果主机名以 @ 开头,则它会被当作抽象命名空间中的 Unix 域套接字(当前可在 Linux 和 Windows 中获得支持)。在未指定 host 或它为空时,默认行为是连接到 Unix 域套接字中的 /tmp(或 PostgreSQL 构建时指定的套接字目录)。在 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 证书验证需要主机名。会使用以下规则

  • 如果未指定 hostaddr 就指定了 host,则会进行主机名查找。(使用 PQconnectPoll 时,会在 PQconnectPoll 首次考虑此主机名时进行查找,并且可能导致 PQconnectPoll 阻塞很长一段时间。)

  • 如果未指定 host 就指定了 hostaddr,则 hostaddr 的值为服务器网络地址。如果身份验证方法需要主机名,则连接尝试将会失败。

  • 如果同时指定 hosthostaddr 时,hostaddr 的值给出服务器网络地址。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

服务器必须通过GSSAPI请求 Kerberos 握手或建立GSS- 加密通道(另请参见 gssencmode)。

sspi

服务器必须请求 WindowsSSPI身份验证。

scram-sha-256

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

none

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

channel_binding #

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

通道绑定是服务器向客户端进行身份验证的一种方法。仅通过与 PostgreSQL 11 或更高版本服务器建立的 SSL 连接支持该方法使用 SCRAM 身份验证方法。

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 保活。默认值为 1(表示启用),但如果你不想使用保活,则可以将其更改为 0(表示禁用)。对于通过 Unix 域套接字建立的连接,将忽略此参数。

keepalives_idle #

控制 TCP 在多少秒不活动后向服务器发送保持活动的消息。零值表示使用系统默认值。此参数对于通过 Unix 域套接字建立的连接或已禁用保持活动时忽略。它仅在 TCP_KEEPIDLE 或同等套接字选项可用的系统和 Windows 上受支持;在其它系统上,它无效。

keepalives_interval #

控制在 TCP 保持活动消息未被服务器确认后重新传输该消息之前的秒数。零值表示使用系统默认值。此参数对于通过 Unix 域套接字建立的连接或已禁用保持活动时忽略。它仅在 TCP_KEEPINTVL 或同等套接字选项可用的系统和 Windows 上受支持;在其它系统上,它无效。

keepalives_count #

在客户机与服务器之间的连接被认为已断开之前,控制可以丢失的 TCP 保持活动消息的数量。零值表示使用系统默认值。此参数对于通过 Unix 域套接字建立的连接或已禁用保持活动时忽略。它仅在 TCP_KEEPCNT 或同等套接字选项可用的系统上受支持;在其它系统上,它无效。

tcp_user_timeout #

控制在强制关闭一个连接之前,已传输的数据可以保持未确认状态的毫秒数。零值表示使用系统默认值。此参数对于通过 Unix 域套接字建立的连接忽略。它仅在 TCP_USER_TIMEOUT 可用的系统上受支持;在其它系统上,它无效。

replication #

此选项确定连接是否应用复制协议,而不是常规协议。这是 PostgreSQL 复制连接和 pg_basebackup 等工具在内部使用的方法,但第三方应用也可以使用。有关复制协议的介绍,请参阅第 53.4 节

支持以下不区分大小写值

trueonyes1

连接将进入物理复制模式。

database

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

falseoffno0

连接是一个常规连接,这是默认行为。

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

gssencmode #

此选项确定与服务器协商安全GSSTCP/IP连接的方式或优先级。共有三种模式

disable

仅尝试非GSSAPI-加密连接

prefer(默认)

如果存在GSSAPI证书(例如,在证书缓存中),则首先尝试GSSAPI-加密连接;如果失败或没有证书,则尝试非GSSAPI-加密连接。当使用GSSAPI支持编译 PostgreSQL 时,这是默认设置。

require

仅尝试GSSAPI-加密连接

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

sslmode #

此选项确定与服务器协商安全SSL与服务器协商 TCP/IP 连接。共有六种模式

disable

仅尝试非SSL连接

allow

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

prefer(默认)

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

require

仅尝试SSL连接。如果存在根证书颁发机构 (CA) 文件,则像指定 verify-ca 一样验证证书

verify-ca

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

verify-full

仅尝试SSL连接,验证服务器证书是否由受信任的CA机构颁发,并验证所请求的服务器主机名与证书中的主机名相符

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

sslmode 忽略 Unix 域套接字通信。如果在不启用 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)。如果 PostgreSQL 是用 SSL 支持编译的,此选项才可用。

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 在默认情况下禁用了压缩,许多操作系统发行版也在之前的版本中禁用了它。因此,如果服务器不接受压缩,将此参数设置为 on 将不起任何作用。 PostgreSQL 14 在后端完全禁用了压缩。

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

sslcert #

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

sslkey #

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

sslpassword #

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

使用任何非空值指定此参数会禁止 Enter PEM pass phrase: 提示,这是 libpq 提供加密的客户端证书密钥给 OpenSSL 时,OpenSSL 默认会发出的提示。

如果未加密密钥,则会忽略此参数。除非引擎使用 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) 的文件名。如果存在,将拒绝 CRL 中列出的证书,同时尝试验证服务器证书。如果未设置 sslcrlsslcrldir,则此设置将被视为 ~/.postgresql/root.crl

sslcrldir #

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

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

可以同时指定 sslcrlsslcrldir

sslsni #

如果设置为 1(默认值),则 libpq 会在支持 SSL 的连接上设置 TLS 扩展 ServerName Indication (SNI)。将该参数设置为 0 时,会关闭此功能。

SSL 感知代理可以使用服务器名称指示来路由连接,而不必解密 SSL 流。(请注意,除非代理感知 PostgreSQL 协议握手,否则需要将 sslnegotiation 设置为 direct。)但是,SNI使目标主机名在网络流量中以明文形式出现,所以它在某些情况下可能是不可取的。

requirepeer #

此参数指定服务器的操作系统用户名,例如 requirepeer=postgres。建立 Unix 域套接字连接时,如果此参数已设置,客户端在连接开始时检查服务器进程是否在指定用户名下运行;如果没有,则会终止连接并出现错误。此参数可用于提供类似于在 TCP/IP 连接中使用 SSL 证书的服务器认证。(请注意,如果 Unix 域套接字位于 /tmp 或其他公开可写的位置,任何用户都可以启动侦听服务器。使用此参数确保你连接到由受信任用户运行的服务器。)此选项仅支持已实现 peer 认证方法的平台;请参见 第 20.9 节

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 认证。(另请参阅 第 20.6 节。)默认值通常为 postgres,但在通过 configure--with-krb-srvnam 选项构建 PostgreSQL 时可以更改该值。在大多数环境中,此参数无需更改。一些 Kerberos 实现可能需要不同的服务名称,比如 Microsoft Active Directory,它要求服务名称使用大写字母(POSTGRES)。

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 (default)

不会执行跨主机负载均衡。按提供的顺序尝试连接主机,按从 DNS 或主机文件接收到的顺序尝试连接地址。

random

对主机和地址按随机顺序尝试连接。此值在同时打开多个连接时很有用,这些连接可能来自不同的计算机。通过这种方式,可以跨多个 PostgreSQL 服务器进行负载均衡。

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

使用此值时,还建议为 connect_timeout 配置合理的值。这样,如果用于负载均衡的某个节点没有响应,则将尝试使用新节点。

提交更正

如果您发现文档中的内容不正确、与您对特定功能的体验不符或需要进一步澄清,请使用 此表单 报告文档问题。