本節討論如何將資料庫資料從一個 PostgreSQL 版本升級到較新的版本。
目前的 PostgreSQL 版本號碼由一個主要版本號碼和一個次要版本號碼組成。例如,在版本號碼 10.1 中,10 是主要版本號碼,1 是次要版本號碼,表示這是主要版本 10 的第一個次要版本。在 PostgreSQL 10.0 之前的版本中,版本號碼由三個數字組成,例如 9.5.3。在這種情況下,主要版本由版本號碼的前兩個數字組組成,例如 9.5,次要版本是第三個數字,例如 3,表示這是主要版本 9.5 的第三個次要版本。
次要版本永遠不會更改內部儲存格式,並且始終與相同主要版本號碼的先前和後續次要版本相容。例如,版本 10.1 與版本 10.0 和版本 10.6 相容。同樣,例如,9.5.3 與 9.5.0、9.5.1 和 9.5.6 相容。要在相容版本之間更新,您只需在伺服器關閉時更換可執行檔並重新啟動伺服器即可。資料目錄保持不變 — 次要升級就是這麼簡單。
對於 主要 版本的 PostgreSQL,內部資料儲存格式可能會發生變更,從而使升級變得複雜。將資料移至新主要版本的傳統方法是傾印和還原資料庫,儘管這可能很慢。一種更快的方法是 pg_upgrade。複寫方法也可用,如下所述。(如果您使用的是預先封裝版本的 PostgreSQL,它可能會提供腳本來協助進行主要版本升級。有關詳細資訊,請參閱封裝層級的文件。)
新的主要版本通常也會引入一些使用者可見的不相容性,因此可能需要變更應用程式程式設計。所有使用者可見的變更都列在發布說明中(附錄 E);請特別注意標題為「遷移」的部分。儘管您可以從一個主要版本升級到另一個主要版本,而無需升級到中間版本,但您應該閱讀所有中間版本的主要版本說明。
謹慎的使用者希望在完全切換之前在新版本上測試他們的用戶端應用程式;因此,設置新舊版本的並行安裝通常是一個好主意。在測試 PostgreSQL 主要升級時,請考慮以下幾類可能的變更
管理員可用於監控和控制伺服器的功能通常會在每個主要版本中發生變化和改進。
通常這包括新的 SQL 命令功能,而不是行為的變更,除非在發布說明中特別提及。
通常,像 libpq 這樣的程式庫只會添加新功能,除非再次在發布說明中提及。
系統目錄變更通常只會影響資料庫管理工具。
這涉及後端函數 API 的變更,後端函數 API 是用 C 程式語言編寫的。此類變更會影響引用伺服器深處的後端函數的程式碼。
一種升級方法是從一個主要版本的 PostgreSQL 傾印資料,並將其還原到另一個版本中 — 為此,您必須使用像 pg_dumpall 這樣的 邏輯 備份工具;檔案系統層級的備份方法將不起作用。(有檢查機制可以防止您將資料目錄與不相容版本的 PostgreSQL 一起使用,因此嘗試在資料目錄上啟動錯誤的伺服器版本不會造成太大損害。)
建議您使用pg_dump和pg_dumpall程式,這些程式來自較新版本的PostgreSQL,以便利用這些程式中可能進行的增強功能。目前發布的傾印程式可以讀取從 9.2 開始的任何伺服器版本的資料。
這些指示假設您現有的安裝位於/usr/local/pgsql
目錄下,並且資料區域位於/usr/local/pgsql/data
中。請適當地替換您的路徑。
如果正在進行備份,請確保您的資料庫沒有正在更新。這不會影響備份的完整性,但已變更的資料當然不會包含在內。如有必要,請編輯/usr/local/pgsql/data/pg_hba.conf
(或等效檔案)中的權限,以禁止除您以外的所有人存取。有關存取控制的更多資訊,請參閱第 20 章。
pg_dumpall > outputfile
要進行備份,您可以使用您目前執行的版本的pg_dumpall命令;請參閱第 25.1.2 節以取得更多詳細資訊。然而,為了獲得最佳結果,請嘗試使用來自PostgreSQL 17.2 的pg_dumpall命令,因為此版本包含比舊版本更多的錯誤修復和改進。儘管這個建議可能看起來很奇怪,因為您尚未安裝新版本,但如果您計劃與舊版本並行安裝新版本,則建議遵循此建議。在這種情況下,您可以正常完成安裝,然後再傳輸資料。這也將減少停機時間。
關閉舊伺服器
pg_ctl stop
在啟動時啟動PostgreSQL的系統上,可能會有一個啟動檔案可以完成相同的事情。例如,在Red Hat Linux系統上,可能會發現這有效
/etc/rc.d/init.d/postgresql stop
有關啟動和停止伺服器的詳細資訊,請參閱第 18 章。
如果從備份還原,請重新命名或刪除舊的安裝目錄(如果它不是特定於版本的)。最好重新命名目錄,而不是刪除它,以防您遇到麻煩並且需要恢復到它。請記住,該目錄可能會佔用大量的磁碟空間。要重新命名目錄,請使用類似這樣的命令
mv /usr/local/pgsql /usr/local/pgsql.old
(請務必將目錄作為一個單元移動,以便相對路徑保持不變。)
如第 17 章所述,安裝新版本的PostgreSQL。
如果需要,請建立一個新的資料庫叢集。請記住,您必須以特殊的資料庫使用者帳戶登入才能執行這些命令(如果您正在升級,您已經擁有該帳戶)。
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
還原您之前的pg_hba.conf
和任何postgresql.conf
修改。
再次使用特殊的資料庫使用者帳戶啟動資料庫伺服器
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
最後,使用以下命令從備份還原您的資料:
/usr/local/pgsql/bin/psql -d postgres -f outputfile
使用新的 psql。
最小的停機時間可以通過將新伺服器安裝在不同的目錄中,並在不同的連接埠上並行運行舊伺服器和新伺服器來實現。然後,您可以使用類似的東西
pg_dumpall -p 5432 | psql -d postgres -p 5433
來傳輸您的資料。
pg_upgrade 模組允許將安裝從一個主要的 PostgreSQL 版本就地遷移到另一個版本。升級可以在幾分鐘內完成,特別是使用 --link
模式。它需要類似於上面 pg_dumpall 的步驟,例如,啟動/停止伺服器,運行 initdb。pg_upgrade 文件概述了必要的步驟。
也可以使用邏輯複寫方法來建立一個具有更新版本的 PostgreSQL 的備用伺服器。這是可能的,因為邏輯複寫支援不同主要版本的 PostgreSQL 之間的複寫。備用伺服器可以位於同一台電腦上或不同的電腦上。一旦它與主要伺服器(運行較舊版本的 PostgreSQL)同步,您可以切換主要伺服器,使備用伺服器成為主要伺服器並關閉較舊的資料庫實例。這種切換只會導致升級停機幾秒鐘。
這種升級方法可以使用內建的邏輯複寫設施,以及使用外部邏輯複寫系統,例如 pglogical、Slony、Londiste 和 Bucardo 來執行。
如果您在文件中發現任何不正確、與您特定功能的經驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。