升級至新主要版本
截至2025年 Databases for PostgreSQL 12月,提供三種不同的升級路徑:
- 就地升級至新主要版本。
- 從備份還原。
- 從唯讀複本升級。
當資料庫的主要版本接近生命週期結束 (EOL),建議升級到目前的主要版本。
從 Cloud Databases CLI 外掛程式指令 ibmcloud cdb deployables-show或從 Cloud Databases API /deployables 端點,在 IBM Cloud 型錄 頁面中尋找 Databases for PostgreSQL 的可用版本。
當您升級至新實例時,也需要變更應用程式中的連線資訊。
在以下範例指令中,執行 {id} 時需提供資料庫執行個體的完整CRN。 由於 CRN 包含特殊字元,因此必須進行 URL 編碼, 以避免出現「not_found」錯誤。
升級至較新版本的 PostgreSQL 主要版本之需求
在開始任何主要版本升級流程之前,請先檢視所有必須先進行維護的擴充功能、複製物件及應用程式依賴項。
某些擴充功能和邏輯複製物件具有版本專屬性,或依賴於必須與 PostgreSQL 主要版本相符的伺服器端元件。 在升級前移除這些物件有助於避免發生錯誤,並讓您在新版系統上線後,僅需重新建立受支援的物件。
待審查的擴充功能與邏輯複製物件
在升級前,請確認以下事項:
延伸規格
pg_repackold_snapshotwal2jsonanonPostGIS
複製槽
Logical replication slots
應用程式依賴項
若您移除了應用程式所依賴的擴充功能或複製物件,請在繼續進行升級之前,先驗證資料流與應用程式的運作行為。 此外,請考慮依賴特定 PostgreSQL 功能的應用程式邏輯可能受到的影響。
pg_repack
請在升級前刪除 pg_repack ,並在升級後重新建立該資料夾。 pg_repack 使用特定版本的擴充套件,其客戶端與伺服器元件必須與 PostgreSQL 的主要版本相符。
DROP EXTENSION pg_repack;
請僅在升級後,若您的工作負載仍需使用該擴充功能時,才重新建立該擴充功能。
CREATE EXTENSION pg_repack;
old_snapshot
請在升級前刪除 old_snapshot 。 請勿在升級至 PostgreSQL 18後重新建立該項目,因為該項目已不再受支援。
DROP EXTENSION old_snapshot;
wal2json 複製槽
若您使用 wal2json 進行邏輯解碼,則必須在升級前刪除所有相關的複製槽。 pg_upgrade 工具嚴格禁止在存在複製槽的情況下進行主要版本升級,並會拋出嚴重錯誤並中止升級。
升級前:
- 請確保所有待處理的 WAL 資料均已處理完畢。
- 請停止使用該複製槽的應用程式。
- 移除複製槽:
SELECT pg_drop_replication_slot('your_slot_name');
升級完成後,您可以根據需要重新建立複製槽。 請注意,wal2json 並非透過 CREATE EXTENSION 進行安裝,而是透過資料庫參數(wal_level、max_replication_slots、max_wal_senders )及資料表權限進行設定,這些設定並不會阻礙系統升級。
anon
請在升級前移除「anon」擴充功能,若升級後仍需使用,請重新啟用該擴充功能。 在解除安裝「anon」之前,還需執行其他步驟。
若已安裝 anon 擴充套件,請在執行升級前完成以下步驟,並以管理員身分執行相關指令。
-
移除所有遮蔽規則(若已啟用)。
SELECT anon.remove_masks_for_all_columns(); -
停用角色遮罩(如果任何角色被標記為遮罩,升級可能會失敗)。
SECURITY LABEL FOR anon ON ROLE <role_name> IS NULL; -
使用 cascade 選項刪除
anon延伸。DROP EXTENSION anon CASCADE; -
如果「
anon」擴充套件已安裝在同一執行個體內的多個資料庫中,請針對每個資料庫完成所述步驟。 -
升級完成後,請重新啟用
anon擴充套件,並視需要重新套用遮罩規則。
強烈建議在執行升級之前,先驗證刪除延伸功能之前和之後的資料,以確保遮罩的一致性。
PostGIS
如果您使用的是 PostGIS,,請先升級 PostGIS,再升級 PostgreSQL。
SELECT postgis_extensions_upgrade();
使用下列查詢驗證 PostGIS 延伸升級。
SELECT postgis_full_version();
Logical replication slots
請在升級前刪除所有邏輯複製槽,並在升級後重新建立它們。 邏輯槽位與來源伺服器的狀態相關聯,應在升級後的執行個體上重新建立,並確保其狀態為乾淨的初始狀態。
SELECT pg_drop_replication_slot('<slot_name>');
就地進行主要版本升級
透過就地主要版本升級,您可以將部署升級至受支援的目標 主要版本,無需將 備份還原 至新的部署環境。 此方法維持相同的連線字串,無需重新配置部署。 然而,若新主要版本需要應用程式調整,則必須處理這些調整事項。
在就地進行主要版本升級的時段內,您的部署將經歷短暫的中斷時間。 這是預料之中的,因為此流程遵循了供應商建議的升級方法。 確切的持續時間可能會因您部署模式的大小和複雜性而異。 如果您的服務需要在這段時間內從升級的實體讀取資料,您可以 建立一個備用實體,並更新應用程式的連線詳細資料以指向備用實體。 這可確保您在開始升級前擁有最新的資料庫副本。 若就地升級未能成功完成,備用實例亦可被提升並用作主實例。 如需其他資訊,請參閱 原地主要版本升級時的唯讀複製品狀態。
Databases for PostgreSQL 讓客戶能靈活管理自身的備份作業。 就地主要版本升級程序不會在任務執行前後自動建立備份。 如果升級不成功,您可能需要從最近的有效備份中還原部署內容至新的執行個體。
為了確保最佳的恢復狀態,強烈建議您在執行 IPU 之前先建立一份新的備份,並在 IPU 完成後立即建立另一份備份。
- 在執行 IPU 之前進行備份,有助於保護資料完整性,並在升級失敗時,為您提供資料庫最新狀態的還原來源。
- 在執行 IPU 後立即進行備份,將為新的「PostgreSQL」主要版本時間軸建立第一個還原點。
- 若在 IPU 成功執行後等待下一次排程備份,則新版本的 PITR 及還原功能將無法使用,直至該次備份執行完成為止。 您仍可辨識出在 IPU 嘗試之前所產生的 PITR 時間戳記。 這讓您能夠將 IPU 執行前的最後一份可用備份,搭配 PITR 功能,將 IPU 執行前的 PostgreSQL 版本還原至新的部署環境中。 當您使用「備份與還原升級」功能時,同樣的規劃原則也適用。 如需更多資訊,請參閱「特定時間點還原(PITR)」。
若您親自執行這兩次備份,而非等待自動備份排程,便能在升級前後獲得更可預期的還原點。
開始之前
在開始升級程序之前,請考慮以下幾方面。
-
請透過使用者介面 (UI)、API、命令列介面 (CLI) 或 Terraform 檢查部署功能資訊,以確認您的部署版本是否可進行版本升級。
範例:使用 CLI 查詢版本升級資訊:
ibmcloud cdb capability-show versions postgresql -
在觸發 IPU 之前,請務必詳閱本主題中與預檢相關的要求。 IPU 直接在原始部署環境上運行,不會建立新的執行個體。 為確保客戶安全,本服務會在升級開始前執行預先檢查,若偵測到風險,將阻止該操作。 請特別確認以下事項:
- 您的部署最多包含 3 名成員。
- 您的部署狀態正常。
- 您的部署環境中至少有 10% 的可用磁碟空間。 IPU 預檢的預設最大允許磁碟使用率為 90%。
- 您的部署並未面臨嚴重的 I/O 壓力。 IPU 預檢查的預設最大允許 I/O 使用率為 90%。
- 您的資料庫結構大小和物件數量均在預檢的預設閾值範圍內。 預設情況下,單一資料庫結構的大小不得超過 100 GB,且索引與序列的總數必須低於 50,000 個。
- 您已在升級前完成所有必要的擴充功能及邏輯複製槽清理工作。
-
每個主要版本都包含一些功能,這些功能可能與先前版本不具向後相容性。 請查閱資料庫供應商的 發行說明,以確認是否有任何可能影響您應用程式的變更。
-
不支援將部署降級至先前版本。
-
就地主要版本升級一旦開始,便無法取消。
-
如果您沒有最新的備份,請考慮在升級前先進行備份。
| 來源:PostgreSQL 版本 | 受支援的原地升級目標 |
|---|---|
| 14 | 15、18 |
| 所有其他受支援的原始碼版本 | 18 |
此外,請注意,升級完成後,您的資料庫將運行 PostgreSQL 的新主要版本。 由於 PostgreSQL 會以特定版本的格式儲存資料,因此升級前的備份和 PITR 還原點均屬於較早版本的時間軸,無法還原至已升級的版本中。 為確保新版本能維持完整的還原及 PITR(特定時間點還原)功能,請在升級完成後立即執行新的備份。 該備份將成為新版本時間軸上未來還原作業的基準。
如果 IPU 失敗,仍可透過 PITR 使用升級前的有效備份,將較早的 PostgreSQL 版本還原至新實例中。
在使用者介面中升級
-
建立一個新的「Databases for PostgreSQL」,以測試升級流程。
透過[還原備份](/docs/cloud-databases?topic=cloud-databases-dashboard-backups&interface=ui#restore-backup)指令,從您現有的同版本部署中建立新的部署。 -
將您的預備環境應用程式指向測試部署。
請更新您的預備環境應用程式,使其指向測試部署環境。 請確認您的測試應用程式能成功連接到預備部署環境,且應用程式運作符合預期。 完成對預備環境的所有必要效能與運作測試。 -
請點擊「概覽」頁面上的「升級主要版本」按鈕,以升級您的測試部署的主要版本。
請記錄升級完成所需的時間,以便您能利用「升級有效期限」設定,將升級作業安排在維護時段內完成。 -
請確認您的預備環境應用程式能與新版資料庫正常運作。
如果您的應用程式運作正常,此步驟可確認升級生產環境資料庫應是安全的。 -
將您的生產資料庫部署升級至新版本。
在確認您的應用程式使用新版資料庫後運作正常後,即可返回管理主控台,並開始升級生產環境部署的流程。 在「概覽」頁面的「部署詳細資訊」區段中,點擊「升級主要版本」按鈕並依循步驟操作。當就地升級程序開始後,便無法停止或還原。 因此,若發生極不可能的錯誤,您的資料庫部署可能變得無法恢復。 因此,請建立備份,以便後續用於還原至新的部署環境。
此 expiration for starting upgrade 設定可讓您配置升級任務必須在「超時」期限內啟動,否則將自動取消。 此外,請預先在預備環境測試升級程序,以確保升級能在您期望的時間範圍內完成。 舉例來說,如果您希望在 1 小時內完成升級,且您已測試過升級程序並確認需時 30 分鐘,那麼您的升級工作必須在您確認要進行升級後的 30 分鐘內啟動。 因此,請將到期時間設定為30分鐘,如此一來,若程序未能在此時間內啟動,便不會超出您的時限範圍。
透過 API 升級
請使用以下指令進行就地升級:
curl -X PATCH https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/version -H 'Authorization: Bearer <>' -H 'Content-Type: application/json' -d '{"version": "15"}'
此 expiration for starting upgrade 設定可讓您配置升級任務必須在「超時」期限內啟動,否則將自動取消。 此外,請預先在預備環境測試升級程序,以確保升級能在您期望的時間範圍內完成。 舉例來說,如果您希望在 1 小時內完成升級,且您已測試過升級程序並確認需時 30 分鐘,那麼您的升級工作必須在您確認要進行升級後的 30 分鐘內啟動。 因此,請將到期時間設定為從現在起30分鐘後,如此一來,若程序未能在此時間內啟動,便不會超出您的時限範圍。
到期時間必須設定在從現在起5分鐘(預設值)至24小時之間。 如需更多資訊,請參閱 API Cloud Databases。
透過 CLI 升級
適用於 CDB 外掛程式版本 >= 0.20.0.
要檢視此部署的允許升級與還原轉換清單:
ibmcloud cdb deployment-capability-show <NAME|CRN> versions
要升級命令並加入所需參數:
ibmcloud cdb deployment-version-upgrade <NAME|CRN> <TARGET_VERSION>
要查看命令參數的完整詳細資訊:
ibmcloud cdb deployment-version-upgrade --help
此 expiration for starting upgrade 設定可讓您配置升級任務必須在「超時」期限內啟動,否則將自動取消。 此外,請預先在預備環境測試升級程序,以確保升級能在您期望的時間範圍內完成。 舉例來說,如果您希望在 1 小時內完成升級,且您已測試過升級程序並確認需時 30 分鐘,那麼您的升級工作必須在您確認要進行升級後的 30 分鐘內啟動。 因此,請將到期時間設定為30分鐘,如此一來,若程序未能在此時間內啟動,便不會超出您的時限範圍。
有效期限必須設定在從現在起 5 分鐘(預設值)至 24 小時之間。 設定過期時間有兩種方式:使用命令列介面 (CLI) --expire-in 或 --expire-at。 如需更多資訊,請參閱該指令的說明。
透過 Terraform 進行升級
適用於 Terraform 提供者版本 >= 1.79.2。
要升級,只需在您的設定檔中新增或修改 的 version 值。
在版本升級前跳過備份是危險的,若升級過程在任何階段失敗,可能會導致資料遺失:屆時將沒有可立即還原的備份。 因此,在執行就地主要版本升級任務之前,請務必先建立一份新的備份。
升級可能需要比預設超時更長的時間。 可透過設定 timeouts 屬性來設定較長的超時值。
Terraform 使用超時機制而非到期時間戳。 因此,請延長您的超時設定,因為您的超時更新值將被用作過期時間。 例如,若您設定20分鐘的時限,則到期時間將設定為20分鐘;若升級程序未能在此時間內啟動,該設定即告失效,升級程序亦不會啟動。 請注意,最長有效期為 24 小時,因此即使您將超時設定為 36 小時,若升級未在前 24 小時內開始,該升級仍會過期。
如果正在進行版本升級,請注意,某些任務可能會被排入佇列,並將在版本升級完成前暫停執行。
疑難排解
若您的應用程式在成功執行就地主要版本升級後出現意外問題,且需要回退至先前 PostgreSQL 版本,請聯繫我們的支援團隊以獲取指導。 請避免自行啟動 PITR 或還原備份,因為這可能會使復原作業變得複雜。
就地重大升級將在所有預檢驗全部通過後才會進行。 由於升級程序會直接在原始執行個體上運作,因此設有這些安全措施以保護您的部署。 若升級受阻,請檢查以下項目:
- 成員數量:就地主要版本升級支援最多 3 個成員的部署。 若您的部署包含超過 3 名成員,預檢查會阻擋升級程序。 無法透過 水平擴展 移除成員,因此請先向 IBM Cloud 技術支援 提交支援單,以減少成員數量,然後再重新嘗試升級。
- 叢集狀態:確保 Patroni 叢集運作正常,且具備明確的領導者/副本狀態。 若 Patroni 報告系統不穩定或發生故障轉移狀況,則無法進行升級作業。
- 磁碟空間:請確認是否有足夠的可用空間。 該過程採用
pg_upgrade鏈接模式,需要足夠的餘量。 若磁碟使用量超過設定的限制(預設值:90%),請在重新嘗試前釋放空間。 - 磁碟 I/O 負載:檢查當前的 I/O 使用率與 IOPS。 當系統處於高負載狀態時,升級作業將暫停執行,以避免效能下降或升級失敗。
- 架構大小與物件數量:如前所述,架構大小直接影響就地主要版本升級的持續時間。 請確保任何單一模式皆未超過最大容量限制(預設值:100 GB),且索引與序列物件的總數量維持在限制範圍內(預設值:50,000)。 大型架構或異常龐大的物件數量,在進行升級前可能需要執行清理或優化作業。
pg_upgrade透過建立新的系統表並直接重複使用舊的用戶資料檔案,實現快速升級。 建立這些系統表所需的時間會隨著資料庫物件的數量而增加。 可 透過監控整合 功能評估資源消耗狀況。 若並非所有資料庫元件皆可進行升級,則升級任務將失敗。 這可能是由於維護作業所致。 因健康檢查失敗而失敗的任務,可稍後重新嘗試執行。 若任務持續失敗,IBM Cloud 請向支援部門提交支援單。 若某些檢查項目與您的環境無關,但升級程序仍遭阻擋,請建立支援票證以獲取進一步協助。
從唯讀抄本升級
透過 配置唯讀抄本 來升級。 使用與部署相同的資料庫版本來佈建唯讀抄本,並在抄寫所有資料時等待。 當您的部署及其抄本同步時,請將唯讀抄本升級至執行新版資料庫的完整獨立式部署。 若要執行升級及升級步驟,請對 /deployments/{id}/remotes/promotion 端點使用 POST 要求,並在要求內文中包含您要升級至的版本。
此要求看起來如下:
curl -X POST \
https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/remotes/promotion \
-H 'Authorization: Bearer <>' \
-H 'Content-Type: application/json' \
-d '{
"promotion": {
"version": "14",
"skip_initial_backup": false
}
}' \
skip_initial_backup 是選用項目。 如果設為 true,當升級完成時,新部署不會執行起始備份。 您的新部署會在較短的時間內提供,但代價是在下一次自動備份執行之前,或您採取隨需應變備份之前,不會進行備份。
直接執行促銷和升級
若要評估主要版本升級的影響,請觸發測試執行。 測試會模擬促銷及升級,並將結果列印至資料庫日誌。 透過 日誌分析整合 存取和查看資料庫日誌。 這可確保您目前與其延伸一起執行的版本可以順利升級至您想要的版本。
在執行測試時,必須將 skip_initial_backup 設為 false,並定義 version。
指令看起來如下:
curl -X POST \
https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/remotes/promotion \
-H 'Authorization: Bearer <>' \
-H 'Content-Type: application/json' \
-d '{
"promotion": {
"version": "14",
"skip_initial_backup": false,
"dry_run": true
}
}' \
備份、還原與升級
您可以透過將資料的備份 還原 至執行新資料庫版本的新部署,來升級資料庫版本。
在使用者介面中升級
從 _部署儀表板_的 備份 功能表 還原備份 時,升級至新版本。 按一下備份上的 「還原」 到新分頁上的設定頁面,您可以在其中變更新部署的一些選項。 其中一個選項是資料庫版本,它會自動移入可供您升級至的版本。 選擇一個版本並點擊 “建立” 以啟動配置和復原過程。
透過 CLI 升級
若要透過 IBM Cloud CLI 從備份升級及還原,請從資源控制器使用佈建指令。
ibmcloud resource service-instance-create <DEPLOYMENT_NAME_OR_CRN> <SERVICE_ID> <SERVICE_PLAN_ID> <REGION> <SERVICE-ENDPOINTS>
參數 service-name、service-id、service-plan-id、region 以及 service-endpoints 均為必填項目。 您還需將版本和備份 ID 參數以 JSON 物件的形式傳遞給 -p 。 在備份時,會使用與來源部署相同的磁碟及記憶體來自動調整新部署的大小。
此指令看起來如下:
ibmcloud resource service-instance-create example-upgrade databases-for-postgresql standard us-south \
-p \ '{
"backup_id": "crn:v1:bluemix:public:databases-for-postgresql:us-south:a/54e8ffe85dcedf470db5b5ee6ac4a8d8:1b8f53db-fc2d-4e24-8470-f82b15c71717:backup:06392e97-df90-46d8-98e8-cb67e9e0a8e6",
"version":14
}'--service-endpoints "public"
透過 API 升級
在使用 資源控制器 API 從備份升級之前,請完成使用資源控制器 API 所需的步驟。 然後,傳送 POST 要求給 API。 參數 name、target、resource_group 和 resource_plan_id 都是必要的。 您也提供版本和備份 ID。 新部署與備份時的來源部署具有相同的記憶體及磁碟配置。
此指令看起來如下:
curl -X POST \
https://resource-controller.cloud.ibm.com/v2/resource_instances \
-H 'Authorization: Bearer <>' \
-H 'Content-Type: application/json' \
-d '{
"name": "my-instance",
"target": "bluemix-us-south",
"resource_group": "5g9f447903254bb58972a2f3f5a4c711",
"resource_plan_id": "databases-for-postgresql-standard",
"backup_id": "crn:v1:bluemix:public:databases-for-postgresql:us-south:a/54e8ffe85dcedf470db5b5ee6ac4a8d8:1b8f53db-fc2d-4e24-8470-f82b15c71717:backup:06392e97-df90-46d8-98e8-cb67e9e0a8e6",
"version":14
}'
強制升級
在終止支援日期之後,所有仍在使用已棄用版本的有效 Databases for PostgreSQL 部署都將強制升級至下一個受支援的版本。 例如,PostgreSQL 版本 13(已棄用)升級至版本 14。
在生命終止日期之前升級以避免以下風險:
- 沒有為此類強制升級提供 SLA。
- 您可能會遇到部分資料遺失的情況。
- 您的應用程式可能會出現長時間的停機狀況。
- 如果您的應用程式與新版本不相容,可能會停止運作。
- 您無法控制您的部署進行此升級的時間。
- 此強制升級沒有回滾過程。
有關生命週期終止日期,請參閱 版本政策頁面。
版本升級期間_的角色權限_問題
自 PostgreSQL 16起,角色權限的強制執行更加嚴格。 這是 PostgreSQL 的上游架構變更,並非 {{site.data.keyword.ibm}} 專屬的行為變更。 在較早的版本中,具備 CREATEROLE 屬性的角色能夠更廣泛地管理其他角色。 在 PostgreSQL 16 及後續版本中,若要授予或撤銷某個角色,該角色必須對另一個角色擁有「ADMIN OPTION」權限。 有關背景資訊,請參閱 PostgreSQL
16 版本說明、角色屬性,以及 GRANT 中的角色相關說明。
如果您是要從 PostgreSQL 15或更早版本升級至 PostgreSQL 16或更新版本,請在執行IPU之前檢視您的角色授權。 若升級後仍需繼續進行角色管理,請在開始升級前,先使用 WITH ADMIN OPTION 授予所需的角色。
若在升級後遇到與權限相關的錯誤,例如:
ERROR: only roles with the ADMIN OPTION on role "some_role" may grant this role
DETAIL: role "admin" is not permitted to grant role "some_role"
使用內建輔助函式 grant_admin_option_to_roles ,為特定角色恢復 ADMIN OPTION :
- 僅適用於從 PostgreSQL、v15 及更早版本升級至 PostgreSQL 16及更新版本的資料庫(若您遇到前述所述的錯誤)。
- 接受要套用修正的角色的任意清單。
- 此指令僅限由
admin使用者執行。 - 可安全多次執行 (idempotent)。
範例用法:
SELECT grant_admin_option_to_roles('role1', 'role2', 'role3');
此函式將指定角色(role1、role2、role3 )授予擁有 ADMIN OPTION 權限的 admin 使用者,使 admin 使用者能夠在已升級的實例中管理(授予、撤銷、變更或刪除)這些角色。