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

PostgreSQL 14流复制副本服务器为何会生成WAL文件?

解决PostgreSQL 14副本自行生成WAL的问题

首先明确:物理只读副本即使在正常状态下,也会因后台维护操作(如autovacuum、统计信息更新)生成少量WAL。但如果你的副本生成大量WAL,或需要完全依赖pgBackRest归档存储库获取WAL而非自身生成,可按以下步骤排查和配置:

1. 确保副本处于正确的Standby模式

副本必须以恢复模式启动,避免被误提升为主库:

  • 检查副本数据目录下是否存在recovery.signal(PostgreSQL 12+)文件,若不存在,需重新通过pgBackRest备份初始化副本:
    # 停止副本PostgreSQL服务
    systemctl stop postgresql-14
    # 清空副本数据目录(按需操作)
    rm -rf /var/lib/pgsql/14/data/*
    # 用pgBackRest恢复备份并设置为standby模式
    pgbackrest restore --stanza=your_stanza_name --delta --type=standby
    # 启动服务
    systemctl start postgresql-14
    
  • 在postgresql.conf中确认以下配置:
    standby_mode = on
    recovery_target_timeline = 'latest'
    # 配置从pgBackRest归档获取WAL的命令
    restore_command = 'pgbackrest archive-get --stanza=your_stanza_name %f %p'
    

2. 禁用副本自身的WAL归档(避免无效归档)

副本无需归档自身生成的WAL,确保配置:

archive_mode = off

3. 减少副本内部操作产生的WAL

如果需要进一步减少副本生成的WAL,可调整以下配置(根据业务场景权衡):

  • 关闭自动清理(不建议长期使用,可能导致表膨胀):
    autovacuum = off
    
  • 禁用WAL提示日志(减少不必要的WAL写入):
    wal_log_hints = off
    
  • 限制临时表创建(临时表操作会生成WAL):
    temp_file_limit = 0
    

4. 验证副本是否正确从归档/主库获取WAL

  • 查看副本的PostgreSQL日志,确认是否有以下日志信息:

    started streaming WAL from primary at ... timeline ...
    restored log file ... from archive

  • 检查pg_stat_wal_receiver视图,确认流复制连接状态:
    SELECT * FROM pg_stat_wal_receiver;
    

如果副本仍生成大量WAL,需排查是否存在误操作(如副本被手动提升为主库、存在未授权的写入操作)。

内容的提问来源于stack exchange,提问作者argdenis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:14:59