本文介紹RDS PostgreSQL大版本升級檢查報告的內容詳情、常見報錯以及處理方式。
檢查報告將同時提供中文和英文內容,請根據需要選擇適合的語言進行查看。
檢查項
如果您在升級數據庫大版本的升級檢查步驟,檢查報告的結果為失敗,可以單擊查看信息查看檢查報告的詳細內容。
如下是檢查報告中的檢查模塊及常見的報錯:
警告
檢查內容
大版本升級時,源實例的只讀時間、所需的內存和磁盤資源會受到數據庫對象數量的影響。如果實例的數據庫對象數量過多,而磁盤和內存資源不足,可能會導致升級失敗。在此情況下,系統將在警告欄中提供推薦內存、最小推薦內存以及推薦磁盤大小。
推薦內存:在大版本升級過程中,系統能夠對包含多個數據庫的實例提供并發升級功能。因此,當實例的內存大于或等于推薦內存,將以最快的速度進行升級,以盡量減少實例的只讀時間。
最小推薦內存:實例內存大于等于最小推薦內存時,不會因為內存資源不足導致升級失敗。實例的只讀時間并不一定是最短的,因為系統將對每個數據庫進行串行升級。
推薦磁盤大小:在大版本升級過程中,系統會臨時復制所有對象定義,這將導致inode的消耗增加一倍。如果升級時的磁盤空間不足以滿足推薦的磁盤大小,可能會導致升級失敗。
警告與解決辦法
磁盤警告
警告格式:
總磁盤空間: {*} GB; 已使用磁盤: {*} GB; 已使用inode: {*}; bytes-per-nodes: {*}; 升級需要最少磁盤空間: {*} GB
。可能原因:對象數量過多,需要足夠大小的磁盤空間。
解決辦法:
對于藍綠部署,在配置升級參數時,新實例的存儲空間必須大于或等于進行升級所需的最小磁盤空間。
對于本地升級,在升級前應對源實例進行存儲空間的擴容,擴容后的存儲空間必須大于或等于進行升級所需的最小磁盤空間。詳情請參見變更配置。
內存警告
警告格式:
當前內存: {*} GB; 推薦內存: {*} GB; 最低內存: {*} GB
。可能原因:對象數量過多,需確保擁有足夠的內存,以最大程度地減少在升級過程中實例的只讀時間。
解決辦法:
對于藍綠部署,在配置升級參數時,新實例規格中的內存必須大于或等于最低內存要求。
對于本地升級,如果實例規格小于推薦內存,需要在升級前對源實例進行升配。詳情請參見變更配置。
訂閱警告
警告格式:
實例存在復制槽訂閱端,為防止訂閱數據不一致,建議查看阿里云幫助文檔
。可能原因:實例中存在復制槽訂閱端,您可以通過執行
select * from pg_subscription;
進行查看。解決辦法:參見如何避免在升級過程中出現復制槽搶占導致的數據不同步問題,進行處理。
錯誤
檢查內容
檢查是否存在后臺添加的多余超級賬號或者加密方式不正確的普通賬號。
預檢查是否失敗。如若失敗,檢查報告將顯示“pg_upgrade錯誤日志”項。
是否在pg_catalog schema中安裝了pgcrypto插件。
錯誤與解決辦法
賬號錯誤
錯誤格式:
無效超級賬戶:{*};無效賬戶:{*}; 請查看阿里云幫助文檔
。可能原因:存在冗余的超級賬號或者存在異常的普通賬號。
解決辦法:
對于冗余的超級賬號,請提工單聯系售后服務刪除。
對于異常的普通賬號,請重置報錯賬號的密碼。
預檢查錯誤
錯誤格式:
pg_upgrade預檢查任務失敗, 需要查看[pg_upgrade錯誤日志]以及[pg_upgrade相關文件與報錯]
。可能原因:預檢查失敗。
解決辦法:請參照pg_upgrade錯誤日志,解決日志問題。
pgcrypto插件錯誤
錯誤格式:
在數據庫:{*}中的schema:pg_catalog中安裝了pg_crypto插件,請查看阿里云幫助文檔
。可能原因:由于pgcrypto在pg_catalog中創建了僅在高版本中存在的函數,導致了大版本升級的失敗。
解決辦法:刪除每個數據庫中的pgcrypto插件,然后在非pg_catalog schema中創建該插件。
pg_upgrade錯誤日志
檢查內容
檢查大版本間是否存在不兼容的插件、關鍵字等。
常見報錯
可能原因
存在高版本不兼容的插件,相關插件被記錄在loadable_libraries.txt文件中。
解決辦法
排查loadable_libraries.txt報告項中列出的插件,根據實際需要進行評估是否刪除,建議在不影響業務穩定的情況下刪除后升級。各版本支持的插件列表請參見:支持插件列表。
可能原因
建表時聲明了WITH OIDS
,該聲明在PostgreSQL 12或以上版本不支持,相關表被記錄在tables_with_oids.txt文件中。
解決辦法
方法一(推薦):升級到PostgreSQL 11版本,該版本支持聲明
WITH OIDS
。方法二:排查loadable_libraries.txt報告項列出的表,請自行評估業務代碼是否對OID有依賴,確認不影響業務之后,執行以下語句:
ALTER TABLE {table_name} SET WITHOUT OIDS;
pg_upgrade相關文件與報錯
loadable_libraries.txt
展示不兼容的library,通常對應了不兼容的插件。
如下是常見的不兼容插件及解決辦法:
可能原因
PostgreSQL 9.4對JSON類型支持不完善,需要jsonbx插件支持,PostgreSQL 10或以上版本原生支持JSON,沒有該插件。
解決辦法
請在高版本中驗證jsonbx插件的相關函數使用,根據實際需要進行評估是否刪除插件,然后在不影響業務穩定的情況下刪除后再升級。
jsonbx插件函數使用差異如下:
函數用法 | PostgreSQL 9.4執行結果 | PostgreSQL 10或以上版本執行結果 |
select '{"a":1, "b":2, "c":3}'::jsonb - 2; | {"a": 1, "b": 2} | ERROR: cannot delete from object using integer index |
select jsonb_delete('{"a":1, "b":2, "c":3}'::jsonb, '{b}'::text[]); | {"a": 1, "c": 3} | ERROR: function jsonb_delete(jsonb, text[]) does not exist |
select '{"a":{"c":1, "d":2}, "b":3}'::jsonb - '{a, c}'::text[]; | {"a": {"d": 2}, "b": 3} | {"b": 3} |
可能原因
postgis插件版本過低,與選定的高版本lib庫不匹配,升級檢查失敗。
解決辦法
postgis插件各版本間存在差異(例如wkt格式的解析報錯不同),升級后可能影響業務處理,建議在升級postgis插件前,先克隆當前實例,在克隆實例中對postgis插件進行升級測試,完全符合業務需求后,再在原實例中升級postgis插件。克隆的具體操作,請參見備份PostgreSQL數據和恢復PostgreSQL數據。
升級內核小版本。更多信息,請參見升級內核小版本。
更新報錯提示的postgis插件。更多信息,請參見PostGIS插件升級。
執行
\dx
命令查詢插件版本,確保postgis插件版本至少為3.3.2。重新進行升級檢查。
重要不同PostgreSQL實例版本安裝postgis、postgis_topology或pgrouting插件后,升級大版本存在如下限制:
PostgreSQL 9.4:暫時僅支持升級到PostgreSQL 10或11。
PostgreSQL 10:暫時僅支持升級到PostgreSQL 11。
PostgreSQL 11、12和13:暫不支持升級。
tables_with_oids.txt
展示聲明了WITH OIDS
的表清單。