升級方法 | 適用場景 | 停機(jī)時間 |
---|---|---|
邏輯備份與還原 | 中小型數(shù)據(jù)庫,例如小于 100 GB 支持跨平臺數(shù)據(jù)遷移 |
取決于數(shù)據(jù)庫的大小 |
pg_upgrade 工具 | 大中型數(shù)據(jù)庫,例如大于 100 GB 本機(jī)就地升級 |
幾分鐘 |
邏輯復(fù)制 | 大中型數(shù)據(jù)庫,例如大于 100 GB 跨平臺支持 |
幾秒鐘 |
是的
📝如果使用廠商提供的 PostgreSQL 定制版本,也可能通過他們提供的工具實(shí)現(xiàn)版本升級,具體參考相關(guān)文檔。
注意事項(xiàng):升級主要版本通過會導(dǎo)致用戶可見的不兼容性,因此應(yīng)用程序可能需要進(jìn)行相應(yīng)的修改。具體的變化可以參考發(fā)行說明,尤其是“Migration”部分的內(nèi)容;如果跨多個主要版本進(jìn)行升級,需要閱讀每個中間版本的發(fā)行說明。
傳統(tǒng)的跨版本升級方法利用 pg_dump/pg_dumpall 邏輯備份導(dǎo)出數(shù)據(jù)庫,然后在新版本中通過 pg_restore 進(jìn)行還原。導(dǎo)出舊版本數(shù)據(jù)庫時推薦使用新版本的 pg_dump/pg_dumpall 工具,可以利用最新的并行導(dǎo)出和還原功能,同時可以減少數(shù)據(jù)庫膨脹問題。
邏輯備份與還原非常簡單但速度比較慢,停機(jī)時間取決于數(shù)據(jù)庫的大小,因此適合中小型數(shù)據(jù)庫的升級。
下面我們介紹這種升級方法的具體操作,假如當(dāng)前 PostgreSQL 軟件的安裝目錄位于 /usr/local/pgsql,同時數(shù)據(jù)目錄位于 /usr/local/pgsql/data,我們在同一臺服務(wù)器上進(jìn)行升級。
執(zhí)行邏輯備份之前停止應(yīng)用程序,確保沒有數(shù)據(jù)更新,因?yàn)閭浞蓍_始后的更新不會被導(dǎo)出。如有必要,可以修改 /usr/local/pgsql/data/pg_hba.conf 文件禁止其他人訪問數(shù)據(jù)庫。
然后備份數(shù)據(jù)庫:
pg_dumpall > outputfile
如果已經(jīng)安裝了新版本的 PostgreSQL,可以使用新版本的 pg_dumpall 命令備份舊版本數(shù)據(jù)庫。
停止舊版本的后臺服務(wù):
pg_ctl stop
或者通過其他方式停止后臺服務(wù)。
如果安裝目錄沒有包含特定版本標(biāo)識,可以將目錄改名,必要時可以再修改回來??梢允褂妙愃埔韵碌拿钪孛夸洠?/p>
mv /usr/local/pgsql /usr/local/pgsql.old
安裝新版本 PostgreSQL 軟件,假如安裝目錄仍然是 /usr/local/pgsql。
初始化一個新的數(shù)據(jù)庫集群,需要使用數(shù)據(jù)庫專用用戶(通常是 postgres;如果是升級版本,應(yīng)該已經(jīng)存在該用戶)執(zhí)行操作:
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
將舊版本配置文件 pg_hba.conf 和 postgresql.conf 等中的改動在對應(yīng)的新配置文件中再次進(jìn)行修改。
使用數(shù)據(jù)庫專用用戶啟動新版本的后臺服務(wù):
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
最后,利用新版本的 psql 命令還原數(shù)據(jù):
/usr/local/pgsql/bin/psql -d postgres -f outputfile
為了減少停機(jī)時間,可以將新版本的 PostgreSQL 安裝到另一個目錄(例如 /usr/local/pgsql-13),同時使用不同的端口啟動服務(wù)。然后同時執(zhí)行數(shù)據(jù)庫的導(dǎo)出和導(dǎo)入:
pg_dumpall -p 5432 | psql -d postgres -p 5433
執(zhí)行以上操作時,新舊版本的后臺服務(wù)同時運(yùn)行,新版本使用 5433 端口,舊版本使用 5432 端口。
pg_upgrade 工具可以支持 PostgreSQL 跨版本的就地升級,不需要執(zhí)行導(dǎo)出和導(dǎo)入操作。pg_upgrade 可以支持 PostgreSQL 8.4.X 到最新版本的升級,包括快照版本和測試版本。
pg_upgrade 提供了升級前的兼容性檢查(-c 或者 --check 選項(xiàng))功能, 可以發(fā)現(xiàn)插件、數(shù)據(jù)類型不兼容等問題。如果指定了 --link 選項(xiàng),新版本服務(wù)可以直接使用原有的數(shù)據(jù)庫文件而不需要執(zhí)行復(fù)制,通常可以在幾分鐘內(nèi)完成升級操作。
下面我們介紹這種升級方法的具體操作,假如當(dāng)前 PostgreSQL 軟件的安裝目錄位于 /usr/pgsql-12/,同時數(shù)據(jù)目錄位于 /var/lib/pgsql/12/data/,我們將其升級為 PostgreSQL 13。
確定沒有客戶端訪問之后備份數(shù)據(jù)庫,然后停止舊版本的后臺服務(wù)。例如 CentOS 可以執(zhí)行以下命令:
sudo systemctl stop postgresql-12 sudo systemctl disable postgresql-12
安裝新版本的 PostgreSQL 軟件。例如 PostgreSQL 13.0,安裝目錄位于 /usr/pgsql-13/。
初始化新版本的數(shù)據(jù)庫集群。數(shù)據(jù)目錄設(shè)置為 /var/lib/pgsql/13/data/。
如果舊版本中安裝了擴(kuò)展模塊,在新版本中也需要安裝相應(yīng)的共享對象文件或者 DLL 文件。但是不要執(zhí)行CREATE EXTENSION
命令,因?yàn)闀呐f數(shù)據(jù)庫中進(jìn)行升級。另外,如果使用了任何自定義的全文搜索文件(字典、同義詞、詞庫、停用詞),也需要復(fù)制到新的數(shù)據(jù)庫集群目錄中。
停止新版本的后臺服務(wù)。例如 CentOS 可以執(zhí)行以下命令:
sudo systemctl stop postgresql-13
通過 pg_upgrade 執(zhí)行升級操作,使用數(shù)據(jù)庫專用用戶(通常是 postgres)執(zhí)行以下操作:
/usr/pgsql-13/bin/pg_upgrade \ --old-datadir /var/lib/pgsql/12/data/ \ --new-datadir /var/lib/pgsql/13/data/ \ --old-bindir /usr/pgsql-12/bin/ \ --new-bindir /usr/pgsql-13/bin/ \ --check
其中 --check 表示執(zhí)行升級檢查,而不會真的執(zhí)行升級操作。通過檢查之后,可以去掉該參數(shù)執(zhí)行升級:
/usr/pgsql-13/bin/pg_upgrade \ --old-datadir /var/lib/pgsql/12/data/ \ --new-datadir /var/lib/pgsql/13/data/ \ --old-bindir /usr/pgsql-12/bin/ \ --new-bindir /usr/pgsql-13/bin/ \ --link
其中 --link 表示將新版本的數(shù)據(jù)目錄硬鏈接到舊版本的數(shù)據(jù)目錄,而不會復(fù)制一份新的數(shù)據(jù)文件,可以快速進(jìn)行升級。
將舊版本配置文件 pg_hba.conf 和 postgresql.conf 等中的改動在對應(yīng)的新配置文件中再次進(jìn)行修改。
啟動新版本的后臺服務(wù)。例如 CentOS 可以執(zhí)行以下命令:
sudo systemctl start postgresql-13 sudo systemctl enable postgresql-13
連接服務(wù)器查看數(shù)據(jù)庫的版本信息:
SELECT version(); version | -------------------------------------------------------------------------------------------------------| PostgreSQL 13.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit|
收集統(tǒng)計(jì)信息。pg_upgrade 不會生成新版本數(shù)據(jù)庫的統(tǒng)計(jì)信息,但是會創(chuàng)建一個腳本文件,執(zhí)行該文件:
./analyze_new_cluster.sh
如果確認(rèn)升級成功,可以選擇刪除或者保留舊的數(shù)據(jù)庫軟件和集群。pg_upgrade 同樣提供了一個刪除舊數(shù)據(jù)庫集群的腳本:
./delete_old_cluster.sh
然后可以刪除舊版本的 PostgreSQL 軟件,例如 CentOS 可以執(zhí)行以下命令:
yum remove postgresql12*
如果想要回退到舊版本的數(shù)據(jù)庫,可以分為不同的情況:
關(guān)于 pg_upgrade 的詳細(xì)使用和升級注意事項(xiàng),例如流復(fù)制結(jié)構(gòu)和日志傳輸復(fù)制結(jié)構(gòu)中備用節(jié)點(diǎn)的升級,可以參考官方文檔。
PostgreSQL 邏輯復(fù)制支持跨版本之間的數(shù)據(jù)復(fù)制,而且支持不同平臺之間的復(fù)制,因此也可以用于實(shí)現(xiàn)版本升級。我們可以安裝一個新版本的數(shù)據(jù)庫作為復(fù)制的從節(jié)點(diǎn),當(dāng)數(shù)據(jù)已經(jīng)同步時執(zhí)行一次主從切換,然后關(guān)閉舊版本的主節(jié)點(diǎn)。主從切換的升級方法通常只需要幾秒鐘就能完成,利用第三方高可用組件甚至可以實(shí)現(xiàn)零停機(jī)時間升級。
PostgreSQL 10 開始提供了內(nèi)置的邏輯復(fù)制功能,或者也可以使用 pglogical、Slony、Londiste 以及 Bucardo 等邏輯復(fù)雜工具。
關(guān)于 PostgreSQL 邏輯復(fù)制結(jié)構(gòu)的創(chuàng)建和主從切換,可以參考官方文檔。
PostgreSQL 小版本升級只需要替換二進(jìn)制文件即可,跨版本升級的方案主要有 3 種:通過 pg_dump/pg_dumpall 邏輯備份與還原進(jìn)行升級,利用 pg_upgrade 工具進(jìn)行升級,使用邏輯復(fù)制功能進(jìn)行升級。了解它們的優(yōu)缺點(diǎn)和適用場景可以幫助我們選擇最佳的升級方式。
到此這篇關(guān)于PostgreSQL 數(shù)據(jù)庫跨版本升級常用方案解析的文章就介紹到這了,更多相關(guān)PostgreSQL 版本升級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:阜陽 通化 荊州 那曲 泰州 海北 齊齊哈爾 臨滄
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PostgreSQL 數(shù)據(jù)庫跨版本升級常用方案解析》,本文關(guān)鍵詞 PostgreSQL,數(shù)據(jù)庫,跨,版本,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。