全部產品
Search
文件中心

ApsaraDB RDS:RDS PostgreSQL大版本升級和跨版本升級

更新時間:Jun 19, 2024

隨著PostgreSQL社區對低版本(如9.4、10)執行個體的停止維護,繼續使用低版本執行個體將存在風險,如果您需要升級低版本的RDS PostgreSQL執行個體到更高版本,或者希望使用高版本的新特性,建議您進行大版本升級操作。

背景資訊

PostgreSQL社區會定期發布一個大版本,大版本通常帶來功能、效能等方面的提升,而較低資料庫大版本社區將陸續不再提供支援,效能和安全的風險也將逐漸增加。為了讓您享受PostgreSQL新的大版本帶來的功能、效能提升,同時降低升級風險,RDS PostgreSQL提供大版本升級功能。

升級流程

重要

大版本升級會保留原執行個體,並建立一個新版本的執行個體,新執行個體在建立中不收費,建立成功後將會產生費用,並且計費方式可能會發生變化。升級完成後,原執行個體和新執行個體將同時產生費用,且新執行個體暫不享受原執行個體的優惠,請根據實際情況評估是否進行升級。

原執行個體計費方式

新執行個體計費方式

訂用帳戶/隨用隨付

隨用隨付

Serverless

Serverless

  1. 升級前檢查

    為確保升級順利,需要在大版本升級前檢查當前主執行個體是否支援大版本升級,RDS PostgreSQL提供檢查結果和檢查報告,檢查報告異常時不允許升級。處理完異常後才能進行大版本升級。

  2. (可選)大版本升級相容性測試

    大版本升級可能會出現與現有應用的相容性問題,因此建議大版本進行升級時,選擇不割接建立一個新版本的測試執行個體進行業務測試及確保相容性。

  3. 正式升級

    在原執行個體上再次執行大版本升級,選擇割接建立一個新版本的執行個體用於升級後使用。

割接和不割接說明

大版本升級時,系統將建立一個新執行個體進行資料移轉。該參數用於控制是否自動切換至新執行個體。

割接方式

說明

影響

不割接

執行個體串連地址不自動切換。此選項一般用於正式升級之前測試當前業務在新版本中的相容性。建議第一次執行時選擇不割接,應用程式層完全測實驗證通過後,釋放執行個體並重複升級大版本操作,選擇割接開始正式升級。

  • 遷移過程中,原執行個體的業務不會受到影響。

  • 如需通過不割接升級執行個體,需在遷移完成後把應用程式中的資料庫連接地址改為新執行個體的串連地址。如何查看串連地址,請參見查看或修改串連地址和連接埠

割接

自動切換。您無需更改應用程式裡的資料庫連接地址,割接結束會自動連接到新執行個體。此選項一般用於在確認業務可以穩定運行在新版本之後執行正式升級。

  • 割接後無法回退,請謹慎選擇。

  • 切換過程中,原執行個體會變為唯讀,業務無法寫入,請務必在業務低峰期進行。

  • 如果原執行個體中建立了唯讀執行個體,則無法選擇割接。只能通過不割接升級執行個體,且原唯讀執行個體不會被複製。升級完成後,您需要在新版本執行個體中另行建立PostgreSQL唯讀執行個體

功能特點

  • 支援跨版本升級:例如直接從PostgreSQL 10.0升級到PostgreSQL 13.0。

  • 支援升級演練:通過不割接的方式,可以在不影響原執行個體的情況下,驗證整個升級流程。

  • 支援平滑升級

    • 無需修改應用:通過割接方式升級,您無需修改應用中已配置的資料庫連接地址,割接結束會自動交換原執行個體與新執行個體的串連地址,應用將自動連接到新執行個體。

      說明

      通過割接方式升級後,新執行個體的虛擬IP(Virtual IP Address)與原執行個體不同,如果您在應用程式中配置了虛擬IP,則需要修改應用,因此,建議您在應用程式中配置執行個體串連地址,如何擷取執行個體串連地址,請參見查看或修改串連地址和連接埠

    • 無需停機:升級時原執行個體無需停機,而是暫時變為唯讀狀態(持續時間長度為分鐘級),降低業務中斷帶來的風險。此外,由於是通過複製執行個體進行升級,所以即使升級失敗也不會影響原執行個體。

    • 保留執行個體設定

      • 升級後保留原執行個體的白名單、參數設定、外掛程式(新版本不支援的外掛程式和參數除外)。

      • 加密執行個體升級大版本後仍為加密執行個體,加密Key保持不變。

