本页面介绍了克隆以及如何克隆实例。
概览
克隆 Cloud SQL 实例会创建一个新实例,该实例是源实例的副本。新实例完全独立于源实例。
常见问题解答
问题 | 答案 |
---|---|
克隆是否会影响性能? | 否。克隆不会对源实例产生性能影响。 |
备份是否会复制到新实例? | 否。新实例会创建新的自动备份。系统不会从源实例复制手动备份。 |
新实例是否具有相同的 IP 地址? | 否。新实例具有新的 IP 地址。 |
新实例是否具有相同配置? | 是。新实例具有相同的设置,例如数据库标志、连接选项、机器类型以及存储空间和内存设置。 |
副本是否会复制到新实例? | 否。您需要为新实例创建新副本。 |
是否可以克隆副本? | 不能,您无法克隆副本。 |
是否可以从较早的时间点进行克隆? | 是。时间点恢复功能使用克隆从较早的时间点恢复实例。这样有助于从破坏性事件中恢复数据库。 |
源实例的维护设置是否会自动复制到克隆实例? | 不会。您需要为克隆实例配置维护设置。 |
是否可以克隆曾经是克隆的实例? | 是。您可以克隆从另一个实例克隆的实例。 |
数据库用户是否会复制到新实例? | 是,但数据库用户密码不会复制,需要重新创建。 |
克隆实例
您可以使用 Google Cloud 控制台、gcloud CLI、Terraform 或 API 克隆 Cloud SQL 实例。
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 找到要克隆的实例的行。
- 在操作列中,点击 更多操作菜单。
- 点击创建克隆。
- 在创建克隆页面上,根据需要更新实例 ID,然后点击创建克隆并保持克隆实例的当前状态为选中状态。
在克隆进行初始化时,您将返回到实例列表页面。
如需克隆实例,请使用 gcloud sql instances clone
命令:
gcloud sql instances cloneSOURCE_INSTANCE_NAME DESTINATION_INSTANCE_NAME \ --projectPROJECT_ID \ --preferred-zoneZONE_NAME \ --preferred-secondary-zoneSECONDARY_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 资源
应用更改
如需在 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 && cdDIRECTORY && 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
在使用任何请求数据之前,请先进行以下替换:
- 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 " } }
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/SOURCE_INSTANCE_NAME /clone"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/SOURCE_INSTANCE_NAME /clone" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/DESTINATION_INSTANCE_NAME ", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-21T22:43:37.981Z", "operationType": "CLONE", "name": "OPERATION_ID ", "targetId": "DESTINATION_INSTANCE_NAME ", "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /operations/OPERATION_ID ", "targetProject": "PROJECT_ID " }
如果您使用 preferredZone
和 preferredSecondaryZone
参数,则以下条件适用:
- 主要可用区和次要可用区都必须是有效的可用区。
- 两个可用区都必须与源实例属于同一区域。
- 主要可用区和次要可用区不得相同。
- 对于可用区级实例,不能使用
preferredSecondaryZone
参数。如果您这样做,克隆实例的过程将会失败。 - 如果您未为
preferredZone
或preferredSecondaryZone
参数指定值,则克隆的实例将与来源实例具有相同的主可用区和次要可用区。
如需使用 instances.clone
API 方法,您必须拥有 cloudsql.instances.clone
权限。如需详细了解使用 API 方法所需的权限,请参阅 Cloud SQL 权限。
在使用任何请求数据之前,请先进行以下替换:
- 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 " } }
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/SOURCE_INSTANCE_NAME /clone"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/SOURCE_INSTANCE_NAME /clone" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/DESTINATION_INSTANCE_NAME ", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-21T22:43:37.981Z", "operationType": "CLONE", "name": "OPERATION_ID ", "targetId": "DESTINATION_INSTANCE_NAME ", "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /operations/OPERATION_ID ", "targetProject": "PROJECT_ID " }
如果您使用 preferredZone
和 preferredSecondaryZone
参数,则以下条件适用:
- 主要可用区和次要可用区都必须是有效的可用区。
- 两个可用区都必须与源实例属于同一区域。
- 主要可用区和次要可用区不得相同。
- 对于可用区级实例,不能使用
preferredSecondaryZone
参数。如果您这样做,克隆实例的过程将会失败。 - 如果您未为
preferredZone
或preferredSecondaryZone
参数指定值,则克隆的实例将与来源实例具有相同的主可用区和次要可用区。
如需使用 instances.clone
API 方法,您必须拥有 cloudsql.instances.clone
权限。如需详细了解使用 API 方法所需的权限,请参阅 Cloud SQL 权限。
克隆使用内部 IP 地址的实例
如果您的 Cloud SQL 实例使用内部 IP 地址,则可以选择为克隆的新 IP 地址指定分配的 IP 范围。例如 google-managed-services-default
。
克隆实例,您可以选择指定要使用的已分配 IP 范围:
gcloud sql instances cloneSOURCE_INSTANCE_NAME TARGET_INSTANCE_NAME \ --allocated-ip-range-nameALLOCATED_IP_RANGE_NAME
运行 gcloud sql instances clone
命令的用户或服务账号必须拥有 cloudsql.instances.clone
权限。如需详细了解运行 gcloud CLI 命令所需的权限,请参阅 Cloud SQL 权限。
克隆实例,您可以选择指定要使用的已分配 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 " } }
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/v1/projects/project-id /instances/source-instance-id /clone"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/v1/projects/project-id /instances/source-instance-id /clone" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id /instances/target-instance-id ", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-21T22:43:37.981Z", "operationType": "CLONE", "name": "operation-id ", "targetId": "target-instance-id ", "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id /operations/operation-id ", "targetProject": "project-id " }
使用 instances.clone
API 方法的用户或服务账号必须拥有 cloudsql.instances.clone
权限。如需详细了解使用 API 方法所需的权限,请参阅 Cloud SQL 权限。
克隆实例,您可以选择指定要使用的已分配 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 " } }
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/source-instance-id /clone"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/source-instance-id /clone" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/target-instance-id ", "status": "PENDING", "user": "user@example.com", "insertTime": "2020-01-21T22:43:37.981Z", "operationType": "CLONE", "name": "operation-id ", "targetId": "target-instance-id ", "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /operations/operation-id ", "targetProject": "project-id " }
使用 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 范围,并且未创建具有指定范围的来源实例。因此,克隆的实例是在随机范围内创建的。 使用 |