如何為 RDS Postgre 執行主要版本升級SQL - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

如何為 RDS Postgre 執行主要版本升級SQL

在 Amazon RDS for PostgreSQL 資料庫上執行主要版本升級時,我們建議執行下列程序:

  1. 準備好版本相容的參數群組 – 如果您使用的是自訂參數群組,您有兩個選擇。您可以為新資料庫引擎版本指定預設參數群組。您也可以為新資料庫引擎版本建立自己的自訂參數群組。如需詳細資訊,請參閱 的參數組 RDS使用多可用區域資料庫叢集的資料庫叢集參數群組

  2. 檢查不支援的資料庫類別 – 檢查資料庫的執行個體類別是否與您升級至的 PostgreSQL 版本相容。如需詳細資訊,請參閱資料庫執行個體類別的支援資料庫引擎

  3. 檢查是否有不支援的使用:

    • 備妥交易 – 嘗試升級之前,遞交或轉返所有開啟的備妥交易。

      您可以使用下列查詢來確認資料庫上沒有開啟的預備交易。

      SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
    • Reg* 資料類型 – 嘗試升級之前,請移除所有 reg* 資料類型的使用。除了 regtyperegclass,您無法升級 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');
  4. 檢查無效資料庫:

    • 確保沒有無效的資料庫。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

    如需無效資料庫的詳細資訊,請參閱了解具有無效資料庫的自動清空行為。

  5. 處理邏輯複寫槽 - 如果資料庫具有任何邏輯複寫槽,就無法進行升級。邏輯複寫槽通常用於 AWS DMS 遷移,以及將資料表從資料庫複寫到資料湖、BI 工具和其他目標。升級之前,請確保您知道任何使用中邏輯複寫槽的用途,並確認可以刪除它們。如果邏輯複寫槽仍在使用,則不應刪除它們,也無法繼續升級。

    如果不需要邏輯複寫插槽,您可以使用下列 將其刪除SQL:

    SELECT * FROM pg_replication_slots; SELECT pg_drop_replication_slot(slot_name);

    使用 pglogical 延伸模組的邏輯複寫設定也必須具有捨棄的插槽,才能成功進行主要版本升級。如需如何識別和捨棄使用 pglogical 延伸模組所建立之插槽的相關資訊,請參閱 管理 forRDS Postgre 的SQL邏輯複寫槽

  6. 處理僅供讀取複本 - 升級單一可用區域資料庫執行個體或多可用區域資料庫執行個體部署時,也會升級區域內僅供讀取複本以及主要資料庫執行個體。Amazon RDS不會升級多可用區域資料庫叢集僅供讀取複本。

    您無法個別升級僅供讀取複本。如果可以,可能會導致主要資料庫和複本資料庫具有不同的 PostgreSQL 主要版本。不過,僅供讀取複本升級可能會增加主要資料庫執行個體的停機時間。若要防止僅供讀取複本升級,請將複本提升為獨立執行個體,或在開始升級程序之前刪除複本。

    升級程序會根據僅供讀取複本的目前參數群組,重新建立僅供讀取複本的參數群組。只有在升級完成後,您才能修改僅供讀取複本,以便將自訂參數群組套用至僅供讀取複本。如需僅供讀取複本的詳細資訊,請參閱 使用 Amazon RDS for Postgre 的僅供讀取複本SQL

  7. 執行備份 – 建議您先執行備份再執行主要版本升級,以便您的資料庫有已知的還原點。如果您的備份保留期大於 0,在升級前和升級後,升級程序會建立資料庫的資料庫快照。若要變更備份保留期,請參閱 修改 Amazon RDS 資料庫執行個體修改 Amazon 的多可用區域資料庫叢集 RDS

    若要手動執行備份,請參閱 為 Amazon 的單一可用區域資料庫執行個體建立資料庫快照 RDS為 Amazon 建立多可用區域資料庫叢集快照 RDS

  8. 在主要版本升級之前更新特定延伸套件 – 如果您計劃在升級時跳過主要版本,您必須在執行主要版本升級之前更新特定延伸套件。例如,從 9.5.x 或 9.6.x 版升級為 11.x 版會跳過主要版本。要更新的擴充功能包括用於處理空間資料的 PostGIS 和相關擴充功能。

    • address_standardizer

    • address_standardizer_data_us

    • postgis_raster

    • postgis_tiger_geocoder

    • postgis_topology

    針對您使用的每個擴充功能執行下列命令:

    ALTER EXTENSION PostgreSQL-extension UPDATE TO 'new-version';

    如需詳細資訊,請參閱在 中升級 PostgreSQL 資料庫RDS的 PostgreSQL 延伸模組。若要進一步了解升級 Post GIS,請參閱 步驟 6:升級貼文GIS擴充功能

  9. 在主要版本升級之前捨棄特定延伸套件 – 跳過主要版本升級為 11.x 版本時,不支援更新 pgRouting 延伸套件。從 9.4.x、9.5.x 或 9.6.x 版升級為 11.x 版會跳過主要版本。安全的做法是捨棄 pgRouting 延伸套件,然後在升級之後再重新安裝該延伸套件的相容版本。有關您可以更新的延伸套件版本,請參閱 支援的 PostgreSQL 延伸版本

    PostgreSQL 第 11 版或更新版本不再支援 tsearch2chkpass擴充功能。如果您升級為 11.x 版,請在升級之前捨棄 tsearch2chkpass 延伸套件。

  10. 刪除未知的資料類型 – 會根據目標版本丟棄 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';
  11. 執行升級停用試轉 – 強烈建議您先在生產資料庫的複本上測試主要版本升級,然後才在生產資料庫上嘗試此升級。您可以監控複寫測試資料庫上的執行計劃,以查看任何可能的執行計劃迴歸,並評估其效能。若要建立重複的測試執行個體,您可以從最近的快照還原資料庫,或將資料庫 point-in-time還原至最新的可還原時間。

    如需詳細資訊,請參閱 從快照還原將資料庫執行個體還原至 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。

    在主要版本升級期間,publictemplate1 資料庫,以及每個資料庫中的 public 結構描述都會暫時重新命名。這些物件將連同其原始名稱及附加的隨機字串出現在日誌中。字串會被附加上去,以便在主要版本升級期間保留 localeowner 之類的自訂設定。升級完成之後,物件就會改回其原始名稱。

    注意

    在主要版本升級過程中,您無法 point-in-time還原資料庫執行個體或多可用區域資料庫叢集。Amazon RDS執行升級後,需要自動備份資料庫。您可以在升級開始之前和資料庫的自動備份完成後,執行 point-in-time還原至 次。

  12. 如果升級失敗並發生預先檢查程序錯誤,請解決問題:在主要版本升級程序期間,Amazon RDS for PostgreSQL 會先執行預先檢查程序,以識別可能導致升級失敗的任何問題。預先檢查程序會檢查執行個體中所有資料庫的所有潛在不相容的狀況。

    如果預先檢查發現問題,會建立日誌事件以表示升級預先檢查失敗。資料庫的所有資料庫預先檢查程序詳細資訊位於名為 pg_upgrade_precheck.log 的升級日誌中。Amazon 會將時間戳記RDS附加至檔案名稱。如需檢視日誌檔案的詳細資訊,請參閱監控 Amazon RDS Amazon 日誌檔

    如果僅供讀取複本升級在預先檢查時失敗,失敗的僅供讀取複本上的複寫會中斷,而且僅供讀取複本會處於終止狀態。刪除僅供讀取複本並根據升級的主要資料庫執行個體重新建立新的僅供讀取複本。

    解決預先檢查日誌中列出的所有問題,然後重新嘗試主要版本升級。以下是預先檢查日誌範例。

    ------------------------------------------------------------------------ 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.
  13. 如果升級資料庫時僅供讀取複本升級失敗,請解決此問題 - 失敗的僅供讀取複本處於 incompatible-restore 狀態,且資料庫上的複寫終止。刪除僅供讀取複本並根據升級的主要資料庫執行個體重新建立新的僅供讀取複本。

    注意

    Amazon RDS不會升級多可用區域資料庫叢集的僅供讀取複本。如果您在多可用區域資料庫叢集上執行主要版本升級,則其僅供讀取複本的複寫狀態會變更為已終止的

    僅供讀取複本升級可能會因下列原因而失敗:

    • 即使在等待時間之後,它也無法趕上主要資料庫執行個體。

    • 它處於終止或不相容的生命週期狀態,例如儲存已滿、不相容還原等。

    • 當主要資料庫執行個體升級開始時,僅供讀取複本上正在執行個別的次要版本升級。

    • 僅供讀取複本使用的參數不相容。

    • 僅供讀取複本無法與主要資料庫執行個體通訊,以同步處理資料的資料夾。

  14. 升級生產資料庫 - 如果停用試轉主要版本升級成功,您應能放心升級生產資料庫。如需詳細資訊,請參閱手動升級引擎版本

  15. 執行 ANALYZE 操作以重新整理 pg_statistic 資料表。您應該對所有 PostgreSQL 資料庫上的每個資料庫執行此操作。主要版本升級期間不會傳輸最佳化工具統計數字,因此您需要重新產生所有統計數字以避免效能問題。在沒有任何參數的情況下執行命令,以產生目前資料庫中所有一般資料表的統計數字,如下所示:

    ANALYZE VERBOSE;

    您可選用 VERBOSE 旗標,但使用時會顯示進度。如需詳細資訊,請參閱 PostgreSQL 文件ANALYZE中的 。

    注意

    升級後ANALYZE在系統上執行,以避免效能問題。

主要版本升級完成後,建議您執行以下動作:

  • PostgreSQL 升級不會升級任何 PostgreSQL 延伸模組。若要升級延伸模組,請參閱 在 中升級 PostgreSQL 資料庫RDS的 PostgreSQL 延伸模組

  • 或者,使用 Amazon RDS 來檢視pg_upgrade公用程式產生的兩個日誌。這兩個記錄是 pg_upgrade_internal.logpg_upgrade_server.log。Amazon 會將時間戳記RDS附加到這些日誌的檔案名稱。您可以如同檢視任何其他日誌一般檢視這些日誌。如需詳細資訊,請參閱監控 Amazon RDS Amazon 日誌檔

    您也可以將升級日誌上傳至 Amazon CloudWatch Logs。如需詳細資訊,請參閱將郵件SQL日誌發佈到 Amazon CloudWatch 日誌

  • 為了確認所有作業皆符合預期,請在升級後的資料庫上,以類似的工作負載測試您的應用程式。確認升級之後,您可以刪除該測試執行個體。