升級費用

  • 升級後產生的新執行個體的計費方式可能會發生變化。

    原執行個體計費方式

    新執行個體計費方式

    訂用帳戶/隨用隨付

    隨用隨付

    Serverless

    Serverless

  • 升級完成後,原執行個體和新執行個體將同時產生費用。在確保業務在新執行個體中穩定運行後,您可以將新執行個體轉成訂用帳戶,將原執行個體釋放或退訂,但需要注意以下情況:

    • 如果您的原執行個體計費方式為訂用帳戶且尚未到期,新執行個體無法繼承原執行個體包月剩餘時間長度,釋放原執行個體可能存在費用損失。

    • 如果您的原執行個體購買時使用了優惠,升級後新執行個體將不會繼承此優惠,請進入執行個體退訂頁面查看具體退款金額後,再評估是否升級。

    • 訂用帳戶退款金額退款時間以實際退訂賬單為準,非即時到賬。

前提條件

升級大版本前需要滿足以下前提條件:

  • 版本:PostgreSQL 15或以下版本

    說明

    PostgreSQL 9.4最高僅支援直接升級到PostgreSQL 14,如果您需要升級到PostgreSQL 15或以上版本,則請先升級到PostgreSQL 10、11、12、13或14,然後再升級到PostgreSQL 15或以上版本。

  • 網路類型:專用網路。

    如果網路類型為傳統網路,您需要將網路類型切換為專用網路,並且切換時不選擇保留原傳統網路。如何查看或切換網路類型,請參見更改網路類型

    說明

    切換為專用網路時,如果您選擇了保留原傳統網路,則需要等待傳統網路保留時間結束後,才能啟動大版本升級任務。

  • 執行個體不是唯讀執行個體專屬叢集執行個體

  • 執行個體ID不是以pg-cn開頭。

  • 執行個體未啟用Babelfish,即小版本號碼尾碼不帶babelfish

升級影響

升級大版本將會造成以下影響:

  • 如果選擇了割接方式升級,在割接過程中,原執行個體將會被設定為唯讀,並會造成分鐘級業務閃斷,請在業務低峰期進行升級。如果選擇不割接方式進行升級,則不受影響。

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

    • 具體的閃斷時間長度取決於DNS緩衝重新整理時間。您可以嘗試切換虛擬交換器,通過業務閃斷時間長度來評估用戶端的DNS緩衝重新整理時間。

    • 升級過程的時間長短與執行個體的資料量和資料庫物件數量相關,執行個體資料量越大,資料庫物件數越多,升級時間越長。

    • 在割接過程中,如果不希望原執行個體被設定為唯讀,請在升級後將參數rds_force_trans_ro_non_sup設定為off,詳情請參見設定執行個體參數

  • 如果原執行個體使用了新版本不支援的參數,在新版本中該參數會被自動刪除,如果在低版本的參數取值不在高版本對應參數的合法區間,在新版本中該參數會被置為高版本參數模板的預設值。

  • 新執行個體不繼承原執行個體的執行個體名稱標籤CloudMonitor警示規則以及備份資料

  • 如果待升級的執行個體作為Data Transmission Service(DTS)的源執行個體或目標執行個體,則升級後需要重建DTS任務。建立DTS任務詳見DTS產品文檔

  • 自建的唯讀節點和邏輯複製槽在升級後仍然保留在原執行個體下,不會自動轉移到高版本執行個體,需要在升級後進行重建。

  • 當待升級的執行個體中存在Replication Slots的訂閱端,升級可能出現複製槽搶佔導致的資料不同步問題。需要執行如下操作防止出現資料不同步的情況。

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

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

      升級完成後,請使用以下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. 將應用程式中配置的唯讀執行個體串連地址修改為主執行個體串連地址。

      說明

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

    2. 刪除唯讀執行個體。

    3. 升級大版本

    4. 升級完成後,在新執行個體上重新建立PostgreSQL唯讀執行個體

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

  • 升級大版本將會使用最新的核心小版本,可能遇到外掛程式相容性問題,具體請參見升級核心小版本

  • 具體升級時間取決於資料量,無法準確預估,大版本升級時您可以在工作中樞查看任務進度,具體請參見任務管理

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

