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

🚀 可选:重建旧主库为新备库

如果你希望原主库未来变成备库参与复制,可按以下步骤重新搭建:

📦 在旧主机执行:

  1. 清空旧主的数据目录:
rm -rf $PGDATA/*
  1. 在新主库(现在的物理机)执行:
pg_basebackup -h 新主IP -D $PGDATA -U 复制用户 -Fp -Xs -P
  1. 在旧主库上添加复制配置:
# postgresql.conf
primary_conninfo = 'host=新主IP user=replicator password=xxx'
touch $PGDATA/standby.signal
pg_ctl start -D $PGDATA

📌 总结流程图:

主库停写 ➜ 停主库服务 ➜ 等备库追平 ➜ 停备库 ➜ 删除 standby.signal ➜ 启动 ➜ 成为主库

✅ 最终效果

  • 数据无丢失;
  • 主库平滑迁移至物理机;
  • 旧主可重建为备库,或弃用。

posted @ 2025-08-03 20:57  kyle_7Qc  阅读(90)  评论(0)    收藏  举报