克隆实例

本页面介绍了克隆以及如何克隆实例。

概览

克隆 Cloud SQL 实例会创建一个新实例,该实例是源实例的副本。新实例完全独立于源实例。

常见问题解答

问题 答案
克隆是否会影响性能? 否。克隆不会对源实例产生性能影响。
备份是否会复制到新实例? 否。新实例会创建新的自动备份。系统不会从源实例复制手动备份。
新实例是否具有相同的 IP 地址? 否。新实例具有新的 IP 地址。
新实例是否具有相同配置? 可以。新实例具有相同的设置,例如数据库标志、连接选项、机器类型以及存储空间和内存设置。
副本是否会复制到新实例? 否。您需要为新实例创建新副本。
是否可以克隆副本? 不能,您无法克隆副本。
是否可以从较早的时间点进行克隆? 可以。时间点恢复功能使用克隆从较早的时间点恢复实例。这样有助于从破���性事件中恢复数据库。
源实例的维护设置是否会自动复制到克隆实例? 不会。您需要为克隆实例配置维护设置。
是否可以克隆曾经是克隆的实例? 可以。您可以克隆从另一个实例克隆的实例。
数据库用户是否会复制到新实例? 是,但数据库用户密码不会复制,需要重新创建。

克隆实例

您可以使用 Google Cloud 控制台、gcloud CLI、Terraform 或 API 克隆 Cloud SQL 实例。

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。

    转到“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:包含源实例和目标实例的 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             = "mysql-instance-clone-name"
  region           = "us-central1"
  database_version = "MYSQL_8_0"
  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 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

如需删除更改,请执行以下操作:

  1. 如需停用防删除保护,请在 Terraform 配置文件中将 deletion_protection 参数设置为 false
    deletion_protection =  "false"
  2. 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:
    terraform apply
  1. 运行以下命令并在提示符处输入 yes,以移除之前使用 Terraform 配置应用的资源:

    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 配置阻止。在 Google Cloud 控制台的“连接”部分中为公共 IP 地址配置了 Authorized Networks,并且出于安全考虑,不允许克隆。

如果可以,请移除 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 的实例