複製執行個體

本頁面說明如何複製執行個體。

總覽

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

標準副本

標準複製作業會建立來源執行個體的完整備份。然後,執行個體會使用該備份佈建新的獨立執行個體。新執行個體是作業開始時來源的功能獨立副本。標準複製作業的持續時間與資料庫大小成正比。

快速複製

快速複製功能會使用即時快照建立新執行個體,這是標準複製作業的重大演進。

在與來源執行個體相同的可用區中啟動複製作業時,快速複製會建立即時快照。接著使用這項即時快照建立新磁碟。這項程序只會處理中繼資料,因此資料大小不會影響複製作業的建立時間。

使用快速複製時

符合下列條件時,Cloud SQL 會自動使用快速複製:

  • 同可用區作業:複製作業必須在來源執行個體所在的可用區內啟動。指定其他可用區 (或重新指定相同可用區),程序就會預設為標準複製工作流程。
  • 磁碟屬性一致性:新複製的磁碟屬性必須與來源執行個體完全一致 (例如 永久磁碟與 Google Cloud Hyperdisk、加密類型、區塊大小)。
  • 支援的資料庫引擎:資料庫引擎為 MySQL 適用的 Cloud SQL 或 PostgreSQL 適用的 Cloud SQL

如果複製作業需要還原至特定時間點復原 (PITR) 時間戳記,系統會預設使用標準複製工作流程。

比較複製方法

下表比較快速複製和標準複製功能:

功能 標準副本 快速複製
技術 標準快照 即時快照
資料遷移 將資料完整複製到 Cloud Storage 或從 Cloud Storage 複製資料。時間長度與資料庫大小成正比。 可用區內複製作業專用的中繼資料。資料大小不會影響複製作業的建立時間。
時間長度 大型資料庫則需數小時。 複製建立步驟需要幾秒到幾分鐘。
備份規定 在 Cloud Storage 中建立臨時完整備份。 使用即時快照,並在建立新磁碟後捨棄。
適用範圍 支援跨區域和跨區域的副本。 僅支援相同區域的副本。

常見問題

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

複製執行個體

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

控制台

  1. 前往 Cloud de Confiance 控制台的「Cloud SQL Instances」頁面。

    前往 Cloud SQL 執行個體

  2. 找出要複製的執行個體列。
  3. 在「動作」欄中,按一下「更多動作」選單
  4. 按一下 [建立本機複本]
  5. 在「建立副本」頁面中,視需要更新執行個體 ID,然後按一下「建立副本」,並選取「複製執行個體的目前狀態」

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

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:包含來源和目的地執行個體的 Cloud de Confiance 專案 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
}

套用變更

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

準備 Cloud Shell

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

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

    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. 開啟 Cloud de Confiance 專案即可查看結果。在 Cloud de Confiance 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。

刪除變更

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

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

    terraform destroy

REST v1

使用任何要求資料之前,請先修改下列項目的值:

  • PROJECT_ID:包含來源和目的地執行個體的 Cloud de Confiance 專案 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:包含來源和目的地執行個體的 Cloud de Confiance 專案 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 範圍,系統會套用下列行為:

  • 如果來源執行個體是使用指定範圍建立,複製的執行個體也會在相同範圍內建立。
  • 如果來源執行個體並非以指定範圍建立,複製的執行個體就會在隨機範圍內建立。

將執行個體複製到其他專案

您可以在同一organization內,將執行個體複製到其他專案。如果您在同一可用區內複製資料,Cloud SQL 會使用即時快照,加快複製程序。因此,與傳統的匯出和匯入方法相比,您可以在幾分鐘內複製大型執行個體,而非耗費數小時。如果複製到不同可用區,Cloud SQL 會使用標準快照方法進行複製,與即時快照機制相比,完成時間較長。

事前準備

將執行個體複製到其他專案前,請確認符合下列規定:

  • 來源和目的地專案必須位於同一個機構。
  • 目的地網路必須設定 private services access
  • 執行複製作業的使用者帳戶必須具備下列 IAM 權限:
    • 來源專案的 cloudsql.instances.clone 權限
    • 目的地專案的 cloudsql.instances.create

