我的升級PostgreSQL的經驗(9.5升級到14)

2022-06-15

資料庫

這幾天的Side Project開發時遇到了升級PostgreSQL的小障礙,我最後把它排除了。覺得很有成就感,在這邊分享一下我的解決歷程吧。

這個升級,似乎不是更新執行檔就可以了,有時候會遇到如我現在遇到的問題一樣,我們沒辦法自動轉移到新版本上,必須使用PostgreSQL提供的工具去做升級與轉換。以下是我的工作流程。

首先使用 pg_lsclusters 指令看看現在有哪些資料庫正在使用

~$ pg_lsclusters
ver Cluster Port Status Owner    Data directory               Log file
9.5 main    5433 online postgres /var/lib/postgresql/9.5/main /var/log/postgresql/postgresql-9.5-main.log
14  main    5432 down   postgres /var/lib/postgresql/14/main  /var/log/postgresql/postgresql-14-main.log

這是目前的狀態,目前有兩台Server在這台電腦上,運行中的是版本9.5的資料庫,名稱為main。 14版的因為我想裡面也沒有我最近的資料,於是我就下pg_dropcluster來移除我不需要的資料庫。

~$ sudo services postgresql stop # 先把資料庫停機了
~$ pg_ctlcluster 9.5 main stop # 用這個指令停機也行,要先登入有權限的使用者。
~$ pg_dropcluster 14 main # 將資料庫移除

再看一次剩下那些機器pg_lsclusters

~$ pg_lsclusters
ver Cluster Port Status Owner    Data directory               Log file
9.5 main    5433 down   postgres /var/lib/postgresql/9.5/main /var/log/postgresql/postgresql-9.5-main.log

我們來升級吧,使用pg_upgradecluster

~$ pg_upgradecluster 9.5 main

等他跑完就行了。

升級失敗的情況

咦?有這麼簡單嗎? 其實我升級時遇到了extension的問題,因為沒有安裝相對應的extension在新版的資料庫沒辦法啟動。不過還好的是,因為我已經不需要使用那些extension了,所以我只需要把他們移除後,再操作升級即可。

首先因為失敗,我使用一次pg_dropcluster移除剛剛升級失敗的資料庫吧

~$ pg_dropcluster 14 main

接著啟動原本的資料庫並且啟動pg_ctlcluster 9.5 main start

連線到資料庫後,先來看看我們有什麼extension吧

postgres=# select * FROM pg_extension;
  oid  |    extname    | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+---------------+----------+--------------+----------------+------------+-----------+--------------
 13717 | plpgsql       |       10 |           11 | f              | 1.0        |           |
 16394 | fuzzystrmatch |       10 |         2200 | t              | 1.1        |           |
 16399 | postgis       |       10 |         2200 | t              | 1.1        |           |
(2 rows)

操作移除extension:

DROP EXTENSION postgis; 

接著就可以斷開連線再嘗試一次了。

~$ pg_ctlcluster 9.5 main stop # 停機
~$ pg_upgradecluster 9.5 main # 升級
~$ pg_ctlcluster 14 main start # 啟動
~$ pg_dropcluster 9.5 main # 確認無誤後移除舊資料庫吧

結語

以上是我的升級PostgreSQL資料庫的歷程,途中沒有確切的說明下完成升級,真是小有成就感呢。