本節討論如何將資料庫資料從一個 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 版本一起使用,因此嘗試在資料目錄上啟動錯誤伺服器版本不會造成太大損害。)
建議使用較新 PostgreSQL 版本的 pg_dump 和 pg_dumpall 程式,以利用這些程式中可能進行的增強功能。當前版本的轉儲程式可以讀取從 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 18.0 的 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。
如果您在文件中看到任何不正確的內容、與您對特定功能的體驗不符的內容或需要進一步澄清的內容,請使用此表單報告文件問題。