升級至新主要版本

Databases for PostgreSQL 提供三種不同的升級路徑:

  • 就地升級至新的主要版本。
  • 正在從備份還原。
  • 從唯讀副本進行升級。

當資料庫的主要版本即將達到生命週期結束(EOL)時,建議升級至最新的主要版本。

您可以在 IBM Cloud 目錄 頁面中查閱 Databases for PostgreSQL 的可用版本,或透過 Cloud Databases CLI 外掛程式指令 ibmcloud cdb deployables-show,或透過 Cloud Databases API /deployables 端點。

當您升級至新實例時,也需修改應用程式中的連線資訊。

在以下範例指令中,執行 {id} 時,必須提供資料庫執行個體的完整 CRN。 由於 CRN 包含特殊字元,因此必須採用 URL 編碼, 以避免發生「not_found」錯誤。

升級至較新版本的 PostgreSQL 主要版本之需求

在開始任何主要版本升級流程之前,請先檢視所有必須優先維護的外掛程式、複製物件及應用程式依賴項。

某些擴充功能和邏輯複製物件具有版本專屬性,或取決於伺服器端元件,這些元件必須與 PostgreSQL 的主版本相符。 在升級前將它們移除,有助於避免發生錯誤,並讓您在新版本運行後,僅重新建立受支援的物件。

待審查的擴充功能與邏輯複製物件

在升級之前,請檢視以下項目:

延伸規格

  • pg_repack
  • old_snapshot
  • wal2json
  • anon
  • PostGIS

複製槽

  • 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 工具嚴格禁止在存在複製槽的情況下進行主要版本升級,並會拋出嚴重錯誤並中止升級。

升級前:

  1. 確保所有待處理的 WAL 資料均已處理完畢。
  2. 請停止使用該複製槽的應用程式。
  3. 刪除複製槽:
SELECT pg_drop_replication_slot('your_slot_name');

升級完成後,您可以根據需要重新建立複製槽。 請注意,wal2json 並非透過 CREATE EXTENSION 安裝,而是透過資料庫參數(wal_levelmax_replication_slotsmax_wal_senders )及資料表權限進行設定,這些設定並不會阻礙升級作業。

anon

請在升級前移除「anon」擴充功能,若升級後仍需使用,請重新啟用該擴充功能。 在解除 anon 的訂閱之前,還需執行其他步驟。

若已安裝 anon 擴充套件,請在執行升級前,依照以下步驟操作,並以管理員身分執行相關指令。

  1. 移除所有遮罩規則(若已啟用)。

    SELECT anon.remove_masks_for_all_columns();
    
  2. 停用遮罩角色(若任何角色被標記為「遮罩」,升級可能會失敗)。

    SECURITY LABEL FOR anon ON ROLE <role_name> IS NULL;
    
  3. 移除帶有「cascade」選項的 anon 擴充套件。

    DROP EXTENSION anon CASCADE;
    
  4. 如果「anon」擴充套件已安裝在同一執行個體內的多個資料庫中,請針對每個資料庫依循所述步驟操作。

  5. 升級完成後,請重新啟用「anon」擴充功能,並根據需要重新套用遮罩規則。

強烈建議在刪除擴充功能之前和之後皆對資料進行驗證,以確保在執行升級之前,資料遮罩處理的一致性。

PostGIS

如果您使用的是 PostGIS,,請先升級 PostGIS,再升級 PostgreSQL。

SELECT postgis_extensions_upgrade();

請使用以下查詢來驗證「PostGIS」擴充套件的升級狀況。

SELECT postgis_full_version();

Logical replication slots

請在升級前刪除所有邏輯複製槽,並在升級後重新建立它們。 邏輯插槽與來源伺服器的狀態相關聯,應在升級後的執行個體上重新建立,並確保其狀態為乾淨狀態。

SELECT pg_drop_replication_slot('<slot_name>');

就地進行主要版本升級

透過就地主要版本升級(IPU),您可以將部署升級至受支援的目標 /docs/databases-for-postgresql?topic=databases-for-postgresql-versioning-policy#version-definitions,而無需將備份還原至新的部署環境。 此次升級會保留現有的連線字串,因此無需重新設定。

然而,若新版本引入了相容性差異,可能需要對應用程式進行變更。

在升級期間,您的部署系統會經歷短暫的中斷。 所需時間取決於您的部署規模與複雜程度。

如果您的應用程式在升級期間必須持續讀取資料,您可以配置一個 /docs/databases-for-postgresql?topic=databases-for-postgresql-read-only-replicas&interface=ui#read-only-replicas-provision,並更新您的應用程式以使用該複本。 如果升級未能成功完成,您可以將複本提升為主伺服器。 如需更多資訊,請參閱 /docs/databases-for-postgresql?topic=databases-for-postgresql-read-only-replicas&interface=ui#read-only-replicas-ipu。

Databases for PostgreSQL 在就地進行主要版本升級之前或之後,系統不會自動建立備份。

為提高可恢復性,請建立:

  • 在升級前進行備份,以保護您當前的資料狀態
  • 升級完成後立即進行備份,以建立新版本的第一个還原點

若您在升級後未執行備份,則在新版本中將無法使用「特定時間點還原」(PITR)功能,直至下一次排程備份完成為止。

在升級前建立的備份和 PITR 還原點仍與舊版本相關聯,無法還原至升級後的版本。 然而,仍可利用它們將較早的版本還原至新的部署環境中。

邏輯複製槽

請在升級前刪除所有邏輯複製槽,並在升級後重新建立它們。 邏輯複製槽與來源伺服器的狀態相關聯,必須在升級後的執行個體上重新建立。

