Postgres:如何安全移除副本?移除唯一副本后主库需操作吗?
如何安全移除PostgreSQL副本及主库相关操作说明
好的,针对你这个单节点复制架构(P->R)下移除副本R的问题,我来一步步给你讲清楚安全操作的流程,还有主库这边需要注意的点,尤其是你担心的WAL磁盘占用问题:
第一步:安全移除副本R的操作
先从副本节点本身入手,确保操作不会影响主库:
- 停止PostgreSQL服务:根据你的系统环境选择合适的命令,比如systemd系统用:
或者更通用的sudo systemctl stop postgresqlpg_ctl命令(替换为你的数据目录路径):pg_ctl stop -D /var/lib/postgresql/15/main -m fast - 清理副本数据(可选):如果确定永久不再使用这个副本,可以直接删除整个数据目录(注意路径正确性,避免误删):
如果只是暂时停用,以后可能恢复,记得修改副本的sudo rm -rf /var/lib/postgresql/15/mainpostgresql.conf,把primary_conninfo参数注释掉,防止重启后它又尝试连接主库。
第二步:主库侧的必要操作(重点解决WAL堆积问题)
因为你要永久移除唯一的副本,主库这边必须做一些清理,否则可能出现WAL文件持续堆积占满磁盘的情况:
- 确认复制连接已断开:在主库上执行SQL查询,查看当前活跃的复制连接:
如果结果里已经没有对应副本R的条目,说明连接已经正常断开。SELECT * FROM pg_stat_replication; - 检查并清理复制槽(关键!):如果之前配置了复制槽(用于防止主库提前清理WAL),必须删除对应副本的槽,否则主库会一直保留WAL直到该槽确认接收,这是导致磁盘占满的常见原因:
- 先查看所有复制槽:
SELECT * FROM pg_replication_slots; - 找到对应副本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工具来清理,比如:
这个命令会清理所有早于指定WAL文件名的归档文件。pg_archivecleanup /path/to/archive_dir 00000001000000000000000A
内容的提问来源于stack exchange,提问作者Russell Smith
相关产品推荐
相关产品推荐

