複製執行個體

本頁面說明複製功能,並說明如何複製執行個體。

總覽

複製 Cloud SQL 執行個體會建立新執行個體,也就是來源執行個體的副本。新執行個體與來源執行個體完全獨立。

常見問題

問題 回答
複製是否會影響效能? 不會。複製作業不會對來源執行個體的效能造成影響。
備份是否會複製到新的執行個體? 不會。新執行個體會建立新的自動備份。系統不會從來源執行個體複製手動備份。
新執行個體是否使用相同的 IP 位址? 不會。新執行個體會有新的 IP 位址。
新執行個體是否具有相同的設定? 可以,新執行個體具有相同的設定,例如資料庫標記、連線選項、機器類型,以及儲存空間和記憶體設定。
副本是否已複製到新執行個體? 否。您需要為新執行個體建立新的複本。
您可以複製備用資源嗎? 不行,您無法複製備用資源。
您可以從較早的時間點複製資料嗎? 可以, 時間點復原功能會使用複製功能,從較早時間點還原執行個體。這有助於您在資料庫遭到破壞的情況下進行復原。
來源執行個體的維護設定是否會自動複製到複本執行個體? 否。您需要為複本執行個體設定維護設定。
當執行個體的區域無法使用時,您是否可以複製執行個體? 可以,如果複製區域執行個體,您可以為該執行個體指定不同的主要可用區。如果複製高可用性 (區域) 執行個體,您可以為執行個體指定不同的主要和次要可用區。
您可以將資料庫複製到其他專案嗎? 不行。您無法將資料庫複製到其他專案。
您可以複製曾經是複本的執行個體嗎? 可以,您可以複製從其他執行個體複製的執行個體。
資料庫使用者是否已複製到新執行個體? 是,資料庫使用者會複製到新執行個體。系統也會複製這些使用者的密碼,因此不需要重新建立。

複製執行個體

您可以使用 Google Cloud 控制台、gcloud CLI、Terraform 或 API 複製 Cloud SQL 執行個體。

控制台

  1. 前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。

    前往 Cloud SQL 執行個體

  2. 找出要複製的執行個體列。
  3. 在「動作」欄中,按一下 「更多動作」選單。
  4. 按一下 [建立本機複本]
  5. 在「Create a clone」頁面中,視需要更新執行個體 ID,然後按一下「Create clone」,並保留「Clone the current state of instance」選取狀態。

    複本初始化時,您會返回執行個體清單頁面。

gcloud

如要複製執行個體,請使用 gcloud sql instances clone 指令:

gcloud sql instances clone SOURCE_INSTANCE_NAME DESTINATION_INSTANCE_NAME \
--project PROJECT_ID \
--preferred-zone ZONE_NAME \
--preferred-secondary-zone SECONDARY_ZONE_NAME

請將以下項目改為對應的值:

  • SOURCE_INSTANCE_NAME:要複製的 Cloud SQL 執行個體名稱。
  • DESTINATION_INSTANCE_NAME:複製的執行個體名稱。
  • PROJECT_ID:包含來源和目的地執行個體的 Google Cloud 專案 ID 或專案號碼
  • ZONE_NAME:選用。目的地執行個體的主要區域名稱。如果您希望目的地執行個體位於與要複製的 Cloud SQL 執行個體不同的主要區域,請使用此選項。對於區域執行個體,這個區域會取代主要區域,但次要區域會與來源執行個體相同。
  • SECONDARY_ZONE_NAME:選用。目的地執行個體的次要區域名稱。您可以使用這項參數,為要複製的區域 Cloud SQL 執行個體指定不同的次要可用區。

如果您使用 --preferred-zone--preferred-secondary-zone 參數,則適用下列條件:

  • 主要和次要可用區都必須是有效的區域。
  • 兩個區域都必須與來源執行個體位於相同地區。
  • 主要和次要可用區不得相同。
  • 對於區域執行個體,您無法使用 --preferred-secondary-zone 參數。否則,執行個體的複製程序就會失敗。
  • 如果您未指定 --preferred-zone--preferred-secondary-zone 參數的值,則複製的執行個體會與來源執行個體使用相同的主要和次要區域。

如要執行 gcloud sql instances clone 指令,您必須具備 cloudsql.instances.clone 權限。如要進一步瞭解執行 gcloud CLI 指令所需的權限,請參閱「Cloud SQL 權限」。

Terraform

如要複製執行個體,請使用 Terraform 資源