詳情請參閱「Cloud SQL IAM 權限」。

  • 您必須在目標專案中啟用下列 API:
    • Cloud SQL Admin API (sqladmin.googleapis.com)
    • Service Networking API (servicenetworking.googleapis.com)
    • Compute Engine API (compute.googleapis.com)

詳情請參閱「開始使用 Cloud API」一文。

執行跨專案複製作業

您可以使用 gcloud CLI 或 Terraform 執行跨專案複製作業。

gcloud

如要將執行個體複製到其他專案,請使用 gcloud sql instances clone 指令,並指定 --destination-project--destination-network 參數:

gcloud sql instances clone SOURCE_INSTANCE_NAME DESTINATION_INSTANCE_NAME \
--project=SOURCE_PROJECT_ID \
--destination-project=DESTINATION_PROJECT_ID \
--destination-network=DESTINATION_NETWORK_NAME

請替換下列項目:

  • :要複製的 Cloud SQL 執行個體名稱。SOURCE_INSTANCE_NAME
  • DESTINATION_INSTANCE_NAME:產生的複製執行個體名稱。作業完成後,複製的內容會位於目標專案中。
  • SOURCE_PROJECT_ID:包含來源執行個體的專案 ID 或名稱。
  • DESTINATION_PROJECT_ID:您希望複製的執行個體所在的專案 ID 或名稱。
  • DESTINATION_NETWORK_NAME:目標專案中虛擬私有雲 (VPC) 網路的完整名稱。例如:projects/DESTINATION_PROJECT_ID/global/networks/NETWORK_NAME

如要執行這項指令,您必須具備來源專案的 cloudsql.instances.clone 權限,以及目的地專案的 cloudsql.instances.create 權限。如要進一步瞭解執行 gcloud CLI 指令所需的權限,請參閱「Cloud SQL 權限」。

Terraform

如要將執行個體複製到其他專案,請使用 Terraform 資源。在 clone 區塊中,指定來源執行個體專案 ID 的 source_project 欄位,並將 project 設為資源的目的地專案 ID。

以下設定範例會將專案 source-project-id 中的執行個體 source-instance-name 複製到專案 destination-project-id 中的執行個體 my-db-clone,並將其連線至目的地專案中的網路 dest-network

resource "google_sql_database_instance" "cloned_instance" {
  name             = "my-db-clone"
  project          = "destination-project-id"
  database_version = "POSTGRES_13"

  settings {
    tier = "db-custom-2-7680"

    ip_configuration {
      ipv4_enabled    = false
      private_network = "projects/destination-project-id/global/networks/dest-network"
    }
  }

  clone {
    source_instance_name = "source-instance-name"
    source_project       = "source-project-id"
  }
}

套用變更

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

準備 Cloud Shell

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

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

    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. 開啟 Cloud de Confiance 專案即可查看結果。在 Cloud de Confiance 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。

刪除變更

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

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

    terraform destroy

限制

將執行個體複製到其他專案時,適用下列限制:

  • 跨專案快速複製作業僅支援在同一可用區內執行。
  • Private Service Connect 不支援跨專案複製作業。
  • 複製的執行個體會在目的地網路中取得新的私人 IP 位址。來源 IP 位址不會保留。
  • 根據預設,複製的執行個體會停用公開 IP 位址。
  • 下列資源和設定不會保留到新例項:
    • 唯讀備用資源。
    • 客戶自行管理的加密金鑰 (CMEK)。
    • 身分與存取權管理使用者或政策。您必須在目的地專案中重新授予專案層級權限。
    • 備份和時間點復原記錄。如要在複製的執行個體上啟用備份功能,請務必手動啟用。在複製的執行個體上啟用備份後,新執行個體就會開始進行新的備份,並記錄時間點還原作業。

疑難排解

問題 疑難排解
複製作業失敗,並顯示 constraints/sql.restrictAuthorizedNetworks 錯誤。 複製作業遭到 Authorized Networks 設定封鎖。 Authorized Networks在 Cloud de Confiance 控制台的「連線」部分中設定公開 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].

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

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