PostgreSQL升級方案

DTeam發表於2017-03-30

PostgreSQL在預設情況下,是不能跨版本升級的(9.4, 9.5, 9.6等等這些版本跨版本升級。小版本更新不受影響,比如9.6.1到9.6.2升級不受影響)。甚至PG為了資料的安全性,高版本不能直接使用低版本建立的資料目錄,會在日誌中列印相關的錯誤資訊。

下面介紹兩種升級方案可供選擇,均是postgresql官方文件提及的方案(官方文件參考: https://www.postgresql.org/do…)。

dump + restore方案

此方案的原理是使用pg_dumpall命令將舊資料庫的全部dump成sql檔案,然後使用psql命令還原至高版本的例項中。藉助於管道,可以實現線上升級。配合指令碼的話,切換至高版本幾乎零當機。由於dump+restore總體相對耗時較長,因此不適用於大資料量的資料庫,或是寫入比較頻繁的場景使用。

線上遷移的步驟大致如下:

  1. 保持舊的例項與配置執行
  2. 新的PG例項配置新的埠或者新的unix socket檔案,確保不與舊例項衝突
  3. 使用pg_dumpall | psql管道組合命令線上遷移資料
  4. 停止舊例項,將新例項的配置修改為舊例項使用的埠,重啟服務即可完成遷移

參考命令如下:

sudo -u postgres pg_dumpall -h /path/to/old/instance.sock | sudo -u postgres psql -h /path/to/new/instance.sock

資料倒入完畢之後,停掉舊例項,刪除舊資料的資料目錄即可。

不需要線上升級的話,也可以先用pg_dumpall把舊例項的資料匯出,再更新postgresql,清空資料目錄,使用psql還原資料,效果是完全一樣的。

pg_upgrade方案

pg_upgrade命令是直接對舊的資料庫目錄檔案進行升級的方案,直接將舊版本的資料檔案格式升級為新版本使用的格式。此方案優勢是速度非常快,但是必須停機升級。因此不適用於7×24的場景。

命令非常簡單,同時安裝新版本和舊版本的postgresql,停止postgresql例項後執行:


sudo -u postgres pg_upgrade -b oldbindir -B newbindir -d olddatadir -D newdatadir

複製集方案

此方案是最平滑的方案,比較適用於7×24小時以及大資料量場景,停機時間非常短,只有幾秒鐘。缺點和優點同樣突出——配置繁瑣,需要有叢集環境。

大體的步驟是使用Slony這種複製集方案,先用上述方案升級從庫,再升級主庫。

相關文章