升級大版本

  1. 如果待升級的執行個體中建立了唯讀執行個體,需在升級前執行以下步驟:

    1. 將應用程式中配置的唯讀執行個體串連地址修改為主執行個體串連地址。

      說明

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

    2. 刪除唯讀執行個體。

  2. 進入大版本升級頁面。

    1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
    2. 在左側導覽列單擊大版本升級

      說明

      如果您在控制台中未看到大版本升級,請檢查您的RDS PostgreSQL執行個體版本及系列等配置,具體請參見前提條件

  3. 升級檢查頁簽中,選擇目標升級版本,然後單擊建立升級檢查報告,並等待數分鐘。

    說明
    • 為確保升級能順利完成,請確保升級檢查報告的檢查結果為成功時,再進行後續升級步驟。

    • 升級檢查成功後,如果對主執行個體執行了CREATE EXTENSION操作,需重新執行檢查。

    當升級檢查報告的檢查結果為失敗時,可單擊查看資訊查看報告詳細內容,常見的報錯及原因請參見解讀RDS PostgreSQL大版本升級檢查報告

  4. 單擊升級執行個體頁簽,閱讀警告內容,然後選擇升級版本,並單擊繼續建立升級執行個體

  5. 在彈出的視窗中確認注意事項,單擊確定,並設定參數(以下僅列舉重點參數):

    配置

    說明

    儲存類型

    選擇執行個體的儲存類型。

    大版本升級功能雲端式盤快照,當前升級後支援選擇如下儲存類型。

    • ESSD PL1雲端硬碟

    • ESSD PL2 雲端硬碟

    • ESSD PL3 雲端硬碟

    目標主可用性區域·

    系統支援升級後將新的主備執行個體配置到其他可用性區域。

    目標備可用性區域

    目標主執行個體交換器

    目標備執行個體交換器

    割接配置

    系統將建立一個新執行個體進行資料移轉。請選擇遷移後是否自動切換至新執行個體。

    • 不割接:不自動切換。此選項一般用於正式升級之前測試當前業務在新版本中的相容性。建議第一次執行時選擇不割接,應用程式層完全測實驗證通過後,釋放執行個體並重複升級大版本操作,選擇割接開始正式升級。

      說明
      • 遷移過程中,原執行個體的業務不會受到影響。

      • 如需通過不割接升級執行個體,需在遷移完成後把應用程式中的資料庫連接地址改為新執行個體的串連地址。如何查看串連地址,請參見查看或修改串連地址和連接埠

    • 割接:自動切換。您無需更改應用程式裡的資料庫連接地址,割接結束會自動連接到新執行個體。此選項一般用於在確認業務可以穩定運行在新版本之後執行正式升級。

      說明
      • 割接後無法回退,請謹慎選擇。

      • 切換過程中,原執行個體會被變為唯讀,業務無法寫入,請務必在業務低峰期進行。

      • 如果原執行個體中建立了唯讀執行個體,則無法選擇割接。只能通過不割接升級執行個體,且原唯讀執行個體不會被複製。升級完成後,您需要在新版本執行個體中另行建立PostgreSQL唯讀執行個體

    割接時間

    遷移完成後,業務切換至新執行個體的時間。

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

    • 執行個體可營運時間:在可營運時間段內切換。

    說明

    僅當割接配置割接時可選。

    統計資訊收集模式

    選擇在哪個時間點對資料庫執行統計資訊收集。

    • 割接前收集:可以保證業務穩定性。如果執行個體資料量太大可能會導致升級時間較久。

    • 割接後收集:執行個體升級速度較快。升級後訪問未產生統計資訊的表可能導致執行計畫不準確,業務高峰期還可能導致資料庫宕機。

    說明

    對於不割接情境,割接前收集表示新執行個體開放讀寫前收集,割接後收集表示新執行個體開放讀寫後收集。

    儲存空間

    選擇新版本執行個體的儲存空間大小。

    本地碟執行個體升級大版本時,支援儲存空間縮容。可選擇的最小儲存空間需滿足以下條件:

    • 以下兩者中的最小值:

      • 原執行個體已使用儲存空間 × 120%,如果計算結果(單位需計算為GB)不是5的倍數,則向上湊為5的倍數。

        說明

        原執行個體已使用儲存空間,可通過監控與警示功能查看監控項磁碟空間 (MB),具體方法,請參見查看增強監控

      • 原執行個體儲存空間。

    • 大於等於ESSD雲端硬碟可購買的最小值,不足時以如下值作為可購買最小值:

      • ESSD PL1雲端硬碟:20 GB。

      • ESSD PL2雲端硬碟:500 GB。

      • ESSD PL3雲端硬碟:1500 GB。

    說明

    例如:

    • 原執行個體儲存空間為100 GB,已使用70 GB,升級大版本時,儲存類型選擇為ESSD PL1雲端硬碟。

      計算方法:70 × 120% = 84 GB,向上湊為5的倍數85 GB。因此,可購買的最小儲存空間為85 GB。

    • 原執行個體儲存空間為700 GB,已使用350 GB,升級大版本時,儲存類型選擇為ESSD PL2雲端硬碟。

      計算方法:350 × 120% = 420,420 GB小於ESSD PL2雲端硬碟可購買的最小值500 GB,因此,可購買的最小儲存空間為500 GB。

    執行個體規格

    選擇新版本執行個體的規格。有關執行個體規格的更多詳情,請參見主執行個體規格列表

  6. 單擊立即建立

    此時原執行個體狀態變更為遷移中,並且執行個體列表中會多出一個狀態為建立中的新執行個體。當兩個執行個體的狀態變更為運行中即代表建立或升級完成。具體時間取決於資料量,請耐心等待。

    說明
    • 升級任務建立後不支援修改或刪除。

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

    • 如果單擊立即建立時,提示資源不足,請切換目標主執行個體可用性區域

  7. 如果在步驟一中刪除了唯讀執行個體,則在升級後,還需執行以下步驟:

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

    2. 在應用程式中,將步驟一中修改的執行個體串連地址修改為新的唯讀執行個體串連地址。

後續步驟

  1. 確認業務已穩定運行在新執行個體中後,將新執行個體轉成訂用帳戶

  2. 釋放原執行個體

    說明
    • 如果您的原執行個體計費方式為訂用帳戶且尚未到期,釋放執行個體可能存在費用損失。

    • 如果您的原執行個體購買時使用了優惠,升級後新執行個體將不會繼承此優惠,原執行個體退訂請以實際退訂頁為準。

    • 訂用帳戶退款金額退款時間以實際退訂賬單為準,非即時到賬。

  3. 新執行個體不包含唯讀執行個體,您可以按需建立PostgreSQL唯讀執行個體

相關文檔

常見問題

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

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

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

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

升級資料庫大版本後,在新執行個體中建立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或以上版本。

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

  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;