PostgreSQL-14主備切換
? 目標:
- 當前主庫在舊服務(wù)器,運行正常;
- 備庫是新服務(wù)器的 物理機,配置為異步流復(fù)制;
- 現(xiàn)在希望:讓備庫“轉(zhuǎn)正”成為主庫,舊主庫棄用(或未來重建為備庫);
?? 整體思路:平滑切換流程
?? 一句話總結(jié):
在主庫寫入停機后,將備庫“轉(zhuǎn)正”為主庫,實現(xiàn)無數(shù)據(jù)丟失切換
?? 一、主備切換操作流程(原主庫棄用)
以下為 最小中斷遷移方案(計劃切換):
? 第 1 步:讓主庫停止寫入
此步目的是避免數(shù)據(jù)不一致,確保切換前主庫所有數(shù)據(jù)都傳送到備庫。
方法可選:
- 關(guān)閉應(yīng)用連接;
- 設(shè)置主庫只讀;
- 或直接關(guān)閉主庫 PostgreSQL 服務(wù)(在維護時間窗口內(nèi)):
pg_ctl stop -D $PGDATA -m fast
? 第 2 步:等待備庫追上主庫
在備庫上執(zhí)行:
SELECT pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn();
確認它們接近主庫的 pg_current_wal_lsn()。
還可以執(zhí)行:
SELECT pg_is_in_recovery(), now() - pg_last_xact_replay_timestamp();
pg_is_in_recovery() 應(yīng)為 true,而 now() - pg_last_xact_replay_timestamp() 趨近于 0 秒。
? 第 3 步:停止備庫 PostgreSQL 服務(wù)
pg_ctl stop -D $PGDATA
? 第 4 步:在備庫移除 standby 配置,轉(zhuǎn)為主庫
刪除 standby.signal 文件(PostgreSQL 13+):
rm $PGDATA/standby.signal
確認 postgresql.conf 中以下內(nèi)容(可選):
# 確保這些配置無誤:
hot_standby = on
# 刪除這類參數(shù)(如果有)
primary_conninfo = '...'
? 第 5 步:在備庫啟動數(shù)據(jù)庫
pg_ctl start -D $PGDATA
? 第 6 步:確認已轉(zhuǎn)為主庫
登錄數(shù)據(jù)庫:
psql -U postgres
運行:
SELECT pg_is_in_recovery(); -- 應(yīng)返回 false
?? 可選:重建舊主庫為新備庫
如果你希望原主庫未來變成備庫參與復(fù)制,可按以下步驟重新搭建:
?? 在舊主機執(zhí)行:
- 清空舊主的數(shù)據(jù)目錄:
rm -rf $PGDATA/*
- 在新主庫(現(xiàn)在的物理機)執(zhí)行:
pg_basebackup -h 新主IP -D $PGDATA -U 復(fù)制用戶 -Fp -Xs -P
- 在舊主庫上添加復(fù)制配置:
# postgresql.conf
primary_conninfo = 'host=新主IP user=replicator password=xxx'
touch $PGDATA/standby.signal
pg_ctl start -D $PGDATA
?? 總結(jié)流程圖:
主庫停寫 ? 停主庫服務(wù) ? 等備庫追平 ? 停備庫 ? 刪除 standby.signal ? 啟動 ? 成為主庫
? 最終效果
- 數(shù)據(jù)無丟失;
- 主庫平滑遷移至物理機;
- 舊主可重建為備庫,或棄用。

浙公網(wǎng)安備 33010602011771號