You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 时间线分叉:原主节点时间线为1,新主节点切换后时间线升级为2,两者在WAL位置0/9000000处产生分叉,pg_rewind需要回溯到分叉点完成数据同步
  2. 关键WAL缺失:原主节点本地pg_wal目录缺少000000010000000000000008文件,导致pg_rewind无法获取分叉点之前的WAL记录
  3. 触发因素:大概率是原主节点故障期间,本地WAL被自动清理(如wal_keep_size设置过小),或归档存储中未保留该WAL文件

解决步骤

步骤1:恢复缺失的WAL文件

  1. 检查postgresql.conf中的archive_mode、archive_command配置,确认归档存储路径
  2. 到归档存储中查找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无法修复时,直接从新主节点同步完整数据:

  1. 停止原主节点服务:pg_ctl stop -D /pgresdata101/data
  2. 清空原数据目录:rm -rf /pgresdata101/data/*
  3. 执行standby克隆:
    repmgr -f /opt/postgresql/15.6/bin/repmgr.conf standby clone -d 'host=10.29.97.241 port=5432 user=repmgr dbname=repmgr'
    
  4. 启动原主节点:pg_ctl start -D /pgresdata101/data
  5. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:54:55