CONFIGURATION PARAMETER复制 / 备库
hot_standby_feedback
允许热备库向主库反馈信息,以避免查询冲突。
Allows feedback from a hot standby to the primary that will avoid query conflicts.
布尔 重载生效 引入 9.1 现存至 20 devel 0 次默认值变更
版本轨迹
相对 PostgreSQL 17 无变化。
默认值变迁
默认值自 PostgreSQL 9.1 起没有变过。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。
手册说明
本版译文与 PostgreSQL 14 完全一致,下面就是同一段文字。
指定一个热备机是否将会向主库或上游备库发送有关于备库上当前正被执行的查询的反馈。这个参数可以被用来排除由于记录清除导致的查询取消,但是可能导致在主库上用于某些负载的数据库膨胀。反馈消息的发送频度不会高于每个wal_receiver_status_interval周期发送一次。默认值是off。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
如果使用级联复制,反馈将被向上游传递直到它最后到达主库。备库在接收到反馈之后除了传递给上游不会做任何其他操作。
请注意,如果备库上的时钟被向前或向后调整,反馈消息可能无法按要求的时间间隔发送。 在极端情况下,由于该反馈机制基于时间戳,这可能导致主库长时间面临无法移除死元组的风险。
机制详解
启用后,备库会向主库或上游备库报告当前查询快照仍需要的可见性信息,使上游避免清理由这些查询仍可见的旧行版本。反馈发送频率不会高于 wal_receiver_status_interval。
避免清理冲突会把代价转移到主库:死亡行版本存活更久,表与索引膨胀以及后续 VACUUM 工作都会增加。在级联复制中反馈会继续向上传递,因此很下游的一个旧快照也可能影响主库。
该机制只缓解清理记录冲突,并不能消除全部热备冲突。DDL 锁、删除对象、表空间操作和某些页面级冲突仍会取消查询。无槽备库断开时反馈会中断,时钟跳变也可能影响发送时序。
调优建议
按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。
-
OLTP在线事务处理
只有减少备库查询取消的收益高于主库膨胀风险时才启用。限制备库查询时长,监控事务年龄、死亡元组、表增长、VACUUM 进度和 pg_stat_database_conflicts;纯 HA 备库通常更重视及时重放。
-
OLAP分析与批处理
对长查询报表备库很有价值,但必须搭配工作负载超时和主库膨胀预算。如果分析快照经常阻止清理数小时,应考虑独立报表拓扑。
-
小规格低配实例与开发机
除非已证明查询取消是问题,否则从 off 开始。有限存储使主库膨胀风险更高;启用后应使用较短查询上限和积极监控。
常见问题
- 启用后忽略主库表或索引膨胀。
- 期待它阻止 DDL、锁、删除数据库或表空间冲突。
- 允许下游备库无限长查询长期阻止上游清理。
- 认为无槽备库断开期间反馈仍然有效。
- 分析反馈时序时忽略时钟跳变和 wal_receiver_status_interval。
演化历史
相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。
-
PostgreSQL 20 ← 19 沿用 19
事实沿用 19
-
PostgreSQL 9.1 ← 9.0 新增此参数
PostgreSQL 9.1 起可用
逐版本快照
每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。
| 版本 | 默认值 | 单位 | 上下文 | 类型 | 最小值 | 最大值 | 枚举值 |
|---|---|---|---|---|---|---|---|
| 9.1 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.2 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.3 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.4 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.5 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.6 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 10 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 11 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 12 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 13 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 14 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 15 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 16 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 17 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 18 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 19 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
| 20 沿用 | off |
— |
重载生效 |
布尔 |
— |
— |
— |
参考资料
同类参数
| 参数 | 类型 | 上下文 | 默认值 | 版本变动 | 最近变更 |
|---|---|---|---|---|---|
| 备库 13 | |||||
hot_standby |
布尔 | 重启生效 | on |
101 次 | |
| 允许在恢复期间连接并执行查询。 | 现存 | ||||
hot_standby_feedback |
布尔 | 重载生效 | off |
— | |
| 允许热备库向主库反馈信息,以避免查询冲突。 | 现存 | ||||
max_standby_archive_delay |
整数 | 重载生效 | 30 s |
9.11 次 | |
| 设置热备处理归档 WAL 时,取消冲突查询前允许的最大延迟。 | 现存 | ||||
max_standby_streaming_delay |
整数 | 重载生效 | 30 s |
9.11 次 | |
| 设置热备处理流式 WAL 时,取消冲突查询前允许的最大延迟。 | 现存 | ||||
primary_conninfo |
字符串 | 重载生效 | 空字符串 |
131 次 | |
| 设置连接发送端服务器时使用的连接字符串。 | 现存 | ||||
primary_slot_name |
字符串 | 重载生效 | 空字符串 |
131 次 | |
| 设置连接发送端服务器时使用的复制槽名称。 | 现存 | ||||
promote_trigger_file |
字符串 | 重载生效 | 空字符串 |
— | |
| 指定一个文件,其出现会使备库结束恢复。 | 于 16 移除 | ||||
recovery_min_apply_delay |
整数 | 重载生效 | 0 ms |
— | |
| 设置恢复期间应用变更的最小延迟。 | 现存 | ||||
sync_replication_slots |
布尔 | 重载生效 | off |
— | |
| 允许物理备库从主库同步逻辑故障转移复制槽。 | 现存 | ||||
wal_receiver_create_temp_slot |
布尔 | 重载生效 | off |
— | |
| 未配置永久槽时,设置 WAL receiver 是否创建临时复制槽。 | 现存 | ||||
wal_receiver_status_interval |
整数 | 重载生效 | 10 s |
— | |
| 设置 WAL receiver 向发送端报告状态的最大间隔。 | 现存 | ||||
wal_receiver_timeout |
整数 | 重载生效 | 1 min |
191 次 | |
| 设置等待发送端数据的最长时间。 | 现存 | ||||
wal_retrieve_retry_interval |
整数 | 重载生效 | 5 s |
— | |
| 设置 WAL 获取失败后的重试等待时间。 | 现存 | ||||