全部產品
Search
文件中心

ApsaraDB RDS:通過零停機模式升級大版本

更新時間:Aug 30, 2025

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

前提條件

背景資訊

在零停機模式下,系統採用pg_upgrade將原執行個體升級至目標版本,並通過原生邏輯複製實現累加式更新。升級過程中支援主動切換,並可在切換前對高版本執行個體進行驗證;在升級開始至主動切換前,執行個體可保持正常的讀寫操作;在切換過程中,執行個體的唯讀時間為秒級。

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

升級費用

免費

注意事項

  • 業務影響:幾乎無業務影響,原執行個體停機時間為秒級,停機時間長度取決於執行個體中的Sequence數量以及大事務的寫入情況。

  • 複製槽(Replication Slots)

  • 參數變化

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

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

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

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

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

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

不同升級階段對執行個體的影響

升級階段

影響

開始大版本升級

禁止進行任何DDL操作。

建立複製槽和發布

  • 禁止進行任何DDL操作。

  • 出現WAL日誌堆積。

訂閱端啟動並建立邏輯複製關係

  • 禁止進行任何DDL操作。

  • WAL日誌開始被消費,不再堆積。

  • 邏輯複製將產生一定的資源負載(與資料庫數量及流量密切相關)。

開始切換

  • 禁止進行任何DDL操作。

  • 邏輯複製將產生一定的資源負載(與資料庫數量及流量密切相關)。

  • 執行個體唯讀(唯讀時間與Sequence數量相關)。

完成切換(升級完成)

  • 邏輯複製槽被刪除,邏輯複製所產生的資源負載被消除。

  • 執行個體恢複正常讀寫。

升級任務開始後,在升级历史頁簽,單擊目標升級任務升級日誌列的查看資訊,即可查看詳細的升級過程。

步驟一:升級前檢查

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

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

    說明

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

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

  4. 擇選升級版本,且升级模式選擇零停機後,單擊確定

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

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

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

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

步驟二:升級大版本

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

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

  3. 建立大版本升級任務地區,選擇升级模式零停機

  4. 單擊立即建立

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

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

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

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

步驟三:切換到高版本

  1. 驗證高版本執行個體。

    當執行個體狀態將從遷移中轉變為遷出資料中時,表示邏輯複製已搭建完成,建立升級任務的過程將結束,您可以驗證高版本執行個體的資料。

    進入升级历史頁簽,使用目標升級記錄的高版本驗證地址串連至高版本執行個體,以驗證升級後的資料。

    說明

    高版本執行個體為唯讀模式,無法進行寫入操作。

  2. 切換到高版本執行個體。

    確定高版本執行個體的資料符合預期後,且升級結果同步中時,單擊升級日誌列的切換,將業務切換到高版本執行個體。

    說明
    • 如果升級結果為其他狀態,請參見升級結果說明進行處理。

    • 如果您決定放棄本次升級,可以單擊升級日誌列的取消。這將刪除邏輯複製槽,取消邏輯複製對源執行個體的影響,並允許其執行DDL操作。

  3. 切換彈窗中設定容忍停寫時間(單位:秒),並單擊確定

    升級結果變為唯讀時,表示進行中切換,此時執行個體狀態為遷移中時。在大版本升級升级历史頁簽,單擊升級日誌列的中斷按鈕,取消此次切換操作。

    說明

    可以通過在切換時設定容忍停寫時間,主動等待覆制延遲消除,保障資料一致性。在此過程中,升級結果將變為唯讀。如果超出此時間,則系統將返回到同步中狀態,並解除唯讀限制。

  4. 查看切換結果。

    升級結果變為成功時,表示切換成功,當執行個體狀態為執行中時。

    在執行個體基本資料頁,可以查看執行個體當前的版本資訊。

    說明

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

升級結果說明

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

升級結果

執行個體狀態

含義

可執行動作

運行中

遷移中

升級任務正在運行。

無。

同步中

遷出資料中

邏輯複製狀態正常。

  • 切換:切換到高版本執行個體。

  • 取消:放棄本次升級。

複製斷開

遷出資料中

邏輯複製狀態異常。

  • 查看升級日誌確定複製異常原因。

  • 取消:放棄本次升級。

唯讀

遷移中

正在切換,執行個體為唯讀模式,並且正在同步Sequence。

中斷:取消此次切換操作。

切換

遷移中

Sequence同步已完成,現正進行收尾工作。

無。

取消

執行中

升級任務取消。

無。

成功

執行中

升級任務成功。

無。

相關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;