resource "google_sql_database_instance" "clone" {
  name             = "postgres-instance-clone-name"
  region           = "us-central1"
  database_version = "POSTGRES_12"
  clone {
    source_instance_name = google_sql_database_instance.source.id
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

套用變更

如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節中的步驟。

準備 Cloud Shell

  1. 啟動 Cloud Shell
  2. 設定要套用 Terraform 設定的預設 Google Cloud 專案。

    您只需為每個專案執行這個指令一次,而且可以在任何目錄中執行。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 設定檔中設定明確的值,系統就會覆寫環境變數。

準備目錄

每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。

  1. Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須包含 .tf 副檔名,例如 main.tf。在本教學課程中,檔案稱為 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您正在參考教學課程,可以複製各個章節或步驟中的程式碼範例。

    將範例程式碼複製到新建立的 main.tf 中。

    您可以視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。

  3. 查看並修改要套用至環境的範例參數。
  4. 儲存變更。
  5. 初始化 Terraform。這項操作只需對每個目錄執行一次。
    terraform init

    如要使用最新版的 Google 供應器,請視需要加入 -upgrade 選項:

    terraform init -upgrade

套用變更

  1. 檢查設定,並確認 Terraform 要建立或更新的資源是否符合您的預期:
    terraform plan

    視需要修正設定。

  2. 執行下列指令,並在提示中輸入 yes,即可套用 Terraform 設定:
    terraform apply

    等待 Terraform 顯示「Apply complete!」(套用完成) 訊息。

  3. 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。

刪除變更

如要刪除變更,請按照下列步驟操作:

  1. 如要停用防刪除功能,請在 Terraform 設定檔中將 deletion_protection 引數設為 false
    deletion_protection =  "false"
  2. 執行下列指令,並在提示中輸入 yes,即可套用更新的 Terraform 設定:
    terraform apply
  1. 如要移除先前透過 Terraform 設定套用的資源,請執行下列指令,並在提示中輸入 yes

    terraform destroy

REST v1

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_ID:包含來源和目的地執行個體的 Google Cloud 專案 ID 或專案號碼
  • SOURCE_INSTANCE_NAME:要複製的 Cloud SQL 執行個體名稱。
  • DESTINATION_INSTANCE_NAME:複製的執行個體名稱。
  • ZONE_NAME:選用。目的地執行個體的主要區域名稱。如果您希望目的地執行個體位於與要複製的 Cloud SQL 執行個體不同的主要區域,請使用此選項。對於區域執行個體,這個區域會取代主要區域,但次要區域會與來源執行個體相同。
  • SECONDARY_ZONE_NAME:選用。目的地執行個體的次要區域名稱。您可以使用這項參數,為要複製的區域 Cloud SQL 執行個體指定不同的次要可用區。

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/SOURCE_INSTANCE_NAME/clone

JSON 要求主體:

{
  "cloneContext":
  {
    "destinationInstanceName": "DESTINATION_INSTANCE_NAME",
    "preferredZone": "ZONE_NAME",
    "preferredSecondaryZone": "SECONDARY_ZONE_NAME"
  }
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

如果您使用 preferredZonepreferredSecondaryZone 參數,則適用下列條件:

  • 主要和次要可用區都必須是有效的區域。
  • 兩個區域都必須與來源執行個體位於相同地區。
  • 主要和次要可用區不得相同。
  • 對於區域執行個體,您無法使用 preferredSecondaryZone 參數。否則,執行個體的複製程序就會失敗。
  • 如果您未指定 preferredZonepreferredSecondaryZone 參數的值,則複製的執行個體會與來源執行個體使用相同的主要和次要區域。

如要使用 instances.clone API 方法,您必須具備 cloudsql.instances.clone 權限。如要進一步瞭解使用 API 方法所需的權限,請參閱「Cloud SQL 權限」。

REST v1beta4

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_ID:包含來源和目的地執行個體的 Google Cloud 專案 ID 或專案號碼
  • SOURCE_INSTANCE_NAME:要複製的 Cloud SQL 執行個體名稱。
  • DESTINATION_INSTANCE_NAME:複製的執行個體名稱。
  • ZONE_NAME:選用。目的地執行個體的主要區域名稱。如果您希望目的地執行個體位於與要複製的 Cloud SQL 執行個體不同的主要區域,請使用此選項。對於區域執行個體,這個區域會取代主要區域,但次要區域會與來源執行個體相同。
  • SECONDARY_ZONE_NAME:選用。目的地執行個體的次要區域名稱。您可以使用這項參數,為要複製的區域 Cloud SQL 執行個體指定不同的次要可用區。

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/SOURCE_INSTANCE_NAME/clone

JSON 要求主體:

{
  "cloneContext":
  {
    "destinationInstanceName": "DESTINATION_INSTANCE_NAME",
    "preferredZone": "ZONE_NAME",
    "preferredSecondaryZone": "SECONDARY_ZONE_NAME"
  }
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

如果您使用 preferredZonepreferredSecondaryZone 參數,則適用下列條件:

  • 主要和次要可用區都必須是有效的區域。
  • 兩個區域都必須與來源執行個體位於相同地區。
  • 主要和次要可用區不得相同。
  • 對於區域執行個體,您無法使用 preferredSecondaryZone 參數。否則,執行個體的複製程序就會失敗。
  • 如果您未指定 preferredZonepreferredSecondaryZone 參數的值,則複製的執行個體會與來源執行個體使用相同的主要和次要區域。

如要使用 instances.clone API 方法,您必須具備 cloudsql.instances.clone 權限。如要進一步瞭解使用 API 方法所需的權限,請參閱「Cloud SQL 權限」。

複製使用內部 IP 位址的執行個體

如果 Cloud SQL 執行個體使用的是內部 IP 位址,您可以選擇為複本的新 IP 位址指定已分配的 IP 範圍。例如:google-managed-services-default

gcloud

複製執行個體,並視需要指定要使用的已分配 IP 範圍:

gcloud sql instances clone SOURCE_INSTANCE_NAME TARGET_INSTANCE_NAME \
--allocated-ip-range-name ALLOCATED_IP_RANGE_NAME

執行 gcloud sql instances clone 指令的使用者或服務帳戶必須具備 cloudsql.instances.clone 權限。如要進一步瞭解執行 gcloud CLI 指令所需的權限,請參閱「Cloud SQL 權限」。

REST v1

複製執行個體,並視需要指定要使用的已分配 IP 範圍:

使用任何要求資料之前,請先替換以下項目:

  • project-id:專案 ID
  • source-instance-id:來源執行個體 ID
  • target-instance-id:目標執行個體 ID
  • allocated-ip-range-name:已分配 IP 範圍的名稱

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/source-instance-id/clone

JSON 要求主體:

{
  "cloneContext":
  {
    "destinationInstanceName": "target-instance-id",
    "allocatedIpRange": "allocated-ip-range-name"
  }
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

使用 instances.clone API 方法的使用者或服務帳戶必須具備 cloudsql.instances.clone 權限。如要進一步瞭解使用 API 方法所需的權限,請參閱「Cloud SQL 權限」。

REST v1beta4

複製執行個體,並視需要指定要使用的已分配 IP 範圍:

使用任何要求資料之前,請先替換以下項目:

  • project-id:專案 ID
  • source-instance-id:來源執行個體 ID
  • target-instance-id:目標執行個體 ID
  • allocated-ip-range-name:已分配 IP 範圍的名稱

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/source-instance-id/clone

JSON 要求主體:

{
  "cloneContext":
  {
    "destinationInstanceName": "target-instance-id",
    "allocatedIpRange": "allocated-ip-range-name"
  }
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

使用 instances.clone API 方法的使用者或服務帳戶必須具備 cloudsql.instances.clone 權限。如要進一步瞭解使用 API 方法所需的權限,請參閱「Cloud SQL 權限」。

如果您未指定分配的 IP 範圍,系統會套用以下行為:

  • 如果來源執行個體是使用指定範圍建立,則複製的執行個體會在相同範圍內建立。
  • 如果來源執行個體並未使用指定範圍建立,則系統會在隨機範圍內建立複製的執行個體。

疑難排解

問題 疑難排解
複製作業失敗,並顯示 constraints/sql.restrictAuthorizedNetworks 錯誤。 複製作業遭到 Authorized Networks 設定封鎖。Authorized Networks 會在 Google Cloud 控制台的「連線」部分設定公開 IP 位址,且基於安全考量,不允許複製。

請盡可能從 Cloud SQL 執行個體中移除所有 Authorized Networks 項目。否則,請建立副本,但不含任何 Authorized Networks 項目。

錯誤訊息:Failed to create subnetwork. Couldn't find free blocks in allocated IP ranges. Please allocate new ranges for this service provider. Help Token: [help-token-id].

您嘗試使用 Google Cloud 控制台複製具有私人 IP 位址的執行個體,但未指定要使用的已分配 IP 範圍,且來源執行個體並未使用指定範圍建立。因此,複製的執行個體會在隨機範圍內建立。

使用 gcloud 複製執行個體,並為
--allocated-ip-range-name 參數提供值。詳情請參閱「複製具有私人 IP 的執行個體」。