本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
如何執行 RDS for PostgreSQL 的主要版本升級
在 Amazon RDS for PostgreSQL 資料庫上執行主要版本升級時,我們建議採取以下程序:
-
準備好版本相容的參數群組 – 如果您使用的是自訂參數群組,您有兩個選擇。您可以為新資料庫引擎版本指定預設參數群組。您也可以為新資料庫引擎版本建立自己的自訂參數群組。如需詳細資訊,請參閱Amazon RDS 的參數群組及使用多可用區域資料庫叢集的資料庫叢集參數群組。
-
檢查不支援的資料庫類別 - 檢查資料庫的執行個體類別是否與您要升級的目標 PostgreSQL 版本相容。如需詳細資訊,請參閱資料庫執行個體類別的支援資料庫引擎。
-
檢查是否有不支援的使用:
-
備妥交易 – 嘗試升級之前,遞交或轉返所有開啟的備妥交易。
您可以使用下列查詢來確認資料庫上沒有開啟的預備交易。
SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
-
Reg* 資料類型 – 嘗試升級之前,請移除所有 reg* 資料類型的使用。除了
regtype
和regclass
,您無法升級 reg* 資料類型。pg_upgrade
公用程式無法保留此資料類型,Amazon RDS 會使用該資料類型進行升級。您可以使用下列查詢,確認在每個資料庫中未使用不支援的 reg* 資料類型:
SELECT count(*) FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_attribute a WHERE c.oid = a.attrelid AND NOT a.attisdropped AND a.atttypid IN ('pg_catalog.regproc'::pg_catalog.regtype, 'pg_catalog.regprocedure'::pg_catalog.regtype, 'pg_catalog.regoper'::pg_catalog.regtype, 'pg_catalog.regoperator'::pg_catalog.regtype, 'pg_catalog.regconfig'::pg_catalog.regtype, 'pg_catalog.regdictionary'::pg_catalog.regtype) AND c.relnamespace = n.oid AND n.nspname NOT IN ('pg_catalog', 'information_schema');
-
-
檢查無效資料庫:
-
確保沒有無效的資料庫。
pg_database
目錄中的datconnlimit
欄包含值-2
,可將在DROP DATABASE
操作期間中斷的資料庫標記為無效。使用下列查詢來檢查無效的資料庫:
SELECT datname FROM pg_database WHERE datconnlimit = - 2;
-
先前的查詢會傳回無效的資料庫名稱。您可以使用
DROP DATABASE
捨棄無效的資料庫。您也可以使用下列命令捨棄無效的資料庫:invalid_db_name
;SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datconnlimit = -2 \gexec
如需無效資料庫的詳細資訊,請參閱了解具有無效資料庫的自動清空行為。
-
-
處理邏輯複寫槽 - 如果資料庫具有任何邏輯複寫槽,就無法進行升級。邏輯複寫槽通常用於 AWS DMS 遷移,以及將資料表從資料庫複寫到資料湖、BI 工具和其他目標。升級之前,請確保您知道任何使用中邏輯複寫槽的用途,並確認可以刪除它們。如果邏輯複寫槽仍在使用,則不應刪除它們,也無法繼續升級。
如果不需要邏輯複寫槽,可以使用以下 SQL 加以刪除:
SELECT * FROM pg_replication_slots WHERE slot_type NOT LIKE 'physical'; SELECT pg_drop_replication_slot(slot_name);
使用
pglogical
延伸模組的邏輯複寫設定也必須具有捨棄的插槽,才能成功進行主要版本升級。如需如何識別和捨棄使用pglogical
延伸模組所建立之插槽的相關資訊,請參閱 管理 forRDS Postgre 的SQL邏輯複寫槽。 -
處理僅供讀取複本 - 升級單一可用區域資料庫執行個體或多可用區域資料庫執行個體部署時,也會升級區域內僅供讀取複本以及主要資料庫執行個體。Amazon RDS 不會升級多可用區域資料庫叢集讀取複本。
您無法個別升級僅供讀取複本。如果可以,它可能會導致主要資料庫和複本資料庫具有不同 PostgreSQL 主要版本的情況。不過,僅供讀取複本升級可能會增加主要資料庫執行個體的停機時間。若要防止僅供讀取複本升級,請將複本提升為獨立執行個體,或在開始升級程序之前刪除複本。
升級程序會根據僅供讀取複本的目前參數群組,重新建立僅供讀取複本的參數群組。只有在升級完成後,您才能修改僅供讀取複本,以便將自訂參數群組套用至僅供讀取複本。如需僅供讀取複本的詳細資訊,請參閱 使用 Amazon RDS for PostgreSQL 的僅供讀取複本。
-
處理零 ETL 整合 – 如果您有現有的零 ETL 整合,請在執行主要版本升級之前將其刪除。然後,完成升級後,重新建立整合。
-
執行備份 – 建議您先執行備份再執行主要版本升級,以便您的資料庫有已知的還原點。如果您的備份保留期大於 0,在升級前和升級後,升級程序會建立資料庫的資料庫快照。若要變更備份保留期,請參閱 修改 Amazon RDS 資料庫執行個體 和 修改 Amazon RDS 的多可用區域資料庫叢集。
若要手動執行備份,請參閱 為 Amazon 的單一可用區域資料庫執行個體建立資料庫快照 RDS 和 為 Amazon 建立多可用區域資料庫叢集快照 RDS。
-
在主要版本升級之前更新特定延伸套件 – 如果您計劃在升級時跳過主要版本,您必須在執行主要版本升級之前更新特定延伸套件。例如,從 9.5.x 或 9.6.x 版升級為 11.x 版會跳過主要版本。要更新的擴充功能包括 PostGIS 和用於處理空間資料的相關擴充功能。
-
address_standardizer
-
address_standardizer_data_us
-
postgis_raster
-
postgis_tiger_geocoder
-
postgis_topology
如果您使用 4.6.0 版及更低
rdkit
版本,以及 PostgreSQL 16 版及更低版本,由於rdkit
不相容,您無法直接升級至 PostgreSQL 17 版。以下是升級選項:-
如果您使用的是 PostgreSQL 第 13 版及更低版本,則需要先執行主要版本升級至 14.14 版及更高版本 14、15.9 及更高版本 15 或 16.5 及更高版本,然後執行版本升級至 PostgreSQL 17。
-
如果您使用的是 PostgreSQL 第 14、15 或 16 版,則需要執行次要版本升級至 14.14 及更新的 14 版本、15.9 及更新的 15 版本,或 16.5 及更新的 16 版本,然後升級至 PostgreSQL 第 17 版。
針對您使用的每個擴充功能執行下列命令:
ALTER EXTENSION
PostgreSQL-extension
UPDATE TO 'new-version
';如需詳細資訊,請參閱在 中升級 PostgreSQL 資料庫RDS的 PostgreSQL 延伸模組。若要進一步了解 PostGIS 升級的詳細資訊,請參閱 步驟 6:升級貼文GIS擴充功能。
-
-
在主要版本升級之前捨棄特定延伸套件 – 跳過主要版本升級為 11.x 版本時,不支援更新
pgRouting
延伸套件。從 9.4.x、9.5.x 或 9.6.x 版升級為 11.x 版會跳過主要版本。安全的做法是捨棄pgRouting
延伸套件,然後在升級之後再重新安裝該延伸套件的相容版本。有關您可以更新的延伸套件版本,請參閱 支援的 PostgreSQL 延伸版本。PostgreSQL 11 或以上版本不再支援
tsearch2
和chkpass
延伸套件。如果您升級為 11.x 版,請在升級之前捨棄tsearch2
和chkpass
延伸套件。 -
刪除未知的資料類型 – 會根據目標版本丟棄
unknown
資料類型。PostgreSQL 第 10 版已停止支援
unknown
資料類型。如果第 9.6 版資料庫使用unknown
資料類型,升級至版本 10 會顯示錯誤訊息,如下所示:Database instance is in a state that cannot be upgraded: PreUpgrade checks failed: The instance could not be upgraded because the 'unknown' data type is used in user tables. Please remove all usages of the 'unknown' data type and try again."
若要尋找資料庫中的
unknown
資料類型,以便移除違規資料行或將其變更為支援的資料類型,請使用下列 SQL:SELECT DISTINCT data_type FROM information_schema.columns WHERE data_type ILIKE 'unknown';
-
執行升級停用試轉 – 強烈建議您先在生產資料庫的複本上測試主要版本升級,然後才在生產資料庫上嘗試此升級。您可以監控複寫測試資料庫上的執行計劃,以查看任何可能的執行計劃迴歸,並評估其效能。若要建立複本測試執行個體,您可以從最近快照還原資料庫,或使用時間點將資料庫還原至其最新的可還原時間。
如需詳細資訊,請參閱「從快照還原」或「將資料庫執行個體還原至 Amazon RDS 的指定時間」。若是多可用區域資料庫叢集,請參閱 從快照還原至多可用區域資料庫叢集 或 將多可用區域資料庫叢集還原至指定時間。
如需執行升級的詳細資訊,請參閱 手動升級引擎版本。
將 9.6 版資料庫升級到第 10 版時,請注意 PostgreSQL 10 會預設啟用平行查詢。升級之前,您可以在測試資料庫上將
max_parallel_workers_per_gather
參數變更為 2,藉此測試平行處理的影響。注意
在
default.postgresql10
資料庫參數群組中,max_parallel_workers_per_gather
參數的預設值為 2。如需詳細資訊,請參閱 PostgreSQL 說明文件中的平行查詢
。若要在第 10 版上停用平行處理,請將 max_parallel_workers_per_gather
參數設為 0。在主要版本升級期間,
public
和template1
資料庫,以及每個資料庫中的public
結構描述都會暫時重新命名。這些物件將連同其原始名稱及附加的隨機字串出現在日誌中。字串會被附加上去,以便在主要版本升級期間保留locale
和owner
之類的自訂設定。升級完成之後,物件就會改回其原始名稱。注意
在主要版本升級過程中,您不能進行資料庫執行個體或多可用區域資料庫叢集的時間點還原。Amazon RDS 執行升級後,會自動進行資料庫備份。您可以執行時間點還原,以便還原至升級開始之前的時間,以及資料庫的自動備份完成之後的時間。
-
如果預先檢查程序發生錯誤而升級失敗,請解決這些問題 – 在主要版本升級過程中,Amazon RDS for PostgreSQL 會先執行預先檢查程序,以找出可能導致升級失敗的任何問題。預先檢查程序會檢查執行個體中所有資料庫的所有潛在不相容的狀況。
如果預先檢查發現問題,會建立日誌事件以表示升級預先檢查失敗。資料庫的所有資料庫預先檢查程序詳細資訊位於名為
pg_upgrade_precheck.log
的升級日誌中。Amazon RDS 會將時間戳記附加至檔案名稱。如需檢視日誌檔案的詳細資訊,請參閱監控 Amazon RDS 日誌檔案。如果僅供讀取複本升級在預先檢查時失敗,失敗的僅供讀取複本上的複寫會中斷,而且僅供讀取複本會處於終止狀態。刪除僅供讀取複本並根據升級的主要資料庫執行個體重新建立新的僅供讀取複本。
解決預先檢查日誌中列出的所有問題,然後重新嘗試主要版本升級。以下是預先檢查日誌範例。
------------------------------------------------------------------------ Upgrade could not be run on Wed Apr 4 18:30:52 2018 ------------------------------------------------------------------------- The instance could not be upgraded from 9.6.11 to 10.6 for the following reasons. Please take appropriate action on databases that have usage incompatible with the requested major engine version upgrade and try the upgrade again. * There are uncommitted prepared transactions. Please commit or rollback all prepared transactions.* One or more role names start with 'pg_'. Rename all role names that start with 'pg_'. * The following issues in the database 'my"million$"db' need to be corrected before upgrading:** The ["line","reg*"] data types are used in user tables. Remove all usage of these data types. ** The database name contains characters that are not supported by RDS for PostgreSQL. Rename the database. ** The database has extensions installed that are not supported on the target database version. Drop the following extensions from your database: ["tsearch2"]. * The following issues in the database 'mydb' need to be corrected before upgrading:** The database has views or materialized views that depend on 'pg_stat_activity'. Drop the views.
-
如果升級資料庫時僅供讀取複本升級失敗,請解決此問題 - 失敗的僅供讀取複本處於
incompatible-restore
狀態,且資料庫上的複寫終止。刪除僅供讀取複本並根據升級的主要資料庫執行個體重新建立新的僅供讀取複本。注意
Amazon RDS 不會升級多可用區域資料庫叢集的僅供讀取複本。如果您在多可用區域資料庫叢集上執行主要版本升級,則其僅供讀取複本的複寫狀態會變更為已終止。
僅供讀取複本升級可能會因下列原因而失敗:
-
即使在等待時間之後,它也無法趕上主要資料庫執行個體。
-
它處於終止或不相容的生命週期狀態,例如儲存已滿、不相容還原等。
-
當主要資料庫執行個體升級開始時,僅供讀取複本上正在執行個別的次要版本升級。
-
僅供讀取複本使用的參數不相容。
-
僅供讀取複本無法與主要資料庫執行個體通訊,以同步處理資料的資料夾。
-
-
升級生產資料庫 - 如果停用試轉主要版本升級成功,您應能放心升級生產資料庫。如需詳細資訊,請參閱手動升級引擎版本。
-
執行
ANALYZE
操作以重新整理pg_statistic
資料表。您應為所有 PostgreSQL 資料庫上的每個資料庫執行此操作。主要版本升級期間不會傳輸最佳化工具統計數字,因此您需要重新產生所有統計數字以避免效能問題。在沒有任何參數的情況下執行命令,以產生目前資料庫中所有一般資料表的統計數字,如下所示:ANALYZE VERBOSE;
您可選用
VERBOSE
旗標,但使用時會顯示進度。如需詳細資訊,請參閱 PostgreSQL 說明文件中的 ANALYZE。 分析特定資料表而非使用 ANALYZE VERBOSE 時,請對每個資料表執行 ANALYZE 命令,如下所示:
ANALYZE
table_name
;對於分割的資料表,請一律分析父資料表。此程序:
-
自動取樣所有分割區的資料列
-
以遞迴方式更新每個分割區的統計資料
-
在父層級維護基本的規劃統計資料
雖然父資料表不會存放實際資料,但分析它們對於查詢最佳化至關重要。僅在個別分割區上執行 ANALYZE 可能會導致查詢效能不佳,因為最佳化工具不會擁有有效跨分割區規劃所需的完整統計資料。
注意
升級後在系統上執行 ANALYZE,以避免效能問題。
-
主要版本升級完成後,建議您執行以下動作:
-
PostgreSQL 升級並不會升級任何 PostgreSQL 延伸套件。若要升級延伸模組,請參閱 在 中升級 PostgreSQL 資料庫RDS的 PostgreSQL 延伸模組。
-
或者,使用 Amazon RDS 來檢視
pg_upgrade
公用程式產生的兩個日誌。這兩個記錄是pg_upgrade_internal.log
和pg_upgrade_server.log
。Amazon RDS 會將時間戳記附加至這些日誌的檔案名稱。您可以如同檢視任何其他日誌一般檢視這些日誌。如需詳細資訊,請參閱 監控 Amazon RDS 日誌檔案。您也可以將升級日誌上傳至 Amazon CloudWatch Logs。如需詳細資訊,請參閱 將 PostgreSQL 日誌發佈至 Amazon CloudWatch Logs。
-
為了確認所有作業皆符合預期,請在升級後的資料庫上,以類似的工作負載測試您的應用程式。確認升級之後,您可以刪除該測試執行個體。