全部產品
Search
文件中心

ApsaraDB RDS:通過本地升級模式升級大版本

更新時間:Dec 04, 2025

本文介紹如何通過本地升級的模式升級RDS PostgreSQL資料庫大版本。

前提條件

背景資訊

在本地升級模式下,使用pg_upgrade將原執行個體升級到目標版本。同時,保留所有元資訊,包括原執行個體配置和賬單資訊等。

RDS PostgreSQL控制台還支援通過零停機模式藍綠部署模式升級資料庫大版本,不同模式的對比請參見大版本升級方案簡介

升級費用

免費

注意事項

  • 業務影響:在切換過程中,執行個體將會被設定為唯讀,並會造成分鐘級業務閃斷,請在業務低峰期進行升級。

    唯讀時間的長短與資料庫物件數量相關,執行個體資料庫物件數越多,唯讀時間越長,當資料庫物件數達到百萬層級時,唯讀時間可能達到十分鐘級甚至小時級。您可以使用SELECT count(1) FROM pg_class;命令查看資料庫的對象數。

  • 執行個體規格:若升級過程中執行個體未達推薦規格,系統將自動嘗試使用推薦規格進行升級。這將導致分鐘級的唯讀狀態,並額外出現一次秒級閃斷。建議升級前,處理大版本升級檢查報告中關於執行個體規格的警示。

  • 複製槽(Replication Slots)

  • 參數變化

    • 如果原執行個體使用了新版本不支援的參數,在新版本中該參數會被自動刪除。

    • 如果原執行個體的參數取值不在新版本對應參數取值的合法區間,則在新版本中,該參數將被設定為該版本參數模板的預設值。

    • 升級過程中,系統會暫時將statement_timeout的值修改為0,並在升級完成後恢複為原值。

  • DTS任務:如果待升級的執行個體作為Data Transmission Service(DTS)的源執行個體或目標執行個體,則升級後需要重建DTS任務

  • 外掛程式相容性問題:進行大版本升級時,系統將自動更新至最新的核心小版本,可能會遇到外掛程式相容性問題

  • 執行個體備份:在升級前後,均會對執行個體進行全量備份,以便於後續的複製恢複。

步驟一:升級前檢查

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. (可選)如果待升級的執行個體中建立了唯讀執行個體,需要將應用程式中配置的唯讀執行個體串連地址修改為主執行個體串連地址,並刪除唯讀執行個體。

    說明

    為保證業務穩定,建議在業務低峰期修改應用串連地址。

  3. 在左側導覽列單擊大版本升級

    說明

    如果左側導覽列中沒有大版本升級,請檢查RDS PostgreSQL執行個體版本及配置,具體請參見前提條件

  4. 升级检查頁簽中,單擊创建升级检查报告

  5. 擇選升級版本,且升级模式選擇本地升级後,單擊確定

    此時,執行個體狀態變為實例維護中,待升級檢查完成後,執行個體狀態會變為執行中

    當升級檢查報告結果為成功警告時,可以進行後續的大版本升級步驟;若結果為失败,則需單擊查看資訊,根據報告內容修複異常檢查項後,再次進行升級前檢查。常見的報錯及原因請參見解讀RDS PostgreSQL大版本升級檢查報告

    重要
    • 為確保升級順利完成,當升級檢查報告的檢查結果為警告時,建議根據報告內容修複異常檢查項後,再次進行升級前檢查,直至檢查結果為成功

    • 升級檢查成功後,如果在主執行個體中建立了外掛程式,需重新執行檢查。

步驟二:升級大版本

  1. 單擊升级实例頁簽,閱讀警告內容,然後選擇升級版本,並單擊建立升級任務

  2. 在彈出的視窗中,閱讀提示內容,然後單擊確定

  3. 建立大版本升級任務地區,升级模式選擇本地升级,並配置割接时间(遷移完成後,業務切換至新執行個體的時間):

    • 立刻:遷移完成後立即切換。

    • 实例可运维时间:在可營運時間段內切換。

  4. 單擊立即建立

    當執行個體狀態變為遷移中時,表示升級任務已正式啟動。

    升級所需時間與執行個體中的資料庫物件數量密切相關,資料庫物件數量越多,升級所需時間越長。在進行大版本升級時,您可以在工作中樞查看升級進度。

    重要
    • 升級任務建立後不支援修改或刪除

    • 原執行個體狀態為遷移中時,該執行個體不支援修改參數、重啟、釋放等營運操作。

  5. 查看升級結果。

    當原執行個體和新執行個體的狀態為執行中時,表示執行個體升級成功。

    說明

    升級完成後,在升级历史頁簽,單擊目標升級任務升級日誌列的查看資訊,即可查看升級過程中執行個體的唯讀時間及詳細的升級過程。其中唯讀時間為割接時間割接結束時間之間的時段,此時間段不包括因DNS緩衝未重新整理而導致無法串連的時間。

