本页面介绍了克隆以及如何克隆实例。
概览
克隆 Cloud SQL 实例会创建一个新实例,该实例是源实例的副本。新实例完全独立于源实例。
常见问题解答
问题 | 答案 |
---|---|
克隆是否会影响性能? | 否。克隆不会对源实例产生性能影响。 |
备份是否会复制到新实例? | 否。新实例会创建新的自动备份。系统不会从源实例复制手动备份。 |
新实例是否具有相同的 IP 地址? | 否。新实例具有新的 IP 地址。 |
新实例是否具有相同配置? | 是。新实例具有相同的设置,例如数据库标志、连接选项、机器类型以及存储空间和内存设置。 |
副本是否会复制到新实例? | 否。您需要为新实例创建新副本。 |
是否可以克隆副本? | 不能,您无法克隆副本。 |
是否可以从较早的时间点进行克隆? | 是。时间点恢复功能使用克隆从较早的时间点恢复实例。这样有助于从破坏性事件中恢复数据库。 |
源实例的维护设置是否会自动复制到克隆实例? | 不会。您需要为克隆实例配置维护设置。 |
是否可以在实例的可用区不可用时克隆实例? | 执行。如果您克隆可用区级实例,则可以为该实例指定其他主可用区。如果您克隆高可用性(区域级)实例,则可以为该实例指定不同的主可用区和次要可用区。 |
是否可以将数据库克隆到其他项目? | 不能,您无法将数据库克隆到其他项目。 |
是否可以克隆曾经是克隆的实例? | 是。您可以克隆从另一个实例克隆的实例。 |
数据库用户是否会复制到新实例? | 是,数据库用户会复制到新实例。这些用户的密码也会复制过去,因此无需重新创建。 |
克隆实例
您可以使用 Google Cloud 控制台、gcloud CLI、Terraform 或 API 克隆 Cloud SQL 实例。
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 找到要克隆的实例的行。
- 在操作列中,点击 更多操作菜单。
- 点击创建克隆。
- 在创建克隆页面上,根据需要更新实例 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 资源
应用更改
如需在 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 显示“应用完成!”消息。
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
删除更改
如需删除更改,请执行以下操作:
- 如需停用删除防护,请在 Terraform 配置文件中将
deletion_protection
参数设置为false
。deletion_protection = "false"
- 运行以下命令并在提示符处输入
yes
,以应用更新后的 Terraform 配置:terraform apply
-
运行以下命令并在提示符处输入
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 响应:
如果您使用 preferredZone
和 preferredSecondaryZone
参数,则以下条件适用:
- 主要可用区和次要可用区都必须是有效的可用区。
- 两个可用区都必须与源实例属于同一区域。
- 主要可用区和次要可用区不得相同。
- 对于可用区级实例,不能使用
preferredSecondaryZone
参数。如果您这样做,克隆实例的过程将会失败。 - 如果您未为
preferredZone
或preferredSecondaryZone
参数指定值,则克隆的实例将与来源实例具有相同的主可用区和次要可用区。
如需使用 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 响应:
如果您使用 preferredZone
和 preferredSecondaryZone
参数,则以下条件适用:
- 主要可用区和次要可用区都必须是有效的可用区。
- 两个可用区都必须与源实例属于同一区域。
- 主要可用区和次要可用区不得相同。
- 对于可用区级实例,不能使用
preferredSecondaryZone
参数。如果您这样做,克隆实例的过程将会失败。 - 如果您未为
preferredZone
或preferredSecondaryZone
参数指定值,则克隆的实例将与源实例具有相同的主可用区和次要可用区。
如需使用 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 实例中的所有 |
错误消息: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 范围,并且未创建具有指定范围的来源实例。因此,克隆的实例是在随机范围内创建的。 使用 |