克隆实例

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

概览

克隆 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

进行以下替换:

  • SOURCE_INSTANCE_NAME:要克隆的 Cloud SQL 实例的名称
  • DESTINATION_INSTANCE_NAME:克隆的实例的名称
  • PROJECT_ID:包含源实例和目标实例的 Google Cloud 项目的 ID 或项目编号

如需运行 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 显示“应用完成!”消息。

  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:克隆的实例的名称

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "cloneContext":
  {
    "destinationInstanceName": "DESTINATION_INSTANCE_NAME"
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

如需使用 instances.clone API 方法,您必须拥有 cloudsql.instances.clone 权限。如需详细了解使用 API 方法所需的权限,请参阅 Cloud SQL 权限

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:包含源实例和目标实例的 Google Cloud 项目的 ID 或项目编号
  • SOURCE_INSTANCE_NAME:要克隆的 Cloud SQL 实例的名称
  • DESTINATION_INSTANCE_NAME:克隆的实例的名称

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "cloneContext":
  {
    "destinationInstanceName": "DESTINATION_INSTANCE_NAME"
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

如需使用 instances.clone API 方法,您必须拥有 cloudsql.instances.clone 权限。如需详细了解使用 API 方法所需的权限,请参阅 Cloud SQL 权限

克隆不可用的实例

控制台

由于以下原因,将不可用的实例克隆到其他可用区:

  • 配置了实例的当前可用区无法访问。此实例处于 FAILED 状态。
  • 实例正在进行维护。此实例处于 MAINTENANCE 状态。

如需克隆不可用的实例,请完成以下步骤:

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

    转到“Cloud SQL 实例”

  2. 找到要克隆的实例的行。
  3. 操作列中,点击 更多操作菜单。
  4. 点击创建克隆
  5. 创建克隆页面上,完成以下操作:
    1. 实例 ID 字段中,根据需要更新实例 ID。
    2. 点击从较早的时间点克隆
    3. 时间点字段中,选择要克隆数据的日期和时间。这将恢复该时间点的实例状态。
    4. 点击创建克隆
  6. 克隆初始化时,您将返回到实例列表页面。

gcloud

由于配置了实例的当前可用区无法访问,将不可用的实例克隆到其他可用区。

gcloud sql instances clone SOURCE_INSTANCE_NAME TARGET_INSTANCE_NAME \
--point-in-time DATE_AND_TIME_STAMP \
--preferred-zone ZONE_NAME

运行 gcloud sql instances clone 命令的用户或服务账号必须拥有 cloudsql.instances.clone 权限。如需详细了解运行 gcloud CLI 命令所需的权限,请参阅 Cloud SQL 权限

REST v1

由于配置了实例的当前可用区无法访问,将不可用的实例克隆到其他可用区。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID。
  • SOURCE_INSTANCE_NAME:源实例的名称。
  • TARGET_INSTANCE_NAME:目标(克隆)实例的名称。
  • DATE_AND_TIME_STAMP:源实例的日期和时间戳,采用世界协调时间 (UTC) 时区RFC 3339 格式(例如
    2012-11-15T16:19:00.094Z)。
  • ZONE_NAME:可选。目标实例的可用区名称。这用于指定与您要克隆的 Cloud SQL 实例不同的可用区。对于区域实例,此可用区会替换主要可用区,但次要可用区与该实例相同。

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "cloneContext":
  {
    "destinationInstanceName": "TARGET_INSTANCE_NAME",
    "pointInTime": "DATE_AND_TIME_STAMP",
    "preferredZone": "ZONE_NAME"
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

使用 instances.clone API 方法的用户或服务账号必须拥有 cloudsql.instances.clone 权限。如需详细了解使用 API 方法所需的权限,请参阅 Cloud SQL 权限

REST v1beta4

由于配置了实例的当前可用区无法访问,将不可用的实例克隆到其他可用区。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID。
  • SOURCE_INSTANCE_NAME:源实例的名称。
  • TARGET_INSTANCE_NAME:目标(克隆)实例的名称。
  • DATE_AND_TIME_STAMP:源实例的日期和时间戳,采用世界协调时间 (UTC) 时区RFC 3339 格式(例如
    2012-11-15T16:19:00.094Z)。
  • ZONE_NAME:可选。目标实例的可用区名称。这用于指定与您要克隆的 Cloud SQL 实例不同的可用区。对于区域实例,此可用区会替换主要可用区,但次要可用区与该实例相同。

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "cloneContext":
  {
    "destinationInstanceName": "TARGET_INSTANCE_NAME",
    "pointInTime": "DATE_AND_TIME_STAMP",
    "preferredZone": "ZONE_NAME"
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

使用 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 的实例