【PostgreSQL】数据库报错 “requested WAL segment 0000000100000010000000C5 has already been removed“

要解决,可按照以下步骤操作:

1. 立即检查归档和WAL文件状态

  • 确认归档目录:检查配置的归档位置(archive_command)是否存在缺失的WAL段文件(0000000100000040000000A5)。若存在,手动将其复制到主库的pg_wal目录或备库的接收目录。
  • 检查主库的pg_wal目录:使用命令 ls -l $PGDATA/pg_wal/0000000100000040000000A5* 确认文件是否被误删。若存在,调整清理策略;若不存在且归档中也没有,需进入恢复流程。

2. 从备份恢复并应用WAL

  • 使用最近的基础备份:找到最新的基础备份(如通过pg_basebackup或第三方工具生成的备份),将其恢复到备库或新实例。
  • 应用归档的WAL日志:在恢复配置(recovery.confpostgresql.conf中的restore_command)中指定归档位置,确保所有可用WAL段被应用。示例配置:
    restore_command = 'cp /path/to/archive/%f %p'
    recovery_target_timeline = 'latest'
    
  • 停止在缺失的WAL前:若缺失的WAL无法找回,需设置recovery_target_xidrecovery_target_time到该WAL之前的时间点,避免恢复失败。

3. 重建备库

  • 若无法恢复缺失的WAL,必须重新创建备库:
    # 在主库生成新的基础备份
    pg_basebackup -h 主库IP -D /path/to/new/standby -U replication -v -P --wal-method=stream
    # 配置备库的postgresql.conf和primary_conninfo,启动备库
    

4. 调整主库配置

  • 增加WAL保留量:修改wal_keep_size(PostgreSQL 13+)或wal_keep_segments(旧版本),例如:
    wal_keep_size = '10GB'  # 保留足够WAL供备库同步
    
  • 启用复制槽(推荐):复制槽能防止主库删除未同步的WAL:
    SELECT * FROM pg_create_physical_replication_slot('standby1_slot');
    
    备库配置primary_slot_name = 'standby1_slot'

5. 优化归档策略

  • 确保归档成功:检查archive_command是否有权限问题或存储空间不足,测试命令是否能正确执行。
  • 延长归档保留时间:结合工具(如cron脚本或备份软件)定期清理过期归档,而非依赖PostgreSQL自动清理。

6. 验证并监控

  • 检查复制状态:在主库执行:
    SELECT * FROM pg_stat_replication;
    
    确认备库的write_lagflush_lag正常。
  • 监控WAL和归档:使用监控工具(如Prometheus + pg_exporter)跟踪WAL生成和归档状态,及时报警异常。

扩展阅读:PostgreSql 主从数据库备份原理

预防措施

  • 定期测试备份和恢复:确保备份有效,避免紧急情况时无法恢复。
  • 使用高可用架构:如Patroni或Pgpool-II,自动处理故障转移和复制问题。

通过以上步骤,可解决WAL段丢失导致的复制中断问题,并预防未来发生类似故障。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RumIV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值