Postgresql
將 Postgres 9.3 數據庫移動到新伺服器並更新到 9.6,停機時間最短
我有一個 PostgreSQL 9.3 數據庫,我必須將其移動到新伺服器並更新到 9.6,並且停機時間最短。我以為我可以:
- 在舊的 Postgres 上,啟動 archive_command 以將 WAL 複製到安裝在舊伺服器和新伺服器上的 NFS 目錄
- pg_dumpall 舊的 Postgres
- 在新伺服器上安裝 Postgres 9.6
- 導入 SQL 轉儲
- 以恢復模式重新啟動新伺服器,指向NFS目錄從舊伺服器獲取WAL 所以當新舊Postgres同步時,我可以停止舊的,驗證新的是否是最新的,更改應用程序配置到新的 Postgres,並重新啟動應用程序。
我用一些測試數據庫對此進行了測試,但它不起作用:在新的 postgres 上,最新檢查點的重做 wal 文件的編號高於舊的 WAL 編號。當我導入 sql 轉儲時,會生成一些 WAL,因此 WAL 編號會增加。因此,當我在恢復模式下重新啟動新的時,它不會讀取舊的 Postgres WAL。
我不確定這種方法是否可行。
如果這是不可能的,有人可以告訴我另一種方法嗎?
你不能這樣做,因為 WAL 歸檔只能處理物理副本,而 pg_dumpall 和 restore 會生成一個邏輯副本。此外,WAL 格式在主要版本之間不兼容,因此無論如何您都無法將 WAL 從一個版本重新播放到另一個版本。(你可以用邏輯複製來做類似的事情,但這在 9.3 版本中不存在,並且是一個相當高級的主題,需要在較新的版本中進行廣泛的設計和測試。)
真的有必要同時移動版本和伺服器嗎?如果在這樣的雙重遷移過程中出現問題,那麼您只是通過同時更改兩個主要內容而造成了嚴重的診斷混亂。
移動版本(邏輯複製除外)的停機時間最短的方法是使用
pg_upgrade -k
. 這要求您同時在同一台機器上安裝新舊版本。移動機器的停機時間最短的方法是設置流複製;並等待它趕上來(在主伺服器仍然處於活動狀態時盡可能多地獲得),然後關閉所有使用者到主伺服器的連接,等待所有 WAL 重播到副本,並提升副本。