SELECT pg_drop_replication_slot('<slot_name>');

開始之前

在開始升級之前,請先確認以下事項:

  • 請透過使用者介面 (UI)、API、命令列介面 (CLI) 或 Terraform,確認您的部署是否支援版本升級。

    範例(CLI):

    ibmcloud cdb capability-show versions postgresql
    
  • 檢視預先核查要求。 此升級會在原始部署環境中執行, 若偵測到風險,則會被阻擋。 請確定下列項目:

    • 部署狀況良好
    • 至少有 10% 的可用磁碟空間
    • I/O 使用率低於 90%
    • 模式大小與物件數量均在支援範圍內
    • 已完成所需的擴充功能及邏輯複製槽清理作業
  • 請參閱《 https://www.postgresql.org/docs/release/ 》,了解可能影響您應用程式的相容性變更。

  • 不支援降級至較早的版本。

  • 就地升級一旦開始,便無法取消。

  • 在升級之前,請確保有最新的備份可用。

支援以下版本的原地升級路徑:Gen2
來源:PostgreSQL 版本 受支援的原地升級目標
18 未來的主要版本(如有)

Gen2 始於《 PostgreSQL 》第 18 頁。 隨著新版本獲得支援,系統會陸續新增升級路徑。 關於較早版本(14–17),請參閱 /docs/databases-for-postgresql?topic=databases-for-postgresql-upgrading。

升級完成後,您的部署將運行 PostgreSQL 的新主要版本。 升級前的備份和 PITR 還原點屬於較早版本的時間軸,無法還原至已升級的版本中。

為了在新版本中維持還原及 PITR 功能,請在升級完成後立即進行備份。 此備份將成為未來還原作業的基準。

若升級失敗,仍可利用 PITR 將升級前的備份還原至新部署環境,以恢復至較早的版本。

在使用者介面中進行升級

  1. 透過還原現有部署中相同版本的備份,建立一個測試部署。

  2. 請更新您的預備環境應用程式,使其使用測試部署,並驗證功能是否正常運作。

  3. 請從「概覽」頁面點擊「升級主要版本」,開始進行升級。

  4. 在升級後的測試部署環境中驗證應用程式的運作行為。

  5. 在驗證完成後,請升級您的生產環境部署。

    升級開始後,將無法停止或還原。 請確保有最新的備份可用。

「開始升級的過期時間」指升級工作必須在何時之前開始執行,否則將被自動取消。 請根據您的維護時段設定此值。 例如,如果升級需要 30 分鐘,而您的時限為 1 小時,請將過期時間設定為 30 分鐘。 有效期限可設定在 5 分鐘至 24 小時之間。

透過 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"}'

如需更多資訊,請參閱 Cloud Databases API

透過命令列介面 (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

請使用 --expire-in--expire-at 來設定過期時間。

透過 Terraform 進行升級

此功能適用於 Terraform 提供者版本 >= 1.79.2。

若要升級,請更新設定檔中的 version 值。

若在升級前跳過備份步驟,一旦升級失敗,可能會導致資料遺失。 請確保有最新的備份可用。

如有需要,請增加超時時間,因為 Terraform 使用的是超時設定,而非到期時間戳記。

疑難排解

若在成功升級後發生問題,且您需要還原至先前版本,請聯絡 IBM Cloud® 技術支援以獲取指引。 請避免在未經指導的情況下執行 PITR 或還原作業,因為這可能會使復原過程變得複雜。

只有在所有預檢均通過後,才會執行升級。 如果升級受阻,請確認:

  • 叢集狀態(Patroni 狀態為穩定)
  • 足夠的可用磁碟空間
  • 可接受的磁碟 I/O 使用率
  • 模式大小與物件數量限制

大型資料結構和龐大的物件數量可能會延長升級所需的時間。

如果升級嘗試持續失敗,請透過 https://cloud.ibm.com/login?redirect=%2Funifiedsupport%2Fsupportcenter 提交支援工單。

從唯讀副本進行升級

透過設定唯讀副本來 進行升級。 建立一個與您的部署具有相同資料庫版本的唯讀複本,並等待其完成所有資料的複製。 當您的部署及其複本同步完成後,請將唯讀複本提升並升級為運行新版資料庫的完整、獨立部署。 要執行升級與提升步驟,請在請求正文中向 /deployments/{id}/remotes/promotion 該端點,並在請求正文中包含您要升級到的版本。

此請求的格式如下:

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 進行升級及從備份還原,請使用資源控制器中的 provisioning 指令。

ibmcloud resource service-instance-create <DEPLOYMENT_NAME_OR_CRN> <SERVICE_ID> <SERVICE_PLAN_ID> <REGION>

參數 service-nameservice-idservice-plan-id 以及 region 均為必填項目。 您還需將版本和備份 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
}'

透過 API 進行升級

在使用「資源控制器 API」從備份進行升級之前,請先完成必要的步驟。 接著,向 API 發送一個 POST 請求。 參數 nametargetresource_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 的上游架構變更,並非 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 user 執行。
  • 多次執行是安全的(冪等)。

範例用法:

SELECT grant_admin_option_to_roles('role1', 'role2', 'role3');

此函式將指定的角色(role1role2role3 )授予具備 ADMIN OPTION 權限的 admin 使用者,使 admin 使用者能夠在已升級的實例中管理(授予、撤銷、變更或刪除)這些角色。

PostgreSQL 主要版本的變更紀錄

有關 PostgreSQL 較早版本(14-17)的資訊,請參閱 Gen1 的變更紀錄