後續操作

如果在升級前刪除了唯讀執行個體,還需執行:

  1. 在新執行個體上重新建立PostgreSQL唯讀執行個體

  2. 在應用程式中,將原唯讀執行個體串連地址(已在升級前修改為主執行個體串連地址)修改為新的唯讀執行個體串連地址。

升級結果說明

升級過程中,升级历史頁簽的升級記錄中,包含以下升級結果

升級結果

執行個體狀態

含義

可執行動作

運行中

遷移中

升級任務正在運行。

無。

成功

執行中

升級任務成功。

無。

相關API

API

描述

UpgradeDBInstanceMajorVersionPrecheck

RDS PostgreSQL執行個體大版本升級檢查。

DescribeUpgradeMajorVersionPrecheckTask

查詢RDS PostgreSQL執行個體大版本升級檢查報告。

UpgradeDBInstanceMajorVersion

RDS PostgreSQL執行個體升級資料庫大版本。

DescribeUpgradeMajorVersionTask

查詢RDS PostgreSQL執行個體大版本升級歷史任務。

相關文檔

常見問題

大版本升級期間,是否能變更執行個體?比如變更執行個體規格?

大版本升級期間不支援變更執行個體,必須在大版本升級完成後才能進行其他動作。

大版本是否支援自動升級?

暫不支援自動升級資料庫大版本。

是否支援大版本降級?

升級後暫不支援進行大版本降級操作,如需降級,請購買低版本執行個體後,使用DTS遷移,將執行個體遷移至低版本中。

升級資料庫大版本後,在新執行個體中建立raster_overviews視圖時,提示raster_overviews衝突,如何處理?

如果PostGIS版本小於2.5.2且RDS PostgreSQL版本為10或11,升級外掛程式後,再升級資料庫大版本到PostgreSQL12,在新執行個體中建立raster_overviews視圖可能會出現raster_overviews衝突的問題。

