以下函数用于建立与 PostgreSQL 后端服务器的连接。一个应用程序可以同时打开多个后端连接。(这样做的一个原因是访问多个数据库。)每个连接都由一个 PGconn
对象表示,该对象从函数 PQconnectdb
、PQconnectdbParams
或 PQsetdbLogin
获取。请注意,除非内存太少以至于无法分配 PGconn
对象,否则这些函数将始终返回一个非空对象指针。在通过连接对象发送查询之前,应调用 PQstatus
函数来检查返回值以判断连接是否成功。
如果不受信任的用户可以访问尚未采用安全模式使用模式的数据库,则在每个会话开始时,请从 search_path
中删除可公开写入的模式。可以将参数关键字 options
设置为值 -csearch_path=
。或者,可以在连接后发出 PQexec(
。此考虑事项并非 libpq 所特有;它适用于执行任意 SQL 命令的每个接口。conn
, "SELECT pg_catalog.set_config('search_path', '', false)")
在 Unix 上,使用打开的 libpq 连接 fork 进程可能会导致不可预测的结果,因为父进程和子进程共享相同的套接字和操作系统资源。因此,不建议这样做,但从子进程执行 exec
加载新可执行文件是安全的。
PQconnectdbParams
#与数据库服务器建立新的连接。
PGconn *PQconnectdbParams(const char * const *keywords, const char * const *values, int expand_dbname);
此函数使用从两个以 NULL
结尾的数组获取的参数打开新的数据库连接。第一个数组 keywords
定义为字符串数组,每个字符串都是一个关键字。第二个数组 values
给出了每个关键字的值。与下面的 PQsetdbLogin
不同,参数集可以在不更改函数签名的情况下进行扩展,因此对于新的应用程序编程,首选使用此函数(或其非阻塞模拟函数 PQconnectStartParams
和 PQconnectPoll
)。
当前可识别的参数关键字在 第 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);
这是一个调用 PQsetdbLogin
并使用空指针作为 login
和 pwd
参数的宏。它提供用于向后兼容非常旧的程序。
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 完成的操作可以在应用程序的主循环中发生,而不是在 PQconnectdbParams
或 PQconnectdb
内部,因此应用程序可以与其他活动并行管理此操作。
使用 PQconnectStartParams
,数据库连接是使用从 keywords
和 values
数组中获取的参数建立的,并由 expand_dbname
控制,如上面对 PQconnectdbParams
的描述所述。
使用 PQconnectStart
,数据库连接是使用从字符串 conninfo
中获取的参数建立的,如上面对 PQconnectdb
的描述所述。
只要满足许多限制条件,PQconnectStartParams
、PQconnectStart
或 PQconnectPoll
都不会阻塞
必须适当使用 hostaddr
参数,以防止进行 DNS 查询。有关详细信息,请参见第 32.1.2 节中此参数的文档。
如果调用 PQtrace
,请确保您要跟踪到的流对象不会阻塞。
您必须确保在调用 PQconnectPoll
之前,套接字处于适当的状态,如下所述。
要开始非阻塞连接请求,请调用 PQconnectStart
或 PQconnectStartParams
。如果结果为 null,则 libpq 无法分配新的 PGconn
结构。否则,将返回一个有效的 PGconn
指针(尽管尚未表示与数据库的有效连接)。接下来调用 PQstatus(conn)
。如果结果为 CONNECTION_BAD
,则连接尝试已失败,通常是因为连接参数无效。
如果 PQconnectStart
或 PQconnectStartParams
成功,则下一步是轮询 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
。
请注意,当 PQconnectStart
或 PQconnectStartParams
返回非空指针时,您必须在使用完它后调用 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)
值来检索错误。如果 forRead
和 forWrite
都为零,则该函数会立即返回超时指示。
PQsocketPoll
使用 poll(2)
或 select(2)
实现,具体取决于平台。有关更多信息,请参阅 poll(2)
中的 POLLIN
和 POLLOUT
,或 select(2)
中的 readfds
和 writefds
。
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
结构的数组,该数组以一个具有 null keyword
指针的条目结束。如果无法分配内存,则返回 null 指针。请注意,当前默认值(val
字段)将取决于环境变量和其他上下文。缺少或无效的服务文件将被静默忽略。调用者必须将连接选项数据视为只读。
在处理完选项数组后,将其传递给 PQconninfoFree
来释放它。如果不这样做,每次调用 PQconndefaults
都会泄漏少量内存。
PQconninfo
#返回实时连接使用的连接选项。
PQconninfoOption *PQconninfo(PGconn *conn);
返回一个连接选项数组。这可用于确定所有可能的 PQconnectdb
选项以及用于连接到服务器的值。返回值指向 PQconninfoOption
结构的数组,该数组以一个具有 null keyword
指针的条目结束。上面关于 PQconndefaults
的所有说明也适用于 PQconninfo
的结果。
PQconninfoParse
#从提供的连接字符串返回解析的连接选项。
PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
解析连接字符串并将结果选项作为数组返回;如果连接字符串有问题,则返回 NULL
。此函数可用于提取提供的连接字符串中的 PQconnectdb
选项。返回值指向 PQconninfoOption
结构的数组,该数组以一个具有 null 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
(上面)的不同之处在于,它们以非阻塞方式工作。这些函数与 PQconnectStartParams
、PQconnectStart
和 PQconnectPoll
有相同的限制。
要启动连接重置,请调用 PQresetStart
。如果它返回 0,则重置失败。如果它返回 1,则使用 PQresetPoll
轮询重置,方式与使用 PQconnectPoll
创建连接的方式完全相同。
PQpingParams
#PQpingParams
报告服务器的状态。它接受与上面描述的 PQconnectdbParams
相同的连接参数。为了获得服务器状态,无需提供正确的用户名、密码或数据库名称值;但是,如果提供的值不正确,服务器将记录连接尝试失败的情况。
PGPing PQpingParams(const char * const *keywords, const char * const *values, int expand_dbname);
该函数返回以下值之一
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);
多个 libpq 函数解析用户指定的字符串以获取连接参数。这些字符串有两种可接受的格式:纯关键字/值字符串和 URI。URI 通常遵循 RFC 3986,但允许使用多主机连接字符串,如下文进一步所述。
在关键字/值格式中,每个参数设置的形式为 keyword
=
value
,设置之间有空格。设置的等号周围的空格是可选的。要写入空值或包含空格的值,请用单引号将其括起来,例如 keyword = 'a value'
。值中的单引号和反斜杠必须使用反斜杠转义,即 \'
和 \\
。
示例
host=localhost port=5432 dbname=mydb connect_timeout=10
可识别的参数关键字在 第 32.1.2 节中列出。
连接的一般形式URI是
postgresql://[userspec
@][hostspec
][/dbname
][?paramspec
] whereuserspec
is:user
[:password
] andhostspec
is: [host
][:port
][,...] andparamspec
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
的连接字符串。如下文进一步所述,将依次尝试每个主机,直到成功建立连接。
可以指定多个要连接的主机,以便按给定的顺序尝试连接。在键/值格式中,host
、hostaddr
和 port
选项接受以逗号分隔的值列表。每个指定的选项中必须给出相同数量的元素,例如,第一个 hostaddr
对应于第一个主机名,第二个 hostaddr
对应于第二个主机名,依此类推。作为例外,如果只指定一个 port
,则它适用于所有主机。
在连接 URI 格式中,可以在 URI 的 host
组件中列出多个以逗号分隔的 host:port
对。
在任何一种格式中,单个主机名都可以转换为多个网络地址。一个常见的例子是同时具有 IPv4 和 IPv6 地址的主机。
当指定多个主机,或者单个主机名转换为多个地址时,将按顺序尝试所有主机和地址,直到其中一个成功。如果无法访问任何主机,则连接失败。如果成功建立连接,但身份验证失败,则不会尝试列表中剩余的主机。
如果使用密码文件,则可以为不同的主机设置不同的密码。列表中每个主机的其他所有连接选项都相同;例如,无法为不同的主机指定不同的用户名。
当前可识别的参数关键字有
host
#要连接的主机名。 如果主机名看起来像是绝对路径名,则它指定 Unix 域通信而不是 TCP/IP 通信;该值是存储套接字文件的目录的名称。(在 Unix 上,绝对路径名以斜杠开头。在 Windows 上,以驱动器盘符开头的路径也被识别。)如果主机名以 @
开头,则将其视为抽象命名空间中的 Unix 域套接字(目前在 Linux 和 Windows 上受支持)。当未指定或为空时 host
,默认行为是连接到 /tmp
中的 Unix 域套接字 (或构建 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 证书验证都需要主机名。使用以下规则
如果指定了 host
但没有 hostaddr
,则会进行主机名查找。(当使用 PQconnectPoll
时,当 PQconnectPoll
首次考虑此主机名时会进行查找,并且可能导致 PQconnectPoll
阻塞相当长的时间。)
如果指定了 hostaddr
但没有 host
,则 hostaddr
的值给出服务器网络地址。如果身份验证方法需要主机名,则连接尝试将失败。
如果同时指定了 host
和 hostaddr
,则 hostaddr
的值给出服务器网络地址。host
的值将被忽略,除非身份验证方法需要它,在这种情况下,它将用作主机名。
请注意,如果 host
不是网络地址为 hostaddr
的服务器的名称,则身份验证很可能会失败。此外,当同时指定 host
和 hostaddr
时,host
用于在密码文件中标识连接(请参阅第 32.16 节)。
也接受以逗号分隔的 hostaddr
值列表,在这种情况下,将按顺序尝试列表中的每个主机。列表中空的项目会导致使用对应的主机名,如果主机名也为空,则使用默认主机名。有关详细信息,请参阅第 32.1.1.3 节。
如果没有主机名或主机地址,libpq 将使用本地 Unix 域套接字进行连接;或者在 Windows 上,它将尝试连接到 localhost
。
port
#要连接到服务器主机的端口号,或用于 Unix 域连接的套接字文件扩展名。 如果在 host
或 hostaddr
参数中给出了多个主机,则此参数可以指定一个与主机列表长度相同的以逗号分隔的端口列表,或者它可以指定一个用于所有主机的单个端口号。空字符串或逗号分隔列表中的空项指定在构建 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
则阻止使用通道绑定。如果 PostgreSQL 是通过 SSL 支持编译的,则默认值为 prefer
;否则默认值为 disable
。
通道绑定是服务器向客户端验证自身身份的方法。它仅在 PostgreSQL 11 或更高版本的服务器上使用 SCRAM
身份验证方法时支持通过 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 Keep-Alive。默认值为 1,表示启用,但如果不需要 Keep-Alive,您可以将其更改为 0,表示禁用。对于通过 Unix 域套接字建立的连接,此参数将被忽略。
keepalives_idle
#控制 TCP 在多少秒的不活动后应向服务器发送 Keep-Alive 消息。值为零则使用系统默认值。对于通过 Unix 域套接字建立的连接,或者如果禁用了 Keep-Alive,则此参数将被忽略。它仅在可以使用 TCP_KEEPIDLE
或等效套接字选项的系统以及 Windows 系统上受支持;在其他系统上,它不起作用。
keepalives_interval
#控制在服务器未确认 TCP Keep-Alive 消息后,应该重新传输消息的秒数。值为零则使用系统默认值。对于通过 Unix 域套接字建立的连接,或者如果禁用了 Keep-Alive,则此参数将被忽略。它仅在可以使用 TCP_KEEPINTVL
或等效套接字选项的系统以及 Windows 系统上受支持;在其他系统上,它不起作用。
keepalives_count
#控制在客户端与服务器的连接被认为断开之前可以丢失的 TCP Keep-Alive 消息的数量。值为零则使用系统默认值。对于通过 Unix 域套接字建立的连接,或者如果禁用了 Keep-Alive,则此参数将被忽略。它仅在可以使用 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
#此选项确定是否以及以何种优先级与服务器协商安全SSLTCP/IP 连接将与服务器协商。有六种模式
disable
仅尝试非SSLconnection
allow
首先尝试一个非SSL连接;如果失败,则尝试一个SSLconnection
prefer
(默认)首先尝试一个SSL连接;如果失败,则尝试一个非SSLconnection
require
仅尝试一个SSL连接。如果存在根 CA 文件,则以与指定 verify-ca
相同的方式验证证书
verify-ca
仅尝试一个SSL连接,并验证服务器证书是否由受信任的证书颁发机构颁发(CA)
verify-full
仅尝试一个SSL连接,验证服务器证书是否由受信任的证书颁发机构颁发CA并且请求的服务器主机名与证书中的主机名匹配
有关这些选项如何工作的详细描述,请参阅第 32.19 节。
对于 Unix 域套接字通信,将忽略 sslmode
。如果 PostgreSQL 在没有 SSL 支持的情况下编译,则使用 require
、verify-ca
或 verify-full
选项将导致错误,而选项 allow
和 prefer
将被接受,但 libpq 实际上不会尝试一个SSL连接。
请注意,如果GSSAPI加密是可能的,那么无论 sslmode
的值如何,都将优先使用SSL加密。要在具有正常运行的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
中指定的密钥的密码,即使交互式密码输入不实用,也允许将客户端证书私钥以加密形式存储在磁盘上。
指定带有任何非空值的此参数会抑制 OpenSSL 在向 libpq
提供加密的客户端证书密钥时默认发出的 Enter PEM pass phrase:
提示。
如果密钥未加密,则忽略此参数。此参数对 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_DIR
和 SSL_CERT_FILE
环境变量进一步修改。
当使用 sslrootcert=system
时,默认的 sslmode
将更改为 verify-full
,任何较弱的设置都会导致错误。在大多数情况下,任何人都可以轻松获得系统信任的证书,用于他们控制的主机名,从而使 verify-ca
和所有较弱的模式都变得无用。
神奇的 system
值将优先于同名的本地证书文件。如果由于某种原因您发现自己处于这种情况,请使用替代路径,例如 sslrootcert=./system
。
sslcrl
#此参数指定 SSL 服务器证书吊销列表 (CRL) 的文件名。如果此文件中列出的证书存在,则在尝试验证服务器的证书时将被拒绝。如果未设置 sslcrl 和 sslcrldir,则此设置将采用 ~/.postgresql/root.crl
。
sslcrldir
#此参数指定 SSL 服务器证书吊销列表 (CRL) 的目录名。如果此目录中的文件列出了证书,则在尝试验证服务器的证书时将被拒绝。
需要使用 OpenSSL 命令 openssl rehash
或 c_rehash
准备该目录。有关详细信息,请参阅其文档。
可以一起指定 sslcrl
和 sslcrldir
。
sslsni
#如果设置为 1(默认值),libpq 将在启用 SSL 的连接上设置 TLS 扩展 “服务器名称指示” (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 协议版本。有效值包括 TLSv1
、TLSv1.1
、TLSv1.2
和 TLSv1.3
。支持的协议取决于所使用的 OpenSSL 版本,较旧的版本不支持最新的协议版本。如果未指定,则默认值为 TLSv1.2
,这满足本文撰写时的行业最佳实践。
ssl_max_protocol_version
#此参数指定允许连接的最大 SSL/TLS 协议版本。有效值包括 TLSv1
、TLSv1.1
、TLSv1.2
和 TLSv1.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
(默认)不执行跨主机的负载平衡。主机将按照提供的顺序尝试,地址将按照从 DNS 或主机文件接收的顺序尝试。
random
主机和地址会以随机顺序尝试连接。此值在同时打开多个连接时(可能来自不同的机器)非常有用。这样,连接就可以在多个 PostgreSQL 服务器之间进行负载均衡。
虽然随机负载均衡由于其随机性,几乎永远不会产生完全均匀的分布,但从统计学上来说,它会非常接近。这里一个重要的方面是,此算法使用两个级别的随机选择:首先,主机将以随机顺序解析。其次,在解析下一个主机之前,当前主机的所有已解析地址都将以随机顺序尝试。在某些情况下,这种行为可能会极大地扭曲每个节点获得的连接数量,例如当某些主机解析到比其他主机更多的地址时。但这种扭曲也可以有目的地使用,例如,通过在主机字符串中多次提供较大服务器的主机名来增加其连接数。
当使用此值时,建议同时为 connect_timeout 配置一个合理的值。因为这样,如果用于负载均衡的节点之一没有响应,则将尝试新节点。
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表格报告文档问题。