内容提要
PostgreSQL 19 提交节选:pg_verifybackup 和 pg_waldump 可直接读取 tar 归档中的 WAL;新增 pg_stat_recovery 视图监控恢复状态;psql 提示符新增 %i 显示主库或备库;pg_createsubscriber 支持 --logdir 输出日志;发布支持 FOR ALL TABLES EXCEPT 排除表;订阅可用外部服务器代替连接串;新增 wal_sender_shutdown_timeout 等参数;服务器支持 SNI 多证书;GRANT/REVOKE 支持 GRANTED BY 指定授权角色;新增密码过期预警阈值;MD5 密码认证时告警;预定义角色覆盖大对象;psql 显示发布等对象注释。
延伸解读
备份校验与 WAL 分析更省事
pg_verifybackup 和 pg_waldump 现在能直接读取 tar 归档中的 WAL,不必先解包。pg_verifybackup 新增 --wal-path 取代 --wal-directory,旧选项仍兼容。对使用 pg_basebackup --format=tar 的场景,校验和排查可少一步解压,但需注意新选项名,脚本中应逐步替换旧参数。
恢复监控与连接识别更直观
新增 pg_stat_recovery 视图,在备库查询可看到 promote_triggered、last_replayed_read_lsn、pause_state 等单行状态;主库上返回空行。psql 提示符新增 %i,显示 primary 或 standby,连接串含多主机时尤其有用。两者都降低误连主备和恢复状态不透明的风险。
发布与订阅配置更灵活
发布支持 FOR ALL TABLES EXCEPT 排除指定表,适合“全库同步但少数表例外”的场景。订阅可用 SERVER 指定 postgres_fdw 外部服务器代替连接串,连接信息集中管理,并可通过 USER MAPPING 按用户控制访问。多个订阅指向同一发布者时,不必各自维护连接串。
安全与运维参数需提前评估
服务器支持 SNI 多证书,需启用 ssl_sni 并配置 pg_hosts.conf,适合单 IP 端口服务多虚拟实例。GRANT/REVOKE 支持 GRANTED BY 指定授权角色,但要求当前角色可继承该角色权限。密码过期预警阈值可调,MD5 认证也会告警,说明迁移 SCRAM-SHA-256 应提上日程。
Q&A
PostgreSQL 19 中 pg_verifybackup 和 pg_waldump 能直接读取 tar 归档里的 WAL 吗?
可以。以前这两个工具只能分析未打包的 WAL 文件,现在它们能直接从 tar 格式的备份中读取和解析 WAL。pg_verifybackup 还新增了 --wal-path 选项来替代已弃用的 --wal-directory。
PostgreSQL 19 新增的 pg_stat_recovery 视图有什么用?
pg_stat_recovery 是一个新的系统视图,用于显示恢复的当前状态。在物理复制中,需要在副本上查询该视图,它返回一行数据,包含 promote_triggered、last_replayed_read_lsn、replay_end_lsn、pause_state 等信息。在非恢复状态(如主库)下,该视图不返回任何行。
psql 提示符怎么显示当前连接的是主库还是备库?
在 PostgreSQL 19 中,psql 的 PROMPT1/PROMPT2 变量新增了 %i 转义符,它会根据服务器是否处于 hot standby 模式显示 standby 或 primary。例如设置 PROMPT1 为 [%i]:PROMPT1 后,连接到备库时提示符会自动变为 [standby]。
PostgreSQL 19 的发布(publication)如何排除个别表?
在 PostgreSQL 19 中,CREATE PUBLICATION 或 ALTER PUBLICATION 支持 FOR ALL TABLES EXCEPT (TABLE ...) 语法,可以发布所有表但排除指定的表。例如:CREATE PUBLICATION pub FOR ALL TABLES EXCEPT (TABLE seats, boarding_passes);
PostgreSQL 19 中创建订阅时可以用外部服务器代替连接串吗?
可以。CREATE SUBSCRIPTION 现在支持 SERVER server_name 子句,允许指定一个外部服务器(如 postgres_fdw 服务器)来代替 CONNECTION 'conninfo'。这样连接设置和订阅可以独立管理,多个订阅无需各自保存连接串,还能通过 USER MAPPING 按用户控制访问。
PostgreSQL 19 的 wal_sender_shutdown_timeout 参数是做什么的?
wal_sender_shutdown_timeout 参数用于设置服务器关闭时等待所有 WAL 数据复制到接收方的最大时间。默认值为 -1,表示没有时间限制。这可以避免 walsender 进程在关闭时因等待接收方响应而长时间卡住,尤其在逻辑复制中应用工作进程被锁阻塞时。
PostgreSQL 19 服务器端如何支持 SNI 多证书?
PostgreSQL 19 中,服务器可以根据客户端连接时指定的主机名提供不同的 SSL 证书。需要启用新的 ssl_sni 参数,并在 pg_hosts.conf 文件中配置主机名到证书和密钥的映射。如果 ssl_sni 启用且 pg_hosts.conf 有条目,它们会优先于 postgresql.conf 中的 SSL 参数。
PostgreSQL 19 的 GRANT/REVOKE 中 GRANTED BY 子句有什么变化?
以前 GRANTED BY 只能指定当前角色,指定其他角色会报错。PostgreSQL 19 中,只要当前角色通过 INHERIT 继承了指定角色的权限,就可以代表该角色授予或撤销权限。例如 charlie 继承了 alice 和 bob 的权限后,可以执行 GRANT SELECT ON test TO dave GRANTED BY bob;
PostgreSQL 19 如何设置密码过期预警阈值?
新增的 password_expiration_warning_threshold 参数控制提前多久警告用户密码即将过期,默认是 7 天。当用户连接时,如果密码将在阈值内过期,会收到 WARNING: role password will expire soon 的提示,并显示具体剩余时间。
PostgreSQL 19 对 MD5 密码认证有什么新警告?
从 PostgreSQL 18 开始,设置 MD5 加密密码时会有警告,但密码仍可设置和使用。PostgreSQL 19 中,使用 MD5 加密密码进行认证时也会收到警告,提示 MD5 密码支持已弃用并将在未来版本移除。可以通过 md5_password_warnings 参数关闭这些警告,但建议迁移到 SCRAM-SHA-256。