解決方案如下:

  1. 在原執行個體中升級PostGIS外掛程式版本。

    如下命令需執行兩遍,以確保成功。

    SELECT PostGIS_Extensions_Upgrade();
    SELECT PostGIS_Extensions_Upgrade();
  2. 根據業務判斷是否使用了PostGIS Raster外掛程式,選擇對應的升級方法。

    使用了PostGIS Raster外掛程式

    1. 在原執行個體中執行如下命令,修改raster_overviews視圖。

      ALTER EXTENSION PostGIS_Raster DROP VIEW raster_overviews;
      CREATE OR REPLACE VIEW raster_overviews AS SELECT 1;
    2. 對PostgreSQL執行個體進行大版本升級,至少升級到PostgreSQL 12或以上版本。

    3. 升級完成後,在新執行個體中重新建立視圖。

      CREATE 
      OR REPLACE VIEW raster_overviews AS 
      SELECT 
        current_database() AS o_table_catalog, 
        n.nspname AS o_table_schema, 
        c.relname AS o_table_name, 
        a.attname AS o_raster_column, 
        current_database() AS r_table_catalog, 
        split_part(
          split_part(s.consrc, '''::name', 1), 
          '''', 
          2
        ): :name AS r_table_schema, 
        split_part(
          split_part(s.consrc, '''::name', 2), 
          '''', 
          2
        ): :name AS r_table_name, 
        split_part(
          split_part(s.consrc, '''::name', 3), 
          '''', 
          2
        ): :name AS r_raster_column, 
        trim(
          both 
          from 
            split_part(s.consrc, ',', 2)
        ): :integer AS overview_factor 
      FROM 
        pg_class c, 
        pg_attribute a, 
        pg_type t, 
        pg_namespace n, 
        (
          SELECT 
            connamespace, 
            conrelid, 
            conkey, 
            pg_get_constraintdef(oid) As consrc 
          FROM 
            pg_constraint
        ) AS s 
      WHERE 
        t.typname = 'raster' : :name 
        AND a.attisdropped = false 
        AND a.atttypid = t.oid 
        AND a.attrelid = c.oid 
        AND c.relnamespace = n.oid 
        AND c.relkind = ANY(
          ARRAY[ 'r' : :char, 'v' : :char, 'm' : :char, 
          'f' : :char ]
        ) 
        AND s.connamespace = n.oid 
        AND s.conrelid = c.oid 
        AND s.consrc LIKE '%_overview_constraint(%' 
        AND NOT pg_is_other_temp_schema(c.relnamespace) 
        AND has_table_privilege(c.oid, 'SELECT' : :text); ALTER EXTENSION PostGIS_Raster 
      ADD 
        VIEW raster_overviews;

    未使用PostGIS Raster外掛程式

    1. 在原執行個體中執行如下命令刪除外掛程式。

      DROP EXTENSION PostGIS_Raster;
    2. 對PostgreSQL執行個體進行大版本升級,至少升級到PostgreSQL 12或以上版本。

如何避免在升級過程中出現複製槽搶佔導致的資料不同步問題

  • 如果您需要將訂閱資料保留在源端(低版本執行個體),那麼在升級的過程中,確保源端不會因負載過大而導致宕機。否則,可能導致複製槽被目標端(高版本執行個體)搶佔,從而出現資料不一致的情況。

    升級完成後,請使用以下SQL語句在目標端的資料庫關閉訂閱。

    \c your_database
    ALTER SUBSCRIPTION your_subscription_name DISABLE;
  • 如果您需要將訂閱資料儲存在目標端,請在升級前關閉源端的訂閱,再進行大版本升級,升級完成後,請開啟目標端的訂閱。SQL樣本如下:

    • 在源端關閉訂閱。

      \c your_database
      ALTER SUBSCRIPTION your_subscription_name DISABLE;
    • 在目標端開啟訂閱。

      \c your_database
      ALTER SUBSCRIPTION your_subscription_name ENABLE;
說明

如何處理升級後訂閱資料不一致的問題?

  1. 升級成功後,清空目標端(高版本執行個體)表資料,重新建立訂閱並設定copy_data=true。詳情請參見ALTER SUBSCRIPTION

  2. 使用CONFLICT關鍵字將源端(低版本執行個體)消費的資料匯入到目標端,樣本如下。

    CREATE TABLE my_tbl(id INT PRIMARY KEY, t TIMESTAMP, val TEXT);
    
    INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'a');
    INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP, 'b');
    INSERT INTO my_tbl VALUES (3, CURRENT_TIMESTAMP, 'c');
    
    -- in case with newer timestamp: do update
    INSERT INTO my_tbl VALUES (1, CURRENT_TIMESTAMP, 'd') ON CONFLICT(id) DO UPDATE
    	SET t = excluded.t,
    		val = excluded.val
    	WHERE my_tbl.t < excluded.t;
    
    -- in case with older timestamp: do nothing
    INSERT INTO my_tbl VALUES (2, CURRENT_TIMESTAMP - '10 hours'::interval, 'e') ON CONFLICT(id) DO UPDATE
    	SET t = excluded.t,
    		val = excluded.val
    	WHERE my_tbl.t < excluded.t;
    
    -- in case with new val: just insert
    INSERT INTO my_tbl VALUES (5, CURRENT_TIMESTAMP - '10 hours'::interval, 'f') ON CONFLICT(id) DO UPDATE
    	SET t = excluded.t,
    		val = excluded.val
    	WHERE my_tbl.t < excluded.t;

為什麼在進行大版本升級之前需要刪除唯讀執行個體?

升級完成後,自建的唯讀節點和複製槽在升級後仍然保留在原執行個體下,不會自動轉移到高版本執行個體。因此,在進行大版本升級前,請將應用程式中配置的唯讀執行個體串連地址修改為主執行個體串連地址,並刪除現有的唯讀執行個體。升級完成後,請重新購買並配置新的唯讀執行個體。