【PostgreSQL】PostgreSQL 資料庫11 升級至 14 以解決連線耗盡問題

透過監控資料庫Server 發現,有一些查詢完成之後,該連線的狀態會進入idle,但是過了很久都沒有釋放掉資源
這些舊的connection 沒辦法重用,也佔掉了連線數,導致connection leak
不過PostgreSQL 官方似乎有解法

研究

https://stackoverflow.com/questions/44275684/postgres-sessions-are-idle-with-query-commit-or-rollback
https://stackoverflow.com/questions/13236160/is-there-a-timeout-for-idle-postgresql-connections

雖然研究發現連線進入這樣的狀況似乎是正常的,但是耗盡連線的問題還是存在啊,坊間解法有三種:

  1. 跑排程重開程式,就會強制關閉所有連線:治標不治本,如果將來用量大增總不可能提高重開頻率,一定會影響到系統運作
  2. 使用pgBouncer 管理connection pool:多裝一個套件,偵錯或出問題就會多一層的難度
  3. 跑排程下SQL 清掉idle 連線:即使有交接給後手,不利於未來維護

後來發現PostgreSQL 官方似乎也有注意到這個問題
在PostgreSQL 14 版的設定檔裡面加入了專門處理這種狀況的設定值:idle_session_timeout
最終決定採用這個方法,原因是要保持"As Simple As Possible",如果內建功能就可以達成,就不要再走旁門左道了
不過目前系統使用版本是11,所以就要來研究如何升級了

測試

首先先用自己的電腦測試這個設定值真的可以達到預期的效果,不然花了大把時間研究升級,結果最後發現無法改善問題就白做了
可以去 postgresql.conf 裡面找到設定值,修改完設定之後重啟服務,設定才會生效

實作

參考官方的升級說明:https://www.postgresql.org/docs/current/pgupgrade.html
以及坊間文章:https://feriman.com/upgrade-postgresql-from-11-to-13-on-centos-7/
http://dbaselife.com/project-13/doc-1232/

透過pg_upgrade 升級資料庫,官方文件中有很多步驟在說明自定義的路徑要怎麼處理,因為系統都是使用預設路徑安裝,所以可以跳過。從 第三點-安裝新版本 開始

先更新dnf ,再引用repository

dnf -y update
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm 

更新之後還是抓不到14 版,後來發現包含14 版的repos 名稱是pgdg-redhat-all.repo.rpmnew
把原本的pgdg-redhat-all.repo先備份更改名稱為pgdg-redhat-all.repo.backup
並把pgdg-redhat-all.repo.rpmnew重新命名,就可以抓到了

// 安裝
dnf -y install postgresql14-server postgresql14-contrib

// 初始化
/usr/pgsql-14/bin/postgresql-14-setup initdb

// 設定開機啟動服務 (可省略)
systemctl enable postgresql-14

// 確認可以啟動PostgreSQL 14
systemctl start postgresql-14

// 關閉服務
systemctl stop postgresql-14

// 切換成使用者 postgres
su - postgres

// 切換到一個有寫入權限的目錄 (稍後會進行檢查動作,會在當下的目錄產生log 檔案)
cd /xxx/xxx/xxxxxx

接著需要調整一些連線的設定

  1. 設定兩個版本的pg_hba.conf,將local 的 method 設定為 trust
  2. 建立.pgpass 檔案

打了一長串指令進行檢查之後,出現:Clusters are compatible,代表通過檢查

檢查通過之後,再把--check 拿掉進行正式的升級
完成之後畫面上會提示一些東西,但是我還沒記下來就先把它重新開機了….
升級完成之後記得複製設定檔到新版本上
接著就可以正常使用了