PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

26.4. 热备用 #

26.4.1. 热备节点的用户查询支持
26.4.2. 查询与回放冲突解决
26.4.3. 管理与运维热备节点
26.4.4. 热备核心参数
26.4.5. 热备注意事项与限制

通过在备库的 postgresql.conf 中设置 hot_standby = on,备用节点在持续回放 WAL 的同时能够直接接纳外部客户端发起的只读 SQL 连接(如 SELECT、COPY TO),实现极致的读写分离负载分摊。

26.4.1. 热备节点的用户查询支持 #

热备节点允许以只读方式运行大部分只读 SQL 查询,但严禁任何产生 XID 写入的操作或锁定冲突。

26.4.2. 查询与回放冲突解决 #

在热备节点上,当客户端正在执行的长只读查询所需的行版本或锁资源,恰好与主库刚同步过来的排他性物理变更(例如主库 VACUUM 释放了数据页、或删除了某张数据表)发生争用冲突时,系统必须在“让只读查询继续执行”与“让回放进程继续推进”之间做出仲裁。

通过配置参数 max_standby_archive_delay 与 max_standby_streaming_delay,能够指定回放进程至多等待只读慢查询多少毫秒。一旦超时,备库会主动抛出查询取消错误(canceling statement due to conflict with recovery)以保障备库数据不会无限滞后于主库。此外,开启参数 hot_standby_feedback 能够让备库向主库反向通报当前只读事务的最老活跃 XID,从而在源头上阻止主库过早清理备库仍依赖的旧版本行。

26.4.3. 管理与运维热备节点 #

管理员可以通过设置 max_standby_streaming_delay 控制回放阻塞超时阈值。

26.4.4. 热备核心参数 #

包括 hot_standby、hot_standby_feedback 等关键控制选项。

26.4.5. 热备注意事项与限制 #

热备节点无法生成临时表、无法调用带有副作用的易失函数,且在主库执行 DDL 或大容量清理时需防范查询取消冲突。