如何查询正在运行的 pg_hba 配置?

vic*_*nco 11 postgresql replication pg-hba.conf

我想pg_hba.conf在发出复制启动命令之前测试提供者是否授权了复制连接,但不知道如何。(我可以访问两个节点上的 unix 和 postgresql shell)

对于非复制连接,我将psql使用类似的连接字符串进行连接'host=$MASTER_IP port=5432 dbname=$DATABASE user=$DBUSER password=$DBPASSWORD'

上下文: 我正在编写一个脚本来自动设置服务器之间的复制,并且服务器的配置通过不同的系统/存储库(遗留原因)进行管理。因此,我想测试每一步的设置是否正确。

dez*_*zso 17

版本 10 及以上

有一个非常方便的视图,称为pg_hba_file_rules.

table pg_hba_file_rules ;

 line_number ?   type    ?   database    ?  user_name  ?  address  ?                 netmask                 ? auth_method ? options ? error 
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
           3 ? local     ? {all}         ? {all}       ?           ?                                         ? trust       ?         ? 
           4 ? hostssl   ? {all}         ? {+users}    ? 127.0.0.1 ? 255.255.255.255                         ? pam         ?         ? 
           5 ? host      ? {all}         ? {all}       ? 127.0.0.1 ? 255.255.255.255                         ? md5         ?         ? 
           6 ? hostssl   ? {all}         ? {+users}    ? ::1       ? ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ? pam         ?         ? 
           7 ? host      ? {all}         ? {all}       ? ::1       ? ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ? md5         ?         ? 
           8 ? hostssl   ? {replication} ? {standby}   ? all       ?                                         ? md5         ?         ? 
           9 ? hostnossl ? {all}         ? {all}       ? all       ?                                         ? reject      ?         ? 
Run Code Online (Sandbox Code Playgroud)

最高版本 9.6

对于早期版本,它有点麻烦且容易出错(并且仅适用于超级用户,请参阅注释)。

pg_hba.conf我目前可以想象的唯一内置阅读方式是使用pg_read_file().

SELECT pg_read_file('pg_hba.conf');
Run Code Online (Sandbox Code Playgroud)

将在一行中返回整个文件,然后包含换行符(无论它们是您的操作系统喜欢的风格:

[...]
 # TYPE  DATABASE        USER            ADDRESS                 METHOD?
                                                                       ?
 # "local" is for Unix domain socket connections only                  ?
 local   all             all                                     md5   ?
 # IPv4 local connections:                                             ?
 host    all             all             127.0.0.1/32            md5   ?
[...]
Run Code Online (Sandbox Code Playgroud)

您可以根据自己的喜好进一步处理。

笔记:

  • 文件告诉我们如下:

    表 9-86 [包含的 pg_read_file() - me ] 中显示的函数提供对托管服务器的机器上的文件的本机访问。只能访问数据库集群目录和 log_directory 中的文件。使用群集目录中文件的相对路径,以及与日志文件的 log_directory 配置设置匹配的路径。这些功能的使用仅限于超级用户。

    当您设置复制时,关于超级用户的部分对您来说应该不是问题。如果pg_hba.conf不在上述目录中,您可以向其添加符号链接以欺骗系统:

postgres@Z22309: cd /var/lib/postgresql/9.5/main
postgres@Z22309:~/9.5/main$ ln -s /etc/postgresql/9.5/main/pg_hba.conf pg_hba.conf
Run Code Online (Sandbox Code Playgroud)
  • 所有这些都不会告诉您文件是否已更改但配置未重新加载。对于这一点,你必须比较的结果pg_conf_load_time()pg_stat_file(),如下图所示。同时,您仍然无法确切知道自上次重新加载以来进行了哪些更改。此外,如评论中所述,pg_conf_load_time()即使加载文件不成功也会前进,导致混乱 - 至少我不知道如何判断重新加载是否成功。
SELECT pg_read_file('pg_hba.conf');
Run Code Online (Sandbox Code Playgroud)

  • 提醒一下,即使重新加载配置文件失败,`pg_conf_load_time()` 也会返回更新的时间戳。当未配置 SSL 时,我的 `pg_hba.conf` 有一个 `hostssl` 条目,而@dezso 的 `SELECT ...` 语句显示 postgres 重新读取了配置文件,我在 `pg_hba.conf` 中的任何更改都没有直到我删除了 `hostssl` 条目。 (2认同)