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

Postgres:如何安全移除副本?移除唯一副本后主库需操作吗?

如何安全移除PostgreSQL副本及主库相关操作说明

好的,针对你这个单节点复制架构(P->R)下移除副本R的问题,我来一步步给你讲清楚安全操作的流程,还有主库这边需要注意的点,尤其是你担心的WAL磁盘占用问题:

第一步:安全移除副本R的操作

先从副本节点本身入手,确保操作不会影响主库:

  • 停止PostgreSQL服务:根据你的系统环境选择合适的命令,比如systemd系统用:
    sudo systemctl stop postgresql
    
    或者更通用的pg_ctl命令(替换为你的数据目录路径):
    pg_ctl stop -D /var/lib/postgresql/15/main -m fast
    
  • 清理副本数据(可选):如果确定永久不再使用这个副本,可以直接删除整个数据目录(注意路径正确性,避免误删):
    sudo rm -rf /var/lib/postgresql/15/main
    
    如果只是暂时停用,以后可能恢复,记得修改副本的postgresql.conf,把primary_conninfo参数注释掉,防止重启后它又尝试连接主库。

第二步:主库侧的必要操作(重点解决WAL堆积问题)

因为你要永久移除唯一的副本,主库这边必须做一些清理,否则可能出现WAL文件持续堆积占满磁盘的情况:

  • 确认复制连接已断开:在主库上执行SQL查询,查看当前活跃的复制连接:
    SELECT * FROM pg_stat_replication;
    
    如果结果里已经没有对应副本R的条目,说明连接已经正常断开。
  • 检查并清理复制槽(关键!):如果之前配置了复制槽(用于防止主库提前清理WAL),必须删除对应副本的槽,否则主库会一直保留WAL直到该槽确认接收,这是导致磁盘占满的常见原因:
    1. 先查看所有复制槽:
      SELECT * FROM pg_replication_slots;
      
    2. 找到对应副本R的槽名,执行删除命令:
      SELECT pg_drop_replication_slot('your_slot_name');
      
  • 调整WAL保留配置:如果之前为了副本设置了较大的wal_keep_size值,现在可以调回适合单节点的合理值(比如默认的16MB,或者根据你的备份需求调整),修改主库的postgresql.conf后,记得重启主库服务或者执行SELECT pg_reload_conf();让配置生效。

关于WAL文件占用的额外说明

  • 主库的WAL文件清理逻辑:如果没有复制槽和活跃的副本连接,PostgreSQL会根据wal_keep_size和归档策略(如果配置了archive_command)自动清理旧的WAL文件,绝对不要手动删除pg_wal目录下的文件,否则可能导致数据损坏。
  • 如果使用了WAL归档,归档目录里的旧文件可以用pg_archivecleanup工具来清理,比如:
    pg_archivecleanup /path/to/archive_dir 00000001000000000000000A
    
    这个命令会清理所有早于指定WAL文件名的归档文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:16:25