跳至内容
冲突原因(4种)
- 主库 VACUUM 清理了备库查询需要的多版本数据(最常见)
- 主库 LOCK/DDL 产生的排他锁与备库查询冲突
- 主库删除表空间,但备库查询需要在其上存放临时文件
- 主库删除数据库,而备库仍有 session 连接
处理方式(2种)
- 等待:让备库 WAL 应用进程等查询结束再应用 WAL
- 取消:强制取消备库正在执行的查询
关键参数
max_standby_archive_delay — 归档模式最大等待延迟,默认 30s,-1 表示一直等
max_standby_streaming_delay — 流复制模式最大等待延迟,默认 30s,-1 表示一直等
| 场景 |
建议设置 |
| 备库用于高可用 |
设小值,保证不延迟 |
| 备库用于大查询 |
设大值 |
减少冲突的配置
hot_standby_feedback = on:备库告知主库哪些多版本数据还需要,防止 AutoVacuum 清理(推荐方案)
vacuum_defer_cleanup_age 调大:延迟清理多版本数据(辅助方案)
注意事项
- 即使配置了以上参数,仍可能因冲突被取消查询
- 备库应用应检测
canceling statement due to conflict with recovery 错误并自动重试
- 冲突可通过
pg_stat_database_conflicts 视图查询