隨著PostgreSQL社區對低版本(如9.4、10)實例的停止維護,繼續使用低版本實例將存在風險,如果您需要將低版本的RDS PostgreSQL實例升級到更高版本,或者希望使用高版本的新特性,建議您進行大版本升級操作。
背景信息
PostgreSQL社區會定期發布一個大版本,大版本通常帶來功能、性能等方面的提升,而較低數據庫大版本社區將陸續不再提供支持,性能和安全的風險也將逐漸增加。為了讓您享受PostgreSQL新的大版本帶來的功能、性能提升,同時降低升級風險,RDS PostgreSQL提供大版本升級功能。
升級流程
升級前檢查
為確保升級順利,需要在大版本升級前檢查當前主實例是否支持大版本升級,RDS PostgreSQL提供檢查結果和檢查報告,檢查報告異常時不允許升級。處理完異常后才能進行大版本升級。
(可選)大版本升級兼容性測試
大版本升級可能會出現與現有應用的兼容性問題,因此建議大版本進行升級時,選擇不割接創建一個新版本的測試實例進行業務測試及確保兼容性。
正式升級
在原實例上再次執行大版本升級,選擇割接將數據流量切換至新版實例。割接時的升級模式包括本地升級和藍綠部署,請根據實際情況進行評估選擇。
本地升級:大版本升級任務將在原實例上進行,不會創建新版本實例。升級后的原實例大版本提升,并將繼承原有的訂單、實例名稱、標簽、云監控報警規則及備份規則。
藍綠部署:大版本升級會保留原實例,并創建一個新版本的實例,新實例在創建中不收費,創建成功后將會產生費用,并且計費方式可能會發生變化。升級完成后,原實例和新實例將同時產生費用,且新實例暫不享受原實例的優惠。
原實例計費方式
新實例計費方式
包年包月/按量付費
按量付費
Serverless
Serverless
說明本地盤實例僅支持采用藍綠部署模式進行大版本升級。
大版本升級時,該參數用于控制是否將流量切換到高版本實例。
割接方式 | 說明 | 影響 | |
不割接 | 實例連接地址不自動切換。此選項一般用于正式升級之前測試當前業務在新版本中的兼容性。建議第一次執行時選擇不割接,應用層完全測試驗證通過后,釋放實例并重復升級大版本操作,選擇割接開始正式升級。 |
| |
割接 | 藍綠部署 | 實例連接地址自動切換。割接結束后原有數據庫連接地址會自動轉移到新實例,您無需更改應用程序里的數據庫連接地址。此選項一般用于在確認業務可以穩定運行在新版本之后執行正式升級。 |
|
本地升級 | 在本地升級時,僅會對原實例進行升級,不會產生新實例與訂單。當實例升級到更高版本后,將會繼承原實例的設定,您無需更改應用程序里的數據庫連接地址。此選項一般用于在確認業務可以穩定運行在新版本之后執行正式升級。 |
功能特點
支持跨版本升級:例如直接從PostgreSQL 10.0升級到PostgreSQL 13.0。
支持升級演練:通過不割接的方式,可以在不影響原實例的情況下,驗證整個升級流程。
支持平滑升級:
無需修改應用:通過割接方式升級,您無需修改應用中已配置的數據庫連接地址。割接結束后,藍綠部署將會自動交換原實例與新實例的連接地址,而本地升級將保持原實例的連接地址不變。
說明對于本地升級,不會修改虛擬IP(Virtual IP Address)。
對于藍綠部署,升級后新實例的虛擬IP(Virtual IP Address)與原實例不同,如果您在應用程序中配置了虛擬IP,則需要修改應用,因此,建議您在應用程序中配置實例連接地址,如何獲取實例連接地址,請參見查看或修改連接地址和端口。
無需停機:升級時原實例無需停機,而是暫時變為只讀狀態(持續時長為分鐘級),降低業務中斷帶來的風險。
保留實例設置:
升級后保留原實例的白名單、參數設置、插件(新版本不支持的插件和參數除外)。
加密實例升級大版本后仍為加密實例,加密Key保持不變。
升級費用
本地升級不會造成費用的變化,也不會產生訂單。
藍綠部署:
升級后生成的新實例的計費方式可能會發生變化。因此在升級前,請確保賬戶余額大于等于100元。
原實例計費方式
新實例計費方式
包年包月/按量付費
按量付費
Serverless
Serverless
升級完成后,原實例和新實例將同時產生費用。在確保業務在新實例中穩定運行后,您可以將新實例轉成包年包月,將原實例釋放或退訂,但需要注意以下情況:
如果您的原實例計費方式為包年包月且尚未到期,新實例無法繼承原實例包月剩余時長,釋放原實例可能存在費用損失。具體退訂規則請參見退款說明。
如果您的原實例購買時使用了優惠,升級后新實例將不會繼承此優惠,請進入實例退訂頁面查看具體退款金額后,再評估是否升級。
包年包月退款金額退款時間以實際退訂賬單為準,非實時到賬。
前提條件
升級大版本前需要滿足以下前提條件:
版本:PostgreSQL 16或以下版本
說明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
,詳情請參見設置實例參數。
如果原實例使用了新版本不支持的參數,在新版本中該參數會被自動刪除,如果低版本的參數取值不在高版本對應參數的合法區間,在新版本中該參數會被置為高版本參數模板的默認值。
對于藍綠部署,自建的只讀節點和邏輯復制槽在升級后仍然保留在原實例下,不會自動轉移到高版本實例,需要在升級后進行重建。
對于本地升級,自建只讀節點的主備關系以及邏輯復制槽在升級后會丟失,請根據實際情況謹慎選擇升級模式。
如果待升級的實例作為數據傳輸服務(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;
說明如果未按照上述操作進行處理,可能導致您的訂閱數據不一致,請參照如何處理升級后訂閱數據不一致的問題?進行處理,以確保訂閱數據的一致性。
當待升級的實例中創建了只讀實例時,則無法直接進行升級,需要在升級前后進行以下操作:
將應用程序中配置的只讀實例連接地址修改為主實例連接地址。
說明為保證業務穩定,建議在業務低峰期修改應用連接地址。
刪除只讀實例。
升級完成后,在高版本實例上重新創建PostgreSQL只讀實例。
在應用程序中,將升級前修改的實例連接地址修改為新的只讀實例連接地址。
升級大版本將會使用最新的內核小版本,可能遇到插件兼容性問題,具體請參見升級內核小版本。
具體升級時間取決于數據量,無法準確預估,大版本升級時您可以在任務中心查看任務進度,具體請參見任務管理。
升級后暫不支持進行大版本降級操作,如需降級,請購買低版本實例后,使用DTS遷移,將實例遷移至低版本中。
升級過程中,系統會暫時將
statement_timeout
的值修改為0,并在升級完成后恢復為原值。
升級大版本
如果待升級的實例中創建了只讀實例,需在升級前執行以下步驟:
將應用程序中配置的只讀實例連接地址修改為主實例連接地址。
說明為保證業務穩定,建議在業務低峰期修改應用連接地址。
刪除只讀實例。
進入大版本升級頁面。
在升級檢查頁簽中,選擇目標升級版本,然后單擊創建升級檢查報告,并等待數分鐘。
說明為確保升級能順利完成,請確保升級檢查報告的檢查結果為成功時,再進行后續升級步驟。
升級檢查成功后,如果對主實例執行了
CREATE EXTENSION
操作,需重新執行檢查。
當升級檢查報告的檢查結果為失敗時,可單擊查看信息查看報告詳細內容,常見的報錯及原因請參見解讀RDS PostgreSQL大版本升級檢查報告。
單擊升級實例頁簽,閱讀警告內容,然后選擇升級版本,并單擊繼續創建升級實例。
在彈出的窗口中確認注意事項,單擊確定,并設置參數(以下僅列舉重點參數):
配置
說明
存儲類型
選擇實例的存儲類型。
說明升級模式為本地升級時無需配置該參數。
大版本升級功能基于云盤快照,當前升級后支持選擇如下存儲類型。
通用云盤
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。
實例規格
選擇新版本實例的規格。有關實例規格的更多詳情,請參見主實例規格列表。
說明升級模式為本地升級時無需配置該參數。
單擊立即創建。
選擇升級模式為藍綠部署時,此時原實例狀態變更為遷移中,并且實例列表中會多出一個狀態為創建中的新實例。當兩個實例的狀態變更為運行中即代表創建或升級完成。具體時間取決于數據量,請耐心等待。
說明升級任務創建后不支持修改或刪除。
原實例狀態為遷移中時,實例不支持修改參數、重啟、釋放等運維操作。
如果單擊立即創建時,提示資源不足,請切換目標主實例可用區。
升級完成后,在升級歷史頁簽,單擊目標升級任務升級日志列的查看信息,即可查看升級過程中實例的只讀時間及詳細的升級步驟。
如果在步驟一中刪除了只讀實例,則在升級后,還需執行以下步驟:
在新實例上重新創建PostgreSQL只讀實例。
在應用程序中,將步驟一中修改的實例連接地址修改為新的只讀實例連接地址。
后續步驟
對于藍綠部署,確認業務已在新實例中穩定運行后,將新實例轉成包年包月。
對于藍綠部署,釋放原實例。
說明如果您的原實例計費方式為包年包月且尚未到期,釋放實例可能存在費用損失。具體退訂規則請參見退款說明。
如果您的原實例購買時使用了優惠,升級后新實例將不會繼承此優惠,原實例退訂請以實際退訂頁為準。
包年包月退款金額退款時間以實際退訂賬單為準,非實時到賬。
新實例不包含只讀實例,您可以按需創建PostgreSQL只讀實例。
相關文檔
您還可以使用API進行大版本升級,相關API如下:
API
描述
RDS PostgreSQL實例大版本升級檢查
查詢RDS PostgreSQL實例大版本升級檢查報告
RDS PostgreSQL實例升級數據庫大版本
查詢RDS PostgreSQL實例大版本升級歷史任務
常見問題
大版本升級期間不支持變更實例,必須在大版本升級完成后,才可以進行其他操作。
暫不支持自動升級數據庫大版本。
如果PostGIS版本小于2.5.2且RDS PostgreSQL內核版本為10或11,升級插件后,再升級數據庫大版本到PostgreSQL12,在新實例中創建raster_overviews視圖可能會出現raster_overviews沖突的問題。
解決方法如下:
在原實例中升級PostGIS插件版本。
如下命令需執行兩遍,以確保成功。
SELECT PostGIS_Extensions_Upgrade(); SELECT PostGIS_Extensions_Upgrade();
根據業務判斷是否使用了PostGIS Raster插件,選擇對應的升級方法。
使用了PostGIS Raster插件
在原實例中執行如下命令,修改raster_overviews視圖。
ALTER EXTENSION PostGIS_Raster DROP VIEW raster_overviews; CREATE OR REPLACE VIEW raster_overviews AS SELECT 1;
對PostgreSQL實例進行大版本升級,至少升級到PostgreSQL 12或以上版本。
升級完成后,在新實例中重新創建視圖。
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插件
在原實例中執行如下命令刪除插件。
DROP EXTENSION PostGIS_Raster;
對PostgreSQL實例進行大版本升級,至少升級到PostgreSQL 12或以上版本。
升級成功后,清空目標端(高版本實例)表數據,重新創建訂閱并設置
copy_data=true
。詳情請參見ALTER SUBSCRIPTION。使用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;
在大版本升級頁面,單擊升級歷史頁簽,查看目標升級任務的割接時間和割接結束時間。割接時間和割接結束時間之間的時段即為數據庫的只讀時間。
此時間段不包括因DNS緩存未刷新而導致無法連接的時間。
對于非割接場景,系統同樣會顯示割接時間和割接結束時間,以便作為割接場景的參考和預估。