Ubuntu PostgreSQL版本升級攻略
升級PostgreSQL是維護數據庫的重要環節,需根據版本類型(小版本/大版本)選擇合適方法,并嚴格遵循步驟以避免數據丟失。以下是詳細操作指南:
升級前必須備份,確保數據可恢復。使用pg_dumpall
導出所有數據庫(包括角色、表空間等):
sudo -u postgres pg_dumpall > /path/to/backup.sql
建議將備份文件存儲到遠程服務器或云存儲,避免本地磁盤故障導致數據丟失。
確認當前PostgreSQL版本,判斷升級路徑(如12→13為小版本,14→15為大版本):
sudo -u postgres psql -c "SELECT version();"
小版本升級通過apt
包管理器直接完成,步驟簡單且風險低:
sudo systemctl stop postgresql
sudo apt update
apt
會自動升級到該主版本下的最新小版本:sudo apt install postgresql-14
sudo systemctl start postgresql
psql --version # 或 sudo -u postgres psql -c "SELECT version();"
小版本升級無需數據遷移,升級后檢查數據庫功能是否正常即可。
大版本升級需更換數據庫集群,推薦使用pg_upgrade
工具(快速)或邏輯轉儲(安全),以下分別介紹:
pg_upgrade
是PostgreSQL官方提供的升級工具,直接遷移數據文件,耗時短,但需滿足版本兼容性(如14→15支持,10→12不支持)。
若當前Ubuntu版本未包含目標大版本,需添加PostgreSQL官方APT倉庫:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
安裝目標大版本(如15),不覆蓋舊版本:
sudo apt install postgresql-15
sudo systemctl stop postgresql
新版本會自動初始化集群,但需確認目錄(如/var/lib/postgresql/15/main
)是否存在。
檢查兼容性(可選但推薦):
sudo -u postgres /usr/lib/postgresql/15/bin/pg_upgrade \
-b /usr/lib/postgresql/14/bin \ # 舊版本二進制目錄
-B /usr/lib/postgresql/15/bin \ # 新版本二進制目錄
-d /var/lib/postgresql/14/main \ # 舊版本數據目錄
-D /var/lib/postgresql/15/main \ # 新版本數據目錄
--check
若輸出“Check successful”,則可繼續。
執行升級:
sudo -u postgres /usr/lib/postgresql/15/bin/pg_upgrade \
-b /usr/lib/postgresql/14/bin \
-B /usr/lib/postgresql/15/bin \
-d /var/lib/postgresql/14/main \
-D /var/lib/postgresql/15/main \
-o '-c config_file=/etc/postgresql/14/main/postgresql.conf' \ # 舊版本配置文件路徑
-O '-c config_file=/etc/postgresql/15/main/postgresql.conf' # 新版本配置文件路徑
升級后需更新統計信息,優化查詢性能:
sudo -u postgres /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages
sudo systemctl start postgresql@15-main # 啟動新版本
sudo systemctl stop postgresql@14-main # 可選:停止舊版本(需確認新版本正常)
若pg_upgrade
不支持(如10→12),或需要跨平臺遷移,可使用邏輯轉儲,步驟如下:
sudo -u postgres pg_dumpall -f /path/to/backup.sql
同方法一的步驟2。
sudo /usr/lib/postgresql/15/bin/initdb -D /var/lib/postgresql/15/main/
sudo systemctl start postgresql@15-main
sudo -u postgres psql -f /path/to/backup.sql postgres
sudo -u postgres psql -c "SELECT version();"
pg_upgrade
(快速,適合生產環境);pg_upgrade
不支持或需跨平臺,使用邏輯轉儲(安全,適合復雜環境)。若使用pg_upgrade
,舊版本的postgresql.conf
、pg_hba.conf
會自動復制到新目錄(如/etc/postgresql/15/main/
)。需檢查以下配置:
sudo sed -i 's/port = 5432/port = 5433/' /etc/postgresql/15/main/postgresql.conf
pg_hba.conf
中的認證方式(如md5
、scram-sha-256
)符合需求,避免無法登錄。sudo systemctl start postgresql@15-main
sudo systemctl stop postgresql@14-main
psql -p 5433 -U postgres -c "SELECT version();" # 替換為新版本端口
檢查數據庫功能(如創建表、查詢數據)是否正常。
確認新版本運行穩定后,卸載舊版本軟件包并刪除舊集群:
sudo apt remove --purge postgresql-14 postgresql-server-dev-14 # 卸載舊版本
sudo rm -rf /etc/postgresql/14/ /var/lib/postgresql/14/ # 刪除舊配置和數據
若停止了舊版本,可重啟新版本服務:
sudo systemctl restart postgresql
若pg_upgrade
報錯“permission denied”,需確保舊數據目錄和新數據目錄的權限正確:
sudo chown -R postgres:postgres /var/lib/postgresql/14/main/
sudo chown -R postgres:postgres /var/lib/postgresql/15/main/
若新舊版本的postgresql.conf
有沖突(如max_connections
),需手動合并,優先保留新版本的配置。
升級后,部分擴展(如postgis
)可能需要重新安裝:
sudo apt install postgis postgresql-15-postgis # 示例:重新安裝postgis
通過以上步驟,可順利完成Ubuntu環境下PostgreSQL的版本升級。務必牢記:備份是升級的前提,選擇合適的升級方法,并仔細檢查每一步的操作結果。