本頁說明如何升級資料庫主要版本,方法是就地升級 Cloud SQL 執行個體,而非遷移資料。
簡介
資料庫軟體供應商會定期發布新版主要版本,其中包含新功能、效能改善項目和安全性強化功能。Cloud SQL 會在新版本發布後採用。Cloud SQL 支援新的主要版本後,您就可以升級執行個體,確保資料庫維持在最新狀態。
您可以就地升級執行個體的資料庫版本,也可以遷移資料。就地升級是升級執行個體主要版本的簡便方法。您不需要遷移資料或變更應用程式連線字串。透過就地升級,您可以在升級後保留目前執行個體的名稱、IP 位址和其他設定。就地升級不需要移動資料檔案,而且速度更快。在某些情況下,停機時間會比資料遷移作業所需的時間短。
如果是 MySQL 8.0.15 以前的版本,MySQL 就地升級作業會使用mysql_upgrade 公用程式。如果是 MySQL 8.0.16 以上版本,MySQL 就地升級作業會由 MySQL server 程序處理。如要進一步瞭解就地升級作業,請參閱「MySQL 升級程序升級的項目」。規劃升級主要版本
- 確認您具備執行主要版本升級的必要角色:「Cloud SQL 擁有者」或「Cloud SQL 管理員」。
選擇目標主要版本。
gcloud
如要瞭解如何安裝及開始使用 gcloud CLI,請參閱「安裝 gcloud CLI」。如要瞭解如何啟動 Cloud Shell,請參閱「使用 Cloud Shell」。
如要查看執行個體可進行就地升級的資料庫版本,請按照下列步驟操作:
- 執行下列指令。
- 在指令的輸出結果中,找出標示為
upgradableDatabaseVersions的區段。 - 每個子區段都會傳回可升級的資料庫版本。在每個子章節中,查看下列欄位。
majorVersion:可做為就地升級目標的主要版本。name:資料庫版本字串,包含主要版本。如果是 MySQL 適用的 Cloud SQL,這個欄位也會包含資料庫的子版本。displayName:資料庫版本的顯示名稱。
gcloud sql instances describe INSTANCE_NAME
將 INSTANCE_NAME 替換為執行個體名稱。
REST v1
如要查看可就地升級的主要版本,請使用 Cloud SQL Admin API 的
instances.get方法。使用任何要求資料之前,請先修改下列項目的值:
- INSTANCE_NAME:執行個體名稱。
HTTP 方法和網址:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME
請展開以下其中一個選項,以傳送要求:
您應該會收到如下的 JSON 回覆:
upgradableDatabaseVersions: { major_version: "MYSQL_8_0" name: "MYSQL_8_0_36" display_name: "MySQL 8.0.36" }REST v1beta4
如要檢查執行個體的主要版本就地升級作業可用的目標資料庫版本,請使用 Cloud SQL Admin API 的
instances.get方法。使用任何要求資料之前,請先修改下列項目的值:
- INSTANCE_NAME:執行個體名稱。
HTTP 方法和網址:
GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME
請展開以下其中一個選項,以傳送要求:
您應該會收到如下的 JSON 回覆:
upgradableDatabaseVersions: { major_version: "MYSQL_8_0" name: "MYSQL_8_0_36" display_name: "MySQL 8.0.36" }如需 Cloud SQL 支援的資料庫版本完整清單,請參閱資料庫版本和版本政策。
請考量每個資料庫主要版本提供的功能,並解決不相容問題。
新的主要版本會導入不相容的變更,您可能需要修改應用程式程式碼、結構定義或資料庫設定。升級資料庫執行個體前,請先查看目標主要版本的版本資訊,找出必須解決的不相容問題。
升級至較新版本後,部分系統變數的預設值可能會變更。舉例來說,MySQL 5.6 和 MySQL 5.7 的
character_set_server預設值為utf8。升級至 MySQL 8.0 時,character_set_server的預設值會變更為utf8mb4。如要還原為utf8,您必須手動將資料庫旗標值變更為舊值。詳情請參閱「設定資料庫旗標」。大部分的預設值變更都是由 MySQL Community 完成 (詳情請參閱「升級伺服器預設值」)。執行升級前檢查。
以模擬測試升級。
在升級正式資料庫之前,請先在測試環境中進行端對端升級程序模擬測試。您可以複製執行個體,建立資料的相同副本,並測試升級程序。
除了驗證升級是否順利完成,請執行測試,確保應用程式在升級後的資料庫中運作正常。
決定升級時間。
升級時,執行個體會有一段時間無法使用。請規劃在資料庫活動量偏低的時段升級。
為升級主要版本做好準備
升級前,請先完成下列步驟:
- 如果您要從 MySQL 8.0 升級至 MySQL 8.4,請更新現有使用者帳戶的驗證外掛程式,改用
caching_sha2_password驗證外掛程式,而非已淘汰的mysql_native_password外掛程式。 如要將現有的資料庫使用者帳戶變更為使用caching_sha2_password驗證外掛程式,請使用下列指令: 將 username 和 user_password 替換為要更新的內建驗證資料庫使用者帳戶值。ALTER USER 'username'@'%' IDENTIFIED WITH caching_sha2_password BY 'user_password';
-
檢查磁碟空間和執行個體機型。
升級主要版本時,需要額外的磁碟空間和記憶體,才能儲存升級後的資料表和新的資料字典。如果磁碟空間不足,升級就會失敗,並復原為原始版本。Cloud SQL 建議每個資料表至少要有 100 KB 的記憶體。
使用 MySQL 8.4 以上版本搭配 Cloud SQL Auth Proxy 時的必要設定
搭配 Cloud SQL Auth Proxy 使用 MySQL 8.4 以上版本時,您必須使用 MySQL 設定 allowPublicKeyRetrieval=true 設定應用程式資料庫。升級資料庫版本前,您必須先使用這項設定升級用戶端應用程式。
舉例來說,如果您使用 mysql 用戶端,請使用 --get-server-public-key 旗標:
mysql -u username -p --get-server-public-key
如果您使用 Java 程式設計語言,請使用下列項目:
config.setJdbcUrl("jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName);
config.addDataSourceProperty("allowPublicKeyRetrieval", "true");
評估執行個體的升級準備度
Cloud SQL 可讓您在升級主要版本前,對執行個體執行預檢。這項預先檢查作業是長時間執行的作業 (LRO),會檢查執行個體是否已準備好升級。有助於在升級作業前找出潛在問題,例如不相容、設定問題或資料問題。
前置檢查會執行 MySQL Shell 升級檢查公用程式,確認執行個體是否已準備好升級至下一個主要版本。如果執行個體尚未準備就緒,這項公用程式會列出您必須先修正的問題,才能開始升級。這些問題是由於兩個主要版本之間已知的不相容性所致。Cloud SQL 可與工作負載並行執行前置檢查程序。在執行主要版本升級前先執行預檢,有助於避免升級失敗。
執行預檢時,會發生下列其中一種情況:
- 未發現問題:前置檢查順利完成,且未發現任何問題。
- 發現問題:前置檢查已順利完成,但發現會阻礙升級的錯誤。必須先解決這些問題,才能升級。
- 發現警告:前置檢查已順利完成,但發現警告。查看警告。 建議您先解決所有問題,再進行升級。
根據前置檢查結果,您可以繼續升級,或先修正發現的問題再升級。
限制
使用主要版本升級前檢查時,請注意下列限制:
- 執行個體狀態必須設為
RUNNING。
執行個體不得有任何待處理的封鎖作業。如果封鎖作業待處理,前置檢查會導致錯誤,並顯示下列訊息:
Operation failed because another operation was already in progress. Try your request after the current operation is complete.前置檢查需要連線至執行個體上的所有資料庫。如果資料庫無法存取、已鎖定或沒有回應,前置檢查可能會失敗或顯示錯誤。建議您在資料庫負載較低時執行前置檢查。
前置檢查會檢查連續主要版本的 MySQL 適用的 Cloud SQL 升級作業是否相容。舉例來說,您可以先執行 MySQL 5.7 和 MySQL 8.0 之間的升級前檢查,再執行 MySQL 8.0 和 MySQL 8.4 之間的升級前檢查, 然後執行 MySQL 8.4 和 MySQL 9.7 之間的升級前檢查。
預檢不支援檢查同一主要版本內的子版本升級。舉例來說,您無法對從 MySQL 8.0.31 升級至 8.0.45 執行預檢。
預檢時間上限為三小時。如果預檢作業超過三小時的限制,程序就會逾時並自動取消。
MySQL Shell 升級檢查工具可能無法在預先檢查程序中偵測到所有不相容情況。升級仍有可能失敗。此外,如果未解決部分警告,可能會導致主要版本無法升級。
事前準備
- 確認執行個體已啟用 Cloud SQL Admin API。
- 確認您具備
cloudsql.instances.preCheckMajorVersionUpgradeIAM 權限。
執行預檢
如要執行主要版本升級前檢查,請按照下列步驟操作:
gcloud
-
使用
gcloud beta sql instances pre-check-major-version-upgrade執行前置檢查:gcloud beta sql instances pre-check-major-version-upgrade INSTANCE_NAME \ --target-database-version=TARGET_DATABASE_VERSION \ --project=PROJECT_ID \ [--async]
更改下列內容:
- INSTANCE_NAME:執行個體的名稱。
- TARGET_DATABASE_VERSION:要將執行個體升級至的主要版本。如要查看資料庫版本,請參閱「規劃升級作業」。
- PROJECT_ID:專案的 ID。 Google Cloud
選用:使用
--async旗標以非同步方式執行指令。 如果您使用
--async旗標以非同步方式執行pre-check-major-version-upgrade指令,請按照下列步驟操作:- 取得前置檢查作業名稱:
使用加上
--instance旗標的gcloud sql operations list指令:gcloud sql operations list --instance=INSTANCE_NAME
更改下列內容:
- INSTANCE_NAME:執行個體的名稱。
-
監控前置檢查的狀態。
使用
gcloud sql operations describe指令:gcloud sql operations describe OPERATION_NAME
更改下列內容:
- OPERATION_NAME:在上一個步驟中擷取的預檢作業名稱。
- 取得前置檢查作業名稱:
- 如果沒有以非同步方式執行
pre-check-major-version-upgrade指令,請等待預檢完成,然後查看結果。
REST v1beta4
-
執行前置檢查。
使用任何要求資料之前,請先修改下列項目的值:
- PROJECT_ID:專案 ID
- INSTANCE_ID:執行個體 ID
- TARGET_DATABASE_VERSION:要升級的主要版本。如要查看可用的資料庫版本清單,請參閱「規劃升級作業」。
HTTP 方法和網址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/preCheckMajorVersionUpgrade
JSON 要求主體:
{ "preCheckMajorVersionUpgradeContext": { "targetDatabaseVersion": "TARGET_DATABASE_VERSION" } }請展開以下其中一個選項,以傳送要求:
您應該會收到如下的 JSON 回覆:
{ "message": "Precheck description of finding", "message_type": "ERROR", "actions_required": [ "Precheck action required to fix the finding" ] } -
取得前置檢查作業名稱。
使用
GET要求和operations.list方法,並將PROJECT_ID替換為專案 ID。GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations
更改下列內容:
- PROJECT_ID:專案的 ID。 Google Cloud
-
監控前置檢查的狀態。
使用
GET要求和operations.list方法:GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operation/OPERATION_NAME
更改下列內容:
- PROJECT_ID:專案的 ID。 Google Cloud
- operation_name:在上一個步驟中擷取的預檢作業名稱。
查看前置檢查結果
預檢完成後,執行個體即可升級,或是有問題需要處理。
可開始升級
如果預檢順利完成,且 preCheckResponse 陣列為空白,表示未發現任何問題或警告。執行個體已準備好升級主要版本。如要繼續,請參閱「執行主要版本升級」。
還無法升級
如果預檢作業順利完成,但 preCheckResponse 陣列包含問題,表示執行個體尚未準備好升級,需要處理。系統識別出的問題可能會或可能不會阻礙升級。preCheckResponse會以以下訊息類型指出這些問題:
| 類型 | 說明 | 要封鎖升級嗎? |
|---|---|---|
INFO |
資訊型訊息。 | 否 |
WARNING |
系統發現潛在問題。 Cloud SQL 建議您先查看並解決警告,再進行升級,確保完全相容。 | 是 |
ERROR |
系統發現重大問題,導致無法升級。這些問題可能會導致升級失敗。您必須先解決這些問題,才能升級執行個體。 | 是 |
INFO 訊息,您可以升級,但升級後可能會發生問題。建議您先查看訊息詳細資料並解決問題,再進行升級。如果執行個體有 ERROR 或 WARNING 訊息,請務必先解決這些問題,再進行升級。
每個問題類型都包含 message 和 actions_required 欄位。請逐一查看問題,瞭解問題類型和解決方法。如要進一步瞭解常見問題和解決方案,請參閱「常見的主要版本升級前檢查錯誤」。
解決問題後,請重新執行前置檢查,確認執行個體已準備好升級。預檢通過後,即可升級執行個體。
取消主要版本升級前檢查
您可以取消 MySQL 適用的 Cloud SQL 的主要版本升級前檢查作業。
事前準備
如要取消主要版本升級前檢查,您需要前檢查作業的 ID。您需要在 gcloud 或 REST API 指令中指定這個 ID,Cloud SQL 才能知道要取消哪個作業。
作業 ID 會在回應的 name 欄位中傳回。
您也可以對 Cloud SQL 執行個體發出 operations.list 呼叫,找出作業 ID。
取消訂閱
您可以使用 gcloud 或 REST API 指令取消前置檢查作業。
gcloud
取得前置檢查作業 ID。
使用
gcloud sql operations list指令並加上--instance標記:gcloud sql operations list --instance=INSTANCE_NAME更改下列內容:
- INSTANCE_NAME:執行個體的名稱。
取消預檢。
使用
gcloud sql operations cancel指令:gcloud sql operations cancel OPERATION_ID更改下列內容:
- OPERATION_ID:上一個步驟中擷取的作業 ID。
REST v1beta4
取得前置檢查作業 ID。
使用 GET 要求和
operations.list方法,並將PROJECT_ID替換為專案 ID。GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations更改下列內容:
- PROJECT_ID:專案的 ID。 Google Cloud
取消預檢。
使用任何要求資料之前,請先修改下列項目的值:
- PROJECT_ID:專案的 ID。 Google Cloud
- OPERATION_ID:上一個步驟中擷取的作業 ID。
HTTP 方法和網址:
POST https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID/cancel
請展開以下其中一個選項,以傳送要求:
您應該會收到如下的 JSON 回覆:
這個 REST API 呼叫不會傳回任何回應。
查看取消狀態
您可以使用 gcloud 或 REST API 指令,檢查已取消的預檢作業狀態。
gcloud
查看取消狀態。
使用
gcloud sql operations describe指令:gcloud sql operations describe OPERATION_ID更改下列內容:
- OPERATION_ID:已取消的預檢作業 ID。
REST v1beta4
查看取消狀態。
使用 GET 要求和
operations.list方法:GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID更改下列內容:
- PROJECT_ID:專案的 ID。 Google Cloud
- OPERATION_ID:已取消的預檢作業 ID。
排解取消問題
| 問題 | 疑難排解 |
|---|---|
|
錯誤訊息: |
您嘗試取消的預檢作業已完成、失敗或已取消。如果作業正在執行,可以取消作業。 |
|
錯誤訊息: |
如果您傳遞給取消指令的 OPERATION_ID 錯誤,通常會發生這項錯誤,具體來說,就是傳遞不支援取消作業的作業類型 ID。確認您使用的是與要取消的主要版本升級前檢查相關聯的 OPERATION_ID。 |
|
錯誤訊息: |
Cloud SQL 目前無法取消前置檢查作業。請稍後再試。如果問題持續發生,請與 Cloud Customer Care 聯絡。 |
升級主要版本
您可以升級單一 Cloud SQL 執行個體的主要版本,也可以升級主要執行個體的主要版本,並將所有副本 (包括連鎖副本和跨區域副本) 納入升級範圍。
升級單一執行個體的主要版本
當您為單一執行個體啟動升級作業時,Cloud SQL 會執行下列動作:
- 檢查執行個體設定,確保執行個體可升級。
- Cloud SQL 驗證設定後,執行個體就會無法使用。
- 建立升級前備份。
- 在執行個體上執行升級。
- 讓執行個體可供使用。
- 建立升級後備份。
控制台
-
前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。
- 如要開啟執行個體的「總覽」頁面,請按一下執行個體名稱。
- 按一下 [編輯]。
- 在「執行個體資訊」部分,按一下「升級」按鈕,然後確認要前往升級頁面。
- 在「選擇資料庫版本」頁面中,按一下「要升級的資料庫版本」清單,然後選取其中一個可用的資料庫主要版本。
- 按一下「繼續」。
- 在「執行個體 ID」方塊中輸入執行個體名稱,然後按一下「開始升級」按鈕。
確認執行個體「總覽」頁面上的執行個體名稱下方,顯示升級後的資料庫主要版本。
gcloud
開始升級。
使用
gcloud sql instances patch指令並加上--database-version旗標。執行指令前,請先替換下列項目:
- INSTANCE_NAME:執行個體的名稱。
- DATABASE_VERSION:資料庫主要版本的列舉,必須高於目前版本。指定可做為執行個體升級目標的主要版本資料庫版本。您可以取得這個列舉,做為「規劃升級」的第一步。 如需資料庫版本列舉的完整清單,請參閱 SqlDatabaseEnums。
gcloud sql instances patch INSTANCE_NAME \ --database-version=DATABASE_VERSION
主要版本升級需要幾分鐘才能完成。系統可能會顯示訊息,指出作業時間超出預期。您可以忽略這則訊息,也可以執行
gcloud sql operations wait指令來關閉訊息。取得升級作業名稱。
使用
gcloud sql operations list指令並加上--instance旗標。執行指令前,請替換下列項目: * INSTANCE_NAME:執行個體的名稱。
gcloud sql operations list --instance=INSTANCE_NAME
監控升級狀態。
使用
gcloud sql operations describe指令。執行指令前,請將 OPERATION 變數替換為上個步驟中擷取的升級作業名稱。
gcloud sql operations describe OPERATION
REST v1
開始直接升級。
使用
instances:patch方法傳送 PATCH 要求。使用任何要求資料之前,請先替換下列變數:
- PROJECT_ID:專案 ID。
- INSTANCE_NAME:執行個體的名稱。
HTTP 方法和網址:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAMEJSON 要求內文:
{ "databaseVersion": DATABASE_VERSION }
將 DATABASE_VERSION 替換為資料庫主要版本的列舉,該版本必須高於目前版本。指定可做為執行個體升級目標的主要版本資料庫版本。您可以取得這個列舉,做為「規劃升級」的第一步。 如需資料庫版本列舉的完整清單,請參閱 SqlDatabaseVersion。
取得升級作業名稱。
使用 GET 要求和
operations.list方法,並將 PROJECT_ID 替換為專案 ID。HTTP 方法和網址:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations監控升級狀態。
使用 GET 要求搭配
operations.get方法,並替換下列變數:- PROJECT_ID:專案 ID。
- OPERATION_NAME:在上一個步驟中擷取的升級作業名稱。
HTTP 方法和網址:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operation/OPERATION_NAME
Terraform
如要使用 Terraform 升級資料庫的主要版本,您必須在 google_sql_database_instance 資源定義中,將 database_version 引數設為目標主要版本。您必須使用 Google Cloud 4.34.0 以上版本的 Terraform 供應程式。
以下範例說明基本的 google_sql_database_instance 設定。如要升級主要版本,請將 database_version 引數設為相關主要版本。
對 Terraform 引數進行下列變更:
database_version:將此值設為升級的目標主要版本。deletion_protection:定義根層級的 Terraform 安全防護措施,防止執行個體遭到刪除。true:防止 Terraform 毀損執行個體。系統會封鎖任何打算刪除這項資源的 Terraform 作業。false:允許 Terraform 刪除執行個體。
查看 Terraform 計畫
套用任何變更前,請務必執行 terraform plan 並仔細檢查輸出內容。資源名稱旁的符號表示 Terraform 將如何套用變更:
~就地更新:這個符號表示 Terraform 會修改現有執行個體。變更database_version時,這是就地升級主要版本時的預期安全結果。+/-重新建立 (強制取代):這個符號表示 Terraform 打算刪除目前的執行個體,並建立新的執行個體。- 如果
deletion_protection設為true,Terraform 會顯示錯誤訊息,並封鎖這項危險的取代作業。您必須在設定中明確設定deletion_protection = false,然後再次執行terraform apply來更新狀態,後續的apply才會允許銷毀及重新建立。 - 如果
deletion_protection設為false,terraform apply會繼續執行資料遺失程序。
如果設定變更或就地修改的升級路徑不受支援,系統可能會排定替換 (刪除並重建) 執行個體。如果發現執行個體已排定刪除和重建作業,請立即停止並調查排定更換作業的原因。
- 如果
檢查 terraform plan 輸出內容,確認只顯示資料庫版本變更的就地更新 (~) 後,即可套用設定
如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節的步驟。
準備 Cloud Shell
- 啟動 Cloud Shell。
-
設定要套用 Terraform 設定的預設 Google Cloud 專案 。
每項專案只需要執行一次這個指令,且可以在任何目錄中執行。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 設定檔中設定明確值,環境變數就會遭到覆寫。
準備目錄
每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。
-
在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱的副檔名必須是
.tf,例如main.tf。在本教學課程中,這個檔案稱為main.tf。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您正在學習教學課程,可以複製每個章節或步驟中的程式碼範例。
將程式碼範例複製到新建立的
main.tf中。視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您使用這個選項。
- 查看並修改範例參數,套用至您的環境。
- 儲存變更。
-
初始化 Terraform。每個目錄只需執行一次這項操作。
terraform init
如要使用最新版 Google 供應商,請加入
-upgrade選項:terraform init -upgrade
套用變更
-
查看設定,確認 Terraform 即將建立或更新的資源符合您的預期:
terraform plan
視需要修正設定。
-
執行下列指令,並在提示中輸入
yes,套用 Terraform 設定:terraform apply
等待 Terraform 顯示「Apply complete!」訊息。
- 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。
當您提出就地升級要求時,Cloud SQL 會先執行升級前檢查。如果 Cloud SQL 判斷執行個體尚未準備好升級,升級要求就會失敗,並顯示訊息,建議您如何解決問題。另請參閱「排解主要版本升級問題」。
在主要版本升級中加入副本
如果主要執行個體有副本,您可以將所有副本納入升級作業。Cloud SQL 可以升級主要執行個體的所有備用資源,包括跨區域備用資源和串聯式備用資源。
在主要版本升級時納入備用資源,Cloud SQL 會執行下列操作:
- 檢查主要執行個體和副本的設定,確保執行個體和副本可升級。
- 導致主要執行個體無法使用。
- 建立主要執行個體的升級前備份。
- 停止所有副本的複製作業。
- 對主要執行個體執行升級作業。
- 如果主要執行個體升級成功,主要執行個體就會再次可用,並重新啟動複製作業。
- Cloud SQL 會在升級後備份主要執行個體。
- Cloud SQL 會繼續升級所有備用資源。
即使備用資源的主要版本升級失敗,主要執行個體仍可繼續使用。
如要在主要版本升級中納入副本,請勿使用Google Cloud 控制台或 Terraform。您只能使用 gcloud CLI 或 Cloud SQL Admin API。
gcloud
開始升級。
使用
gcloud sql instances patch指令,並加上--database-version和 旗標。--include-replicas-for-major-version-upgrade執行指令前,請先替換下列項目:
- INSTANCE_NAME:主要執行個體的名稱。
- DATABASE_VERSION:資料庫主要版本的列舉,必須高於目前版本。指定可做為執行個體升級目標的主要版本資料庫版本。您可以取得這個列舉,做為「規劃升級」的第一步。 如需資料庫版本列舉的完整清單,請參閱 SqlDatabaseEnums。
gcloud sql instances patch INSTANCE_NAME \ --database-version=DATABASE_VERSION \ --include-replicas-for-major-version-upgrade
主要版本升級需要幾分鐘才能完成。系統可能會顯示訊息,指出作業時間超出預期。您可以忽略這則訊息,也可以執行
gcloud sql operations wait指令來關閉訊息。升級副本可能需要幾分鐘才能完成。如要查看升級狀態,請按照下列步驟操作:取得升級作業名稱。
使用
gcloud sql operations list指令並加上--instance旗標。執行指令前,請將 INSTANCE_NAME 變數替換為執行個體名稱。
gcloud sql operations list --instance=INSTANCE_NAME
監控升級狀態。
使用
gcloud sql operations describe指令。執行指令前,請將 OPERATION 變數替換為上個步驟中擷取的升級作業名稱。
gcloud sql operations describe OPERATION
REST
開始直接升級。
使用
instances:patch方法傳送 PATCH 要求。使用任何要求資料之前,請先替換下列變數:
- PROJECT_ID:專案 ID。
- INSTANCE_NAME:執行個體的名稱。
HTTP 方法和網址:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAMEJSON 要求內文:
{ "databaseVersion": DATABASE_VERSION "includeReplicasForMajorVersionUpgrade": true }
- 將 DATABASE_VERSION 替換為資料庫主要版本的列舉,該版本必須高於目前版本。指定可做為執行個體升級目標的主要版本資料庫版本。您可以取得這個列舉,做為「規劃升級」的第一步。 如需資料庫版本列舉的完整清單,請參閱 SqlDatabaseVersion。
- 在
includeReplicasForMajorVersionUpgrade欄位中,指定true。
取得升級作業名稱。
使用 GET 要求和
operations.list方法,並將 PROJECT_ID 替換為專案 ID。HTTP 方法和網址:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations監控升級狀態。
使用 GET 要求搭配
operations.get方法,並替換下列變數:- PROJECT_ID:專案 ID。
- OPERATION_NAME:在上一個步驟中擷取的升級作業名稱。
HTTP 方法和網址:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operation/OPERATION_NAME
自動升級備份
執行主要版本升級時,Cloud SQL 會自動建立兩個隨選備份 (稱為升級備份):
- 第一次升級備份是升級前備份,會在升級開始前立即建立。您可以使用這項備份資料,將資料庫執行個體還原至先前版本的狀態。
- 第二個升級備份是升級後備份,會在允許對升級後的資料庫執行個體進行新寫入作業後立即建立。
查看備份清單時,升級備份會列出類型 On-demand。升級備份會加上標籤,方便您快速識別。
舉例來說,如果您要從 MySQL 5.7 升級至 MySQL 8.0,升級前的備份會標示為 Pre-upgrade backup, MYSQL_5_7 to MYSQL_8_0.,升級後的備份則會標示為 Post-upgrade backup, MYSQL_8_0 from MYSQL_5_7.。如果您要從 MySQL 8.0 升級至 MySQL 8.4,升級前的備份會標示為 Pre-upgrade backup, MYSQL_8_0 to MYSQL_8_4.,升級後的備份則會標示為 Post-upgrade backup, MYSQL_8_4 from MYSQL_8_0.。如果您要從 MySQL 8.4 升級至 MySQL 9.7,升級前的備份會標示為 Pre-upgrade backup, MYSQL_8_4 to MYSQL_9_7.,升級後的備份則會標示為 Post-upgrade backup, MYSQL_9_7 from MYSQL_8_4.。
與其他隨選備份一樣,升級備份會一直保留在伺服器上,直到您刪除備份或執行個體為止。如果已啟用 PITR,升級備份檔在保留期限內就無法刪除。如要刪除升級備份,必須停用 PITR,或等到升級備份超出保留期限。
完成主要版本升級
升級主要執行個體後,請按照下列步驟完成升級:-
執行驗收測試。
執行測試,確認升級後的系統運作正常。
-
選用:更新使用者權限。
MySQL 8.0 的安全性和帳戶管理系統有新的變更。 詳情請參閱「 MySQL 8.0 新功能」。
MySQL 適用的 Cloud SQL 已採用這些變更,並強化與
cloudsqlsuperuser角色相關聯的使用者權限。在執行個體的 MySQL 5.7 版中建立的使用者,可能不具備與直接在 MySQL 8.0 中建立的使用者相同的權限。舉例來說,從 MySQL 5.7 升級至 MySQL 8.0 的使用者沒有CONNECTION_ADMIN權限。因此,他們無法在其他使用者的工作階段中執行KILL指令。如要瞭解如何更新使用者權限,請參閱本節的程序。如果您從 MySQL 8.0 升級至 MySQL 8.4,使用者權限還會發生其他變更,包括新增 MySQL 8.4 推出的權限,以及移除 MySQL 8.0 中存在的權限。詳情請參閱 MySQL 8.4 使用者權限 (
cloudsqlsuperuser)。如要在 MySQL 8.0、MySQL 8.4 或 MySQL 9.7 中更新使用者權限,請按照下列步驟操作:
建立使用者,並預設授予
cloudsqlsuperuser角色。使用這個使用者連線至執行個體,即可更新其他使用者的權限。
舉例來說,如要檢查使用者擁有的權限,請執行下列指令:
SHOW GRANTS for 'admin'@'%',
如要授予使用者權限,例如使用
KILL指令終止連線的權限,請執行下列指令:GRANT CONNECTION_ADMIN ON *.* to 'admin'@'%';
如要將
cloudsqlsuperuser角色套用至admin'@'%使用者,請執行下列指令:GRANT 'cloudsqlsuperuser' to 'admin'@'%';
-
選用:建立備份。
雖然 Cloud SQL 會在您升級主要執行個體後自動建立備份,但 Cloud SQL 建議您自行建立備份,以便在必要時還原資料庫。
- 選用:如果您已升級至 MySQL 適用的 Cloud SQL 8.4 或 MySQL 9.7,請將所有連接器、用戶端和 MySQL Shell 更新至 MySQL 8.4 或 MySQL 9.7。
排解主要版本升級問題
如果您嘗試執行無效的升級指令 (例如執行個體包含新版本的無效資料庫標記),Cloud SQL 會傳回錯誤訊息。
如果升級要求失敗,請檢查升級要求的語法。如果要求結構有效,請嘗試下列建議。
查看錯誤記錄
如果有效的升級要求發生任何問題,Cloud SQL 會將錯誤記錄發布至 projects/PROJECT_ID/logs/cloudsql.googleapis.com%2Fmysql.err。每筆記錄項目都包含含有執行個體 ID 的標籤,可協助您找出升級錯誤的執行個體。找出並解決這類升級錯誤。
如要查看錯誤記錄,請使用 Google Cloud 控制台:
-
前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。
- 如要開啟執行個體的「總覽」頁面,請按一下執行個體名稱。
在執行個體「總覽」頁面的「作業和記錄」窗格中,按一下「查看 MySQL 錯誤記錄」連結。
查看記錄檔,步驟如下:
- 如要列出專案中的所有錯誤記錄,請在「記錄名稱」記錄篩選器中選取記錄名稱。
如要進一步瞭解查詢篩選器,請參閱「進階查詢」。
- 如要篩選單一執行個體的升級錯誤記錄,請在「Search all fields」(搜尋所有欄位) 方塊中輸入下列查詢,並將
DATABASE_ID
專案 ID,後接執行個體名稱,格式如下:
project_id:instance_name。resource.type="cloudsql_database" resource.labels.database_id="DATABASE_ID" logName : "projects/PROJECT_ID/logs/cloudsql.googleapis.com%2Fmysql.err"
舉例來說,如要依專案
buylots中名為shopping-db的執行個體篩選升級錯誤記錄,請使用下列查詢篩選器:resource.type="cloudsql_database" resource.labels.database_id="buylots:shopping-db" logName : "projects/buylots/logs/cloudsql.googleapis.com%2Fmysql.err"
您可以查看特定時間範圍內回報的所有記錄,也可以依嚴重程度篩選記錄。常見的疑難排解選項包括選取下列篩選條件:
- 緊急
- 快訊
- 重大
- 錯誤
從 MySQL 5.7 版升級至 MySQL 8.0 版時,您可能會在預檢和升級期間遇到一些已知問題。如需排解這些問題的說明,請參閱「排解 MySQL 8.0 主要版本就地升級問題」。
MVU 作業執行時間較長
主要版本升級會涉及兩項基礎工作:
- 前置檢查作業:如果未在三小時內完成,系統會傳回逾時錯誤。
- 升級作業:如果未在六小時內完成,系統會傳回逾時錯誤。
如果執行個體正在進行 MAJOR_VERSION_UPGRADE 作業,且時間超出預期,請調查 MySQL 錯誤記錄。這可能是由常見問題所致,例如:
- 大量資料表、檢視區塊或索引
- CPU 或記憶體等資源不足
- 重大交易會阻礙資料庫關機,導致升級程序無法啟動。您可以使用 Google Cloud 主控台檢查目前的程序。
常見的主要版本升級前檢查錯誤
從 MySQL 5.7 升級至 MySQL 8.0 時,常見問題包括:
- 在預存程序、觸發程序和其他資料庫物件中,新增
RANKS、GROUPS、FUNCTION等保留字。詳情請參閱「關鍵字和保留字」。 - 資料表定義含有無效的 UTF 字元。
- 必須提交 (使用
XA COMMIT陳述式) 或回溯 (使用XA ROLLBACK陳述式) 的未提交 XA 交易。 - 名稱超過 64 個字元的外鍵限制。
- 資料欄混合索引中的空間資料類型。詳情請參閱空間資料類型。
如需在從 MySQL 5.7 升級至 MySQL 8.0 的前置檢查期間,排解錯誤和已知問題,請參閱「排解升級至 MySQL 8.0 的主要版本問題」。如要進一步瞭解常見的 MySQL 問題,請參閱「為升級作業準備安裝環境」和「要升級至 MySQL 8.0 嗎?」。
從 MySQL 8.0 升級至 MySQL 8.4 時,常見問題包括:
- 複製術語過時。MySQL 8.4 完全移除了
MASTER和SLAVE條款。如果您仍使用含有這些字詞的指令或設定,請務必替換或移除。如要進一步瞭解這些字詞的移除和取代作業,請參閱「MySQL 8.4 相較於 MySQL 8.0 的新功能」。
從 MySQL 8.4 升級至 MySQL 9.7 時,常見問題包括:
- 如果已為執行個體啟用
cloudsql_vector,則在升級前,您無法在含有任何 Cloud SQL 向量嵌入內容的資料欄上建立次要非向量索引。您可能會收到下列錯誤訊息:Non-vector secondary indexes are disallowed on vector columns when cloudsql_vector is enabled.如要解決這個問題,請先捨棄次要索引,再升級至 MySQL 9.7。
- Cloud SQL 8.4 資料庫中已有向量嵌入,但您已將
cloudsql_vector設為off。升級至 MySQL 9.7 時,所有向量資料都會遷移至 MySQL 社群格式,而非 MySQL 適用的 Cloud SQL 8.4 和更早版本資料庫所用的VARBINARY格式。為確保向量資料正確遷移,您可以將cloudsql_vector標記更新為on,然後升級至 MySQL 9.7。升級程序會將向量資料遷移至社群格式。或者,您也可以將cloudsql_vector旗標設為off,並在升級前手動刪除 MySQL 8.4 資料庫中的向量資料。 - 您還有使用
mysql_native_password外掛程式的內建資料庫使用者帳戶。這個外掛程式已從 MySQL 適用的 Cloud SQL 9.7 完全移除。如果任何使用者帳戶使用mysql_native_password外掛程式,這些帳戶就無法連線至資料庫。升級至 MySQL 適用的 Cloud SQL 9.7 前,請務必將所有剩餘帳戶改為使用caching_sha2_password外掛程式。
將主要執行個體還原至先前的主要版本
如果升級後的資料庫系統未如預期運作,您可能需要將主要執行個體還原至先前的版本。方法是將升級前的備份還原至 Cloud SQL 復原執行個體,也就是執行升級前版本的全新執行個體。
如要將主要執行個體還原至先前版本,請按照下列步驟操作:
找出升級前的備份。
請參閱「自動升級備份」。
建立復原執行個體。
使用 Cloud SQL 執行個體在升級前備份時執行的主要版本,建立新的 Cloud SQL 執行個體。設定與原始執行個體相同的旗標和執行個體設定。
還原升級前的備份。
還原升級前的備份資料至復原執行個體。這項作業可能需要幾分鐘才能完成。
新增唯讀備用資源。
如果使用唯讀備用資源,請個別新增。
連結應用程式。
資料庫系統復原後,請更新應用程式,提供復原執行個體及其唯讀副本的詳細資料。您可以繼續在升級前的資料庫版本上放送流量。
限制
本節列出就地升級主要版本的限制。
- 您無法在外部副本上就地升級主要版本。
- 如果執行個體有超過 512,000 個資料表,從 MySQL 5.7 升級至 MySQL 8.0 可能需要很長時間,甚至會逾時。
- 如果執行個體有超過 512,000 個資料表,從 MySQL 8.0 升級至 MySQL 8.4 可能需要很長時間,甚至會逾時。
從 MySQL 8.0 升級至 MySQL 8.4 時,如果您已將副本升級至 MySQL 8.4,但尚未升級主要執行個體,則可能在未升級的主要執行個體上,使用已淘汰的
mysql_native_password驗證外掛程式建立新的使用者帳戶。為避免發生這種情況,請務必在升級副本後立即升級主要執行個體,或只在主要執行個體上使用下列指令建立新的使用者帳戶。CREATE USER 'USERNAME'@'%' IDENTIFIED WITH caching_sha2_password BY 'PASSWORD';
將 USERNAME 和 PASSWORD 替換為適當值。
常見問題
升級資料庫主要版本時,可能會遇到下列問題。
- 可以。Cloud SQL 執行升級時,執行個體會有一段時間無法使用。
- 升級需要多久時間?
升級單一執行個體通常會在 10 分鐘內完成。 如果執行個體設定的 vCPU 或記憶體數量較少,升級作業可能需要較長時間。
如果執行個體代管的資料庫或資料表過多,或是資料庫非常龐大,升級作業可能需要數小時,甚至會逾時,因為升級總時間取決於資料庫中的物件數量。如果有多個執行個體需要升級,升級時間會成比例增加。 如果升級作業包含備用資源,則視主要執行個體擁有的備用資源數量而定,升級作業最多可能需要一小時才能完成。
- 我可以監控升級過程中的每個步驟嗎?
- Cloud SQL 可讓您監控升級作業是否仍在進行中,但無法追蹤每次升級的個別步驟。
- 升級程序開始後,可以取消嗎?
- 很抱歉,升級作業開始後就無法取消。如果升級失敗,Cloud SQL 會自動將執行個體復原至先前的版本。
- 升級期間,我的設定會受到什麼影響?
執行就地主要版本升級時,Cloud SQL 會保留資料庫設定,包括執行個體名稱、IP 位址、明確設定的旗標值和使用者資料。不過,系統變數的預設值可能會變更。舉例來說,MySQL 5.7 中
character_set_server旗標的預設值為utf8。升級至 MySQL 8.0 時,旗標的預設值會變更為utf8mb4。如要還原為utf8,請將旗標值設回先前的值。詳情請參閱「設定資料庫旗標」。如果目標版本不再支援特定旗標或值,Cloud SQL 會在升級期間自動移除該旗標。
- 升級副本後,如果複製作業中斷,該怎麼辦?
-
如果升級備用資源後複製作業中斷,Cloud SQL 會將備用資源還原至主要執行個體的 MySQL 主要版本。您可以再次升級副本,但如果問題持續發生,複製作業可能會再次中斷。因此,建議您在執行主要版本升級時一併升級副本,而非分別升級每個副本。
如果副本未還原至與主要執行個體相同的主要版本,則有兩種做法:
-
刪除損壞的副本、建立新副本,然後升級新副本。
如果升級再次失敗,可能是因為升級主要執行個體時,新增了不相容的變更。排解升級問題,找出問題、修正主要執行個體,然後嘗試升級副本。詳情請參閱疑難排解。
-
升級主要執行個體
如果副本執行緒無法運作,主要執行個體的升級作業就會重新建立副本。
-
- 為什麼升級後的副本會復原為先前的主要版本?
如果升級失敗,備用資源會還原為主要執行個體的版本。您可以再次升級副本,但如果問題仍未解決,可以檢查副本上的
mysql.err記錄,找出來源。搜尋[REPL]... failed executing transaction.... end_log_pos...; Failure Reason等關鍵字。如果錯誤訊息包含
Access denied for AuthId....和使用者權限變更,可能是因為在 mysql 和 sys 結構定義上,使用 MySQL 5.7 使用者權限執行查詢,且可能因 MySQL 8.0 的安全性與帳戶管理系統變更而失敗。如要解決這個問題,請先停止主要執行個體上的查詢,再將主要執行個體升級至新版本,然後重試升級副本。Cloud SQL 建議您在升級至新版本前,暫時停止主要執行個體中的所有這類查詢,因為這可能會導致類似問題。如果 MySQL 記錄中未顯示失敗原因 (例如
Access denied for AuthID....),則問題可能是因為在升級副本後,主要執行個體中新增了不相容的資料。請參閱「準備升級主要版本」,瞭解如何修正不相容問題,然後再升級。
後續步驟
- 瞭解連線至執行個體的選項。
- 瞭解匯入及匯出資料。
- 進一步瞭解如何設定資料庫標記。