PostgreSQL 15.6用repmgr执行node rejoin时pg_rewind报错求助
PostgreSQL主备集群原主节点rejoin时pg_rewind报错问题
环境信息
- PostgreSQL版本:15.6
- 高可用组件:repmgr 5.4.1.1
- 集群状态:主节点故障后自动切换至备节点成功,但原主节点执行
repmgr node rejoin重新加入集群时失败
执行命令及错误日志
集群状态查询(repmgr cluster show)
ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string ----+---------------+---------+-----------+----------+----------+----------+----------+------------------------------------------------------------------------- 1 | d-dba-pg-0ptt | primary | - failed | ? | default | 100 | | host=10.29.98.86 port=5432 user=repmgr dbname=repmgr connect_timeout=2 2 | d-dba-pg-rnh9 | primary | * running | | default | 100 | 2 | host=10.29.97.241 port=5432 user=repmgr dbname=repmgr connect_timeout=2 WARNING: following issues were detected - unable to connect to node "d-dba-pg-0ptt" (ID: 1)
执行的rejoin命令
repmgr node rejoin -f /opt/postgresql/15.6/bin/repmgr.conf -d 'host=10.29.97.241 port=5432 user=repmgr dbname=repmgr' --force-rewind --config-files=postgresql.conf,postgresql.local.conf,pg_hba.conf -v
核心错误日志
pg_rewind: servers diverged at WAL location 0/9000000 on timeline 1 pg_rewind: error: could not open file "/pgresdata101/data/pg_wal/000000010000000000000008": No such file or directory pg_rewind: error: could not find previous WAL record at 0/802B668 ERROR: pg_rewind execution failed
报错原因分析
- 时间线分叉:原主节点时间线为1,新主节点切换后时间线升级为2,两者在WAL位置
0/9000000处产生分叉,pg_rewind需要回溯到分叉点完成数据同步 - 关键WAL缺失:原主节点本地
pg_wal目录缺少000000010000000000000008文件,导致pg_rewind无法获取分叉点之前的WAL记录 - 触发因素:大概率是原主节点故障期间,本地WAL被自动清理(如
wal_keep_size设置过小),或归档存储中未保留该WAL文件
解决步骤
步骤1:恢复缺失的WAL文件
- 检查
postgresql.conf中的archive_mode、archive_command配置,确认归档存储路径 - 到归档存储中查找
000000010000000000000008文件,若存在:- 停止原主节点服务:
pg_ctl stop -D /pgresdata101/data - 将该WAL文件复制到原主节点的
/pgresdata101/data/pg_wal目录 - 修改文件权限为postgres用户:
chown postgres:postgres /pgresdata101/data/pg_wal/000000010000000000000008 - 重新执行rejoin命令
- 停止原主节点服务:
步骤2:手动执行pg_rewind验证
若步骤1后仍报错,手动执行pg_rewind排查细节:
/opt/postgresql/pg/bin/pg_rewind -D '/pgresdata101/data' --source-server='host=10.29.97.241 port=5432 user=repmgr dbname=repmgr connect_timeout=2'
如果仍提示WAL缺失,说明无法通过pg_rewind修复,需执行重新克隆。
步骤3:重新克隆新主节点数据
当pg_rewind无法修复时,直接从新主节点同步完整数据:
- 停止原主节点服务:
pg_ctl stop -D /pgresdata101/data - 清空原数据目录:
rm -rf /pgresdata101/data/* - 执行standby克隆:
repmgr -f /opt/postgresql/15.6/bin/repmgr.conf standby clone -d 'host=10.29.97.241 port=5432 user=repmgr dbname=repmgr' - 启动原主节点:
pg_ctl start -D /pgresdata101/data - 执行rejoin完成集群加入:
repmgr node rejoin -f /opt/postgresql/15.6/bin/repmgr.conf -d 'host=10.29.97.241 port=5432 user=repmgr dbname=repmgr'
步骤4:优化配置避免重复问题
- 调整
wal_keep_size参数:设置足够大的值(如16GB),确保故障期间关键WAL不会被自动清理 - 验证归档可靠性:确保
archive_command能将WAL文件上传到可靠存储(如NFS、对象存储),避免归档失败导致WAL丢失 - 保持
wal_log_hints启用:确保pg_rewind可正常使用块级对比功能(当前已启用,无需修改)
内容的提问来源于stack exchange,提问作者Devesh Kumar
相关产品推荐
相关产品推荐

