PostgreSQL-14主备切换
✅ 目标:
- 当前主库在旧服务器,运行正常;
- 备库是新服务器的 物理机,配置为异步流复制;
- 现在希望:让备库“转正”成为主库,旧主库弃用(或未来重建为备库);
🧭 整体思路:平滑切换流程
🎯 一句话总结:
在主库写入停机后,将备库“转正”为主库,实现无数据丢失切换
🔁 一、主备切换操作流程(原主库弃用)
以下为 最小中断迁移方案(计划切换):
✅ 第 1 步:让主库停止写入
此步目的是避免数据不一致,确保切换前主库所有数据都传送到备库。
方法可选:
- 关闭应用连接;
- 设置主库只读;
- 或直接关闭主库 PostgreSQL 服务(在维护时间窗口内):
pg_ctl stop -D $PGDATA -m fast
✅ 第 2 步:等待备库追上主库
在备库上执行:
SELECT pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn();
确认它们接近主库的 pg_current_wal_lsn()。
还可以执行:
SELECT pg_is_in_recovery(), now() - pg_last_xact_replay_timestamp();
pg_is_in_recovery() 应为 true,而 now() - pg_last_xact_replay_timestamp() 趋近于 0 秒。
✅ 第 3 步:停止备库 PostgreSQL 服务
pg_ctl stop -D $PGDATA
✅ 第 4 步:在备库移除 standby 配置,转为主库
删除 standby.signal 文件(PostgreSQL 13+):
rm $PGDATA/standby.signal
确认 postgresql.conf 中以下内容(可选):
# 确保这些配置无误:
hot_standby = on
# 删除这类参数(如果有)
primary_conninfo = '...'
✅ 第 5 步:在备库启动数据库
pg_ctl start -D $PGDATA
✅ 第 6 步:确认已转为主库
登录数据库:
psql -U postgres
运行:
SELECT pg_is_in_recovery(); -- 应返回 false
🚀 可选:重建旧主库为新备库
如果你希望原主库未来变成备库参与复制,可按以下步骤重新搭建:
📦 在旧主机执行:
- 清空旧主的数据目录:
rm -rf $PGDATA/*
- 在新主库(现在的物理机)执行:
pg_basebackup -h 新主IP -D $PGDATA -U 复制用户 -Fp -Xs -P
- 在旧主库上添加复制配置:
# postgresql.conf
primary_conninfo = 'host=新主IP user=replicator password=xxx'
touch $PGDATA/standby.signal
pg_ctl start -D $PGDATA
📌 总结流程图:
主库停写 ➜ 停主库服务 ➜ 等备库追平 ➜ 停备库 ➜ 删除 standby.signal ➜ 启动 ➜ 成为主库
✅ 最终效果
- 数据无丢失;
- 主库平滑迁移至物理机;
- 旧主可重建为备库,或弃用。

浙公网安备 33010602011771号