本页介绍了如何使用高级灾难恢复 (DR) 。高级灾难恢复提供以下两个主要功能:
副本故障切换 ,您可以利用此功能在发生区域性故障时立即将主实例故障切换到灾难恢复副本。
切换 ,您可以利用此功能反转主实例和灾难恢复副本的角色,而不会丢失任何数据。您可以在副本故障切换后使用切换将部署恢复到其原始部署状态,也可以使用切换来测试灾难恢复。
只有 Cloud SQL 企业 Plus 版实例支持高级灾难恢复。
准备工作
如果您打算使用 Google Cloud SDK,则必须使用 502.0.0 版或更高版本。如需查看 Google Cloud SDK 的版本,请运行 gcloud --version
。如需更新 Google Cloud SDK,请运行 gcloud components update
。
如需安装 Google Cloud SDK,请参阅安装 gcloud CLI 。
指定灾难恢复副本
如需执行高级灾难恢复,您必须先指定跨区域灾难恢复副本。
主实例要求
主实例必须是 Cloud SQL 企业 Plus 版实例,并且具有指定的灾难恢复副本。
如果您使用 DNS 写入端点 (预览版 )创建 Cloud SQL 实例,则主实例必须与指定的 DR 副本具有相同的 SSL 配置,然后您才能调用切换或副本故障切换操作。例如,如果您将灾难恢复副本配置为强制执行 SSL 加密 ,但主实例允许未加密的连接,那么在切换或故障切换操作完成后,客户端将无法连接到新主实例。
灾难恢复副本要求
指定的灾难恢复读取副本必须满足以下要求:
必须是与运行 MySQL 8.0.31 或更高版本的主实例相同的数据库主要版本和次要版本
必须与主实例位于不同的区域
必须是直接读取副本;不能是级联副本
灾难恢复副本建议
本部分提供有关灾难恢复副本的建议。以下建议可帮助您避免部署中的性能问题:
使用与主实例相同的磁盘大小或启用自动增长功能。
使用一致的高可用性配置。如果在主实例上启用高可用性,则也会在灾难恢复副本上启用高可用性。
使用一致的数据缓存配置。如果在主实例上启用数据缓存,则也会在灾难恢复副本上启用数据缓存。
在任何切换或副本故障切换操作之前和之后,为灾难恢复副本配置任何适当的数据库标志。
创建副本以满足灾难恢复副本要求
如果主实例还没有满足灾难恢复副本要求的跨区域读取副本,请创建一个。
控制台
在 Google Cloud 控制台中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
找到主实例。
在操作 列中,点击更多操作 菜单。
选择创建读取副本 。
在实例 ID 字段中,输入灾难恢复副本 的名称。
在数据库版本 字段中,系统会为您选择与主实例相同的主要版本。
如果您使用的是 MySQL 8.0,请在次要版本 字段中保留预先选择的次要版本。
灾难恢复副本和主实例必须共享同一数据库次要版本。
在页面的选择区域和可用区级可用性 部分,执行以下操作:
请选择与主实例区域不同的区域。
可选。为灾难恢复副本选择多个可用区 。
可选。为灾难恢复副本选择主要 和次要可用区 。
在该页面的自定义实例 部分中,您可以更新灾难恢复副本的设置。如需详细了解各项设置,请参阅实例设置简介 页面。
在机器类型 部分,选择与主实例相同的机器类型。
对于标志 ,配置数据库所需的任何标志。
点击创建副本 。
Cloud SQL 会创建主实例的备份并创建副本。随后,您将返回到主实例的实例页面。
gcloud
如需创建满足灾难恢复副本要求的副本,请运行以下命令:
gcloud sql instances create REPLICA_NAME \
--master-instance-name= PRIMARY_INSTANCE_NAME \
--region= REPLICA_REGION_NAME \
--database-version= DATABASE_VERSION \
--tier= MACHINE_TYPE \
--availability-type= AVAILABILITY_TYPE
--edition= "ENTERPRISE_PLUS"
执行以下变量替换操作:
REST v1
在使用任何请求数据之前,请先进行以下替换:
PRIMARY_INSTANCE_NAME :主实例的名称。
PROJECT_ID :主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
DATABASE_VERSION: :与主实例的数据库主要版本和次要版本匹配的版本字符串,例如 MYSQL_8_0_31
。主副本和灾难恢复副本的数据库版本必须相同。
REPLICA_NAME :您要创建的灾难恢复副本实例的名称。 REPLICA_REGION :灾难恢复副本实例的区域。副本区域必须与主实例的区域不同。
MACHINE_TYPE :指定与主实例相同的机器类型。我们建议您选择与主实例相同的机器类型。
AVAILABILITY_TYPE :如果主实例配置为高可用性,我们建议您指定 REGIONAL
以启用高可用性。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances
请求 JSON 正文:
{
"masterInstanceName": "PRIMARY_INSTANCE_NAME ",
"project": "PROJECT_ID ",
"databaseVersion": "DATABASE_VERSION ",
"name": "REPLICA_NAME ",
"region": "REPLICA_REGION ",
"settings":
{
"tier": "MACHINE_TYPE ",
"availabilityType": "AVAILABILITY_TYPE ",
"settingsVersion": 0,
"replicationType": "ASYNCHRONOUS",
}
}
如需发送您的请求,请展开以下选项之一:
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"
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" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/INSTANCE_ID ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2024-04-01T22:43:37.981Z",
"operationType": "CREATE_REPLICA",
"name": "OPERATION_ID ",
"targetId": "INSTANCE_ID ",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
REST v1beta4
在使用任何请求数据之前,请先进行以下替换:
PRIMARY_INSTANCE_NAME :主实例的名称。
PROJECT_ID :主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
DATABASE_VERSION: :与主实例的数据库主要版本和次要版本匹配的版本字符串,例如 MYSQL_8_0_31
。主副本和灾难恢复副本的数据库版本必须相同。
REPLICA_NAME :您要创建的灾难恢复副本实例的名称。
REPLICA_REGION :灾难恢复副本实例的区域。副本区域必须与主实例的区域不同。
MACHINE_TYPE :指定与主实例相同的机器类型。我们建议磁盘大小与主实例的磁盘大小保持一致。
AVAILABILITY_TYPE :如果主实例配置为高可用性,我们建议您指定 REGIONAL
以启用高可用性。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID /instances
请求 JSON 正文:
{
"masterInstanceName": "PRIMARY_INSTANCE_NAME ",
"project": "PROJECT_ID ",
"databaseVersion": "DATABASE_VERSION ",
"name": "REPLICA_NAME ",
"region": "REPLICA_REGION ",
"settings":
{
"tier": "MACHINE_TYPE ",
"availabilityType": "AVAILABILITY_TYPE ",
"settingsVersion": 0,
"replicationType": "ASYNCHRONOUS",
}
}
如需发送您的请求,请展开以下选项之一:
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/v1beta4/projects/PROJECT_ID /instances"
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/v1beta4/projects/PROJECT_ID /instances" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID /instances/INSTANCE_ID ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2024-04-01T22:43:37.981Z",
"operationType": "CREATE_REPLICA",
"name": "OPERATION_ID ",
"targetId": "INSTANCE_ID ",
"selfLink": "https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_UD /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
为主实例指定灾难恢复副本
以下过程介绍了如何将主实例的一个跨区域副本指定为灾难恢复副本以进行切换或副本故障切换。
控制台
如需指定主实例的灾难恢复副本,请执行以下操作:
在 Google Cloud Console 中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
找到并选择主实例。系统会显示主实例的概览 页面。
在导航菜单中,点击副本 。
在读取副本列表中,找到您要指定为灾难恢复副本的跨区域读取副本。
对于副本,点击 more_vert 操作 按钮,然后选择指定为灾难恢复副本 。
点击确认 。
gcloud
如需将灾难恢复副本指定为主实例,请使用以下命令:
gcloud sql instances patch PRIMARY_INSTANCE_NAME \
--failover-dr-replica-name= REPLICA_NAME
执行以下变量替换操作:
PRIMARY_INSTANCE_NAME :主实例的名称。
REPLICA_NAME :灾难恢复副本的名称。
REST v1
在使用任何请求数据之前,请先进行以下替换:
PRIMARY_INSTANCE_NAME :主实例的名称。
REPLICA_NAME :灾难恢复副本的名称。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME
请求 JSON 正文:
{
"replicationCluster": {
"failoverDrReplicaName": "REPLICA_NAME "
}
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X PATCH \ -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/PRIMARY_INSTANCE_NAME "
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method PATCH ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME " | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID /instances/INSTANCE_ID ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2024-04-01T21:30:35.667Z",
"operationType": "UPDATE",
"name": "OPERATION_ID ",
"targetId": "INSTANCE_ID ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
REST v1beta4
在使用任何请求数据之前,请先进行以下替换:
PRIMARY_INSTANCE_NAME :主实例的名称。
REPLICA_NAME :灾难恢复副本的名称。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME
请求 JSON 正文:
{
"replicationCluster": {
"failoverDrReplicaName": "REPLICA_NAME "
}
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X PATCH \ -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/PRIMARY_INSTANCE_NAME "
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method PATCH ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME " | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/INSTANCE_ID ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2024-04-01T21:30:35.667Z",
"operationType": "UPDATE",
"name": "OPERATION_ID ",
"targetId": "INSTANCE_ID ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
更改指定的灾难恢复副本
如果副本满足要求,您可以指定其他副本作为灾难恢复副本。旧的灾难恢复副本将不再是指定的灾难恢复副本。
控制台
如需更改主实例的灾难恢复副本,请执行以下操作:
在 Google Cloud Console 中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
找到并选择主实例。系统会显示主实例的概览 页面。
在导航菜单中,点击副本 。
在读取副本列表中,找到您要指定为新的灾难恢复副本的跨区域读取副本。
对于副本,点击 more_vert 操作 按钮,然后选择指定为灾难恢复副本 。
gcloud
如需更改灾难恢复副本,请再次运行指定命令 ,并指定其他灾难恢复副本。
查看指定的灾难恢复副本
您可以使用 gcloud CLI 或 Cloud SQL Admin API 检查哪个灾难恢复副本分配给了主实例。您还可以检查某个副本是否为指定的灾难恢复副本。
如需了解为主实例指定了哪个灾难恢复副本,请按照以下步骤操作。
控制台
如需了解哪个读取副本是主实例的指定灾难恢复副本,请执行以下操作:
在 Google Cloud Console 中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
找到并选择主实例。系统会显示主实例的概览 页面。
在导航菜单中,点击副本 。
在读取副本列表中,验证 MySQL disaster recovery replica
是否显示在指定的灾难恢复副本的类型 列中。
gcloud
若要了解哪个实例是主实例的指定灾难恢复副本,请使用以下命令:
gcloud sql instances describe PRIMARY_INSTANCE_NAME
执行以下变量替换操作:
PRIMARY_INSTANCE_NAME :主实例的名称
此命令的输出包含名为 failoverDrReplica
的字段,用于标识指定的灾难恢复副本。
REST v1
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :包含实例的 Google Cloud 项目的 ID 或项目编号。
PRIMARY_INSTANCE_NAME :主实例的名称。
HTTP 方法和网址:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
执行以下命令:
curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME "
PowerShell (Windows)
执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method GET ` -Headers $headers ` -Uri "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME " | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#instance",
"state": "RUNNABLE",
"databaseVersion": "MYSQL_8_0_31",
"settings": {
. . .
"replicaNames": [
"my-instance-replica"
],
"ipAddresses": [
{
"type": "PRIMARY",
"ipAddress": "192.5.4.1"
}
],
"instanceType": "CLOUD_SQL_INSTANCE",
. . .
"connectionName": "my-project:us-east1:my-instance",
"name": "my-instance",
"region": "us-east1",
"gceZone": "us-east1-c",
"secondaryGceZone": "us-east1-b",
"databaseInstalledVersion": "MYSQL_8_0_31",
"maintenanceVersion": "MYSQL_8_0_31.R20240207.00_07",
"replicationCluster" {
"failoverDrReplicaName": "my-project:my-instance-replica"
},
"createTime": "2024-03-15T18:11:03.596Z",
"sqlNetworkArchitecture": "NEW_NETWORK_ARCHITECTURE"
}
}
REST v1beta4
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :包含实例的 Google Cloud 项目的 ID 或项目编号。
PRIMARY_INSTANCE_NAME :主实例的名称。
HTTP 方法和网址:
GET https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
执行以下命令:
curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME "
PowerShell (Windows)
执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method GET ` -Headers $headers ` -Uri "https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME " | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#instance",
"state": "RUNNABLE",
"databaseVersion": "MYSQL_8_0_31",
"settings": {
. . .
"replicaNames": [
"my-instance-replica"
],
"ipAddresses": [
{
"type": "PRIMARY",
"ipAddress": "192.5.4.1"
}
],
"instanceType": "CLOUD_SQL_INSTANCE",
. . .
"connectionName": "my-project:us-east1:my-instance",
"name": "my-instance",
"region": "us-east1",
"gceZone": "us-east1-c",
"secondaryGceZone": "us-east1-b",
"databaseInstalledVersion": "MYSQL_8_0_31",
"maintenanceVersion": "MYSQL_8_0_31.R20240207.00_07",
"replicationCluster" {
"failoverDrReplicaName": "my-project:my-instance-replica"
},
"createTime": "2024-03-15T18:11:03.596Z",
"sqlNetworkArchitecture": "NEW_NETWORK_ARCHITECTURE"
}
}
如需检查副本是否为灾难恢复副本,请执行以下步骤之一。
控制台
如需检查副本实例是否为灾难恢复副本,请执行以下操作:
在 Google Cloud Console 中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
找到副本实例。
验证 MySQL disaster recovery replica
是否显示在指定的灾难恢复副本的类型 列中。
gcloud
如需检查副本实例是否为灾难恢复副本,请运行以下命令:
gcloud sql instances describe REPLICA_NAME
执行以下变量替换操作:
REPLICA_NAME :您要检查的读取副本的名称
如果该副本是灾难恢复副本,则命令的输出包含字段 drReplica=true
。
REST v1
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :包含实例的 Google Cloud 项目的 ID 或项目编号。
REPLICA_NAME :副本的名称。
HTTP 方法和网址:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
执行以下命令:
curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME "
PowerShell (Windows)
执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method GET ` -Headers $headers ` -Uri "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME " | Select-Object -Expand Content
您应该会收到一个成功的状态代码 (2xx) 和一个空响应。
REST v1beta4
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :包含实例的 Google Cloud 项目的 ID 或项目编号。
REPLICA_NAME :副本的名称。
HTTP 方法和网址:
GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
执行以下命令:
curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME "
PowerShell (Windows)
执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method GET ` -Headers $headers ` -Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME " | Select-Object -Expand Content
您应该会收到一个成功的状态代码 (2xx) 和一个空响应。
移除灾难恢复副本
您可以从主实例中清除指定的灾难恢复副本。但是,如果没有为主实例分配灾难恢复副本,则无法执行切换或副本故障切换。
控制台
如需从主实例中移除指定的灾难恢复副本,请执行以下操作:
在 Google Cloud Console 中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
找到并选择主实例。系统会显示主实例的概览 页面。
在导航菜单中,点击副本 。
在读取副本列表中,找到您要移除的跨区域读取副本。
对于副本,点击 more_vert 操作 按钮,然后选择取消指定为灾难恢复副本 。
点击确认 。
gcloud
若要移除指定的灾难恢复副本,请在主实例上运行以下命令:
gcloud sql instances patch PRIMARY_INSTANCE_NAME \
--clear-failover-dr-replica-name
执行以下变量替换操作:
PRIMARY_INSTANCE_NAME :要从中移除指定灾难恢复副本的主实例的名称
REST v1
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
PRIMARY_INSTANCE_NAME :主实例的名称。
将 failoverDrReplicaName
字段设置为空字符串。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME
请求 JSON 正文:
{
"replicationCluster": {
"failoverDrReplicaName": ""
}
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X PATCH \ -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/PRIMARY_INSTANCE_NAME "
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method PATCH ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME " | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID /instances/INSTANCE_ID ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2024-04-01T21:30:35.667Z",
"operationType": "UPDATE",
"name": "OPERATION_ID ",
"targetId": "INSTANCE_ID ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
REST v1beta4
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
PRIMARY_INSTANCE_NAME :主实例的名称。
将 failoverDrReplicaName
字段设置为空字符串。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME
请求 JSON 正文:
{
"replicationCluster": {
"failoverDrReplicaName": ""
}
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X PATCH \ -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/PRIMARY_INSTANCE_NAME "
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method PATCH ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/PRIMARY_INSTANCE_NAME " | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/INSTANCE_ID ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2024-04-01T21:30:35.667Z",
"operationType": "UPDATE",
"name": "OPERATION_ID ",
"targetId": "INSTANCE_ID ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
指定灾难恢复副本后,您可以执行切换操作。但最佳做法是避免在以下情况下执行切换操作:
主实例正在使用中。
正在进行管理操作,例如自动备份或者启用或停用高可用性 (HA)。
为避免超时,请考虑在事务量较低时执行切换。
切换完成后,操作会在新的主实例升级后立即备份新的主实例(以前的灾难恢复副本)。此备份完成后,系统将在新的主实例上完全启用时间点恢复 (PITR)。此备份可能需要 5 到 15 分钟才能完成,具体取决于磁盘大小。只有在此备份完成后,PITR 保护才会开始。如需详细了解将 PITR 与高级灾难恢复搭配使用的注意事项,请参阅将 PITR 与高级灾难恢复搭配使用 。
切换操作完成后,您会发现复制方向反转。
将旧的主实例重新配置为只读副本后,之前解析为旧主实例的 DNS 写入端点 会解析为新主实例。
重要提示 :如果您不使用 DNS 写入端点,则必须让应用使用新主实例的 IP 地址。
准备工作
在执行切换操作之前,请执行以下操作:
指定灾难恢复副本 。
您只能在主实例和指定的灾难恢复副本之间执行切换。
验证主实例和灾难恢复副本是否处于在线状态。
如果您使用的是 DNS 写入端点 ,请验证主实例和 DR 副本的 SSL 配置是否相同。例如,如果灾难恢复副本配置为强制执行 SSL 加密 ,但主实例允许未加密的连接,则客户端将无法在切换操作完成后连接到新的主实例。
按需备份主实例。此备份可作为一种预防措施,以防您需要从任何意外故障中恢复。
注意: 为了让 Cloud SQL 更新写入端点 并将其指向正确的实例,请确保您的副本在切换操作发生之前采用了新网络架构。如果实例不是使用此架构创建的,您可以将实例升级到新网络架构 。
控制台
如需执行切换操作,请执行以下操作:
在 Google Cloud 控制台中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
找到主实例的指定灾难恢复副本。
点击灾难恢复副本实例。系统会显示灾难恢复副本的概览 页面。
点击切换 按钮。
在 Perform switchover between the primary and DR replica (在主实例和灾难恢复副本之间执行切换)页面上的实例 ID 字段中,输入主实例的名称。
点击切换 。
gcloud
如需执行切换操作,请运行以下命令:
gcloud sql instances switchover REPLICA_NAME
[ --db-timeout= TIMEOUT_DURATION ]
执行以下变量替换操作:
REPLICA_NAME :希望供主实例用来切换角色的指定灾难恢复副本的名称。
TIMEOUT_DURATION :可选。允许完成实例上的数据库操作的超时期限。
如果未指定此参数,则切换操作包含 10 分钟的超时。
您可以通过指定 --db-timeout
参数来增加此超时的值。将 TIMEOUT_DURATION 替换为最长 24 小时的时间段,包括格式的初始表示法。例如,如果是 30 秒,请指定 30s
。如果是 24 小时,请指定 24h
。您还可以使用最多 9 位小数来指定时间段的小数单位。例如,如果是 30.5 分钟,请指定 30.5m
。
如果您没有任何待处理的操作,则可以减小此超时值。
REST v1
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
REPLICA_NAME :灾难恢复副本的名称。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME /switchover
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
执行以下命令:
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d "" \ "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME /switchover"
PowerShell (Windows)
执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -Uri "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME /switchover" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2024-04-01T22:43:37.981Z",
"operationType": "SWITCHOVER",
"name": "OPERATION_ID ",
"targetId": "REPLICA_ID ",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
REST v1beta4
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
REPLICA_NAME :灾难恢复副本的名称。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME /switchover
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
执行以下命令:
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d "" \ "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME /switchover"
PowerShell (Windows)
执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME /switchover" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2024-04-01T22:43:37.981Z",
"operationType": "SWITCHOVER",
"name": "OPERATION_ID ",
"targetId": "REPLICA_ID ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
如果发生区域性故障或灾难,您可以通过对指定的灾难恢复副本调用副本故障切换操作来执行灾难恢复。如需执行副本故障切换,请提升指定的灾难恢复副本。与切换相比,提升灾难恢复副本的过程很快。
由于灾难恢复副本会立即充当主实例,因此由于复制延迟,副本可能不会拥有旧主实例中的所有数据。因此,副本故障切换可能会导致数据丢失。
在升级过程中,副本故障切换会在灾难恢复副本成为新的主实例后立即备份新的主实例(以前的灾难恢复副本)。此备份完成后,系统将在新的主实例上完全启用时间点恢复 (PITR)。此备份可能需要 5 到 15 分钟才能完成,具体取决于新(和旧)主实例的磁盘大小。在此备份期间,PITR 不可用。
当旧的主实例恢复在线状态后,副本故障切换过程将执行备份。执行此备份后,系统会将旧的主实例重新创建为新主实例的读取副本。
如需详细了解将 PITR 与高级灾难恢复搭配使用的注意事项,请参阅将 PITR 与高级灾难恢复搭配使用 。
在您调用副本故障切换操作后,之前解析为旧主实例的 DNS 写入端点 会解析为新的主实例。
重要提示 :如果您不使用 DNS 写入端点,则必须让应用使用新主实例的 IP 地址。
准备工作
在执行副本故障切换之前,请执行以下操作:
指定灾难恢复副本 (如果您尚未指定)。您只能在主实例和指定的灾难恢复副本之间执行副本故障切换。
确保灾难恢复副本处于在线状态且运行状况良好。
注意: 为了让 Cloud SQL 更新写入端点 并将其指向正确的实例,请确保您的副本在发生副本故障切换操作之前采用了新网络架构。如果实例不是使用此架构创建的,您可以将实例升级到新网络架构 。
控制台
如需执行副本故障切换操作,请执行以下操作:
在 Google Cloud 控制台中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
找到主实例的指定灾难恢复副本。
点击灾难恢复副本实例。系统会显示灾难恢复副本的概览 页面。
点击副本故障切换 按钮。
在 Perform replica failover between the primary and DR replica (在主实例和灾难恢复副本之间执行副本故障切换)页面上的实例 ID 字段中,输入主实例的名称以确认您要继续执行该操作。
如需启动副本故障切换,请点击副本故障切换 。
gcloud
如需调用副本故障切换以切换到灾难恢复副本,请使用以下命令:
gcloud sql instances promote-replica \
REPLICA_NAME --failover
执行以下变量替换操作:
REST v1
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
REPLICA_NAME :灾难恢复副本的名称。
ENABLE_REPLICA_FAILOVER :设置为 true
以使用副本故障切换。如果设置为 false
,则 API 会使用常规 promoteReplica
方法,而不使用副本故障切换。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME /promoteReplica?failover=ENABLE_REPLICA_FAILOVER
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
执行以下命令:
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d "" \ "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME /promoteReplica?failover=ENABLE_REPLICA_FAILOVER "
PowerShell (Windows)
执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -Uri "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME /promoteReplica?failover=ENABLE_REPLICA_FAILOVER " | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /instances/REPLICA_NAME ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-21T22:43:37.981Z",
"operationType": "PROMOTE_REPLICA",
"name": "OPERATION_ID ",
"targetId": "REPLICA_NAME ",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
REST v1beta4
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID :主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
REPLICA_NAME :灾难恢复副本的名称。
ENABLE_REPLICA_FAILOVER :设置为 true
以使用副本故障切换。如果设置为 false
,则 API 会使用常规 promoteReplica
方法,而不使用副本故障切换。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME /promoteReplica?failover=ENABLE_REPLICA_FAILOVER
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
执行以下命令:
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d "" \ "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME /promoteReplica?failover=ENABLE_REPLICA_FAILOVER "
PowerShell (Windows)
执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME /promoteReplica?failover=ENABLE_REPLICA_FAILOVER " | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /instances/REPLICA_NAME ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2024-04-01T22:43:37.981Z",
"operationType": "PROMOTE_REPLICA",
"name": "OPERATION_ID ",
"targetId": "REPLICA_NAME ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID /operations/OPERATION_ID ",
"targetProject": "PROJECT_ID "
}
检查副本故障切换的状态
副本故障切换分两个阶段进行。第一阶段是升级灾难恢复副本。第二个阶段是将旧的主实例重新创建为读取副本。
如需检查副本故障切换的状态,请检查每个阶段的状态。
检查第一个阶段的状态。
控制台
如需检查灾难恢复副本是否已提升为独立实例,请执行以下操作:
在 Google Cloud 控制台中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
找到您已升级的灾难恢复副本的名称。
验证 MySQL VERSION 是否显示在新的主实例的类型 列中。
gcloud
您可以通过运行以下命令来检查状态:
gcloud sql instances describe DR_REPLICA_NAME
执行以下变量替换操作:
DR_REPLICA_NAME :升级后的灾难恢复副本的名称
在输出中,检查以下字段是否出现以及副本是否已成为独立的 Cloud SQL 主实例:
instanceType : CLOUD_SQL_INSTANCE
如需验证第二个阶段是否已完成,请检查实例上的操作日志中是否出现消息 RECONFIGURE_OLD_PRIMARY
。
此消息是否显示取决于旧的主实例何时恢复在线状态,如果发生灾难,可能需要几分钟或几天的时间。
如需详细了解如何检查实例的操作日志,请参阅查看实例日志 。
将 PITR 与高级灾难恢复搭配使用
使用切换和副本故障切换时,灾难恢复副本升级为主实例后,会发生以下更改以支持备份和 PITR:
备份配置(包括任何自动备份安排)会从旧的主实例复制到新的主实例。
如果停用,则系统会通过启用 binlog 配置标志来启用 PITR。
对于备份配置和事务日志保留政策,我们都建议您验证从旧的主实例继承的设置在新的主实例上是正确的。
开始 PITR 保护
在切换操作结束时,Cloud SQL 会安排自动备份并执行新的主实例的首次备份。如果您希望尽快开始 PITR 保护,我们建议您验证第一次备份是否成功。只有在第一次自动备份成功完成后,新升级的主实例才会获得 PITR 保护 。
如需详细了解如何查看实例可用的备份,请参阅查看备份列表 。
切换和副本故障切换期间实例的 PITR 保护
当实例参与切换或副本故障切换操作时,该实例会充当一段时间的读取副本。在实例充当读取副本和主实例的时间段内,支持 PITR 和恢复备份。
您可以执行 PITR,以恢复到切换之前实例还是主实例时的某个时间。对于切换和副本故障切换操作,Cloud SQL 会在新的主实例升级后立即为新的主实例启动尽力备份。只有在此备份完成后,系统才会在升级后的实例上启用 PITR。此备份可能需要 5 到 15 分钟才能完成,具体取决于磁盘大小。
副本故障切换期间的脑裂
当使用副本故障切换升级副本时,如果主实例继续接受写入操作,则可能会发生脑裂。副本升级后,当旧的主实例再次可用时,系统会将其重新构建为升级实例的副本,并进行最终备份。此备份可用于恢复任何未写入升级副本的脑裂数据。
删除副本上的备份和事务日志
如果启用了 PITR 和备份的主实例成为读取副本,则在其充当副本期间,系统会保留并应用自其作为主实例时起的最近一次备份和 PITR 保留政策。即使新的主实例没有进行备份,系统也会根据上次配置的政策在读取副本上删除用于 PITR 的旧备份和事务日志。
例如,如果实例配置为具有每日自动备份,并保留 7 个包含 7 天 PITR 日志的备份,则当此实例成为读取副本时,任何超过 7 天的备份都将被删除,删除频率为每天一次。
如果您需要更快地删除备份,可以手动移除备份。如需了解详情,请参阅删除备份 。
限制
使用 Private Service Connect 的 Cloud SQL 实例不支持高级灾难恢复。高级灾难恢复支持专用服务访问 。
如果主实例将用于时间点恢复 (PITR) 的事务日志存储在磁盘上,则您无法将 Cloud SQL 企业 Plus 版读取副本实例指定为灾难恢复副本。如需检查实例将用于 PITR 的日志存储在何处,请参阅检查用于 PITR 的事务日志的存储位置 。
您不能将外部副本指定为灾难恢复副本。
Terraform 不支持切换或副本故障切换操作。
问题排查
问题
问题排查
切换操作失败。
确保实例满足所有规定的灾难恢复副本要求 。
检查数据库上的事务量。在执行切换之前,切换功能会保护 Cloud Storage 中主实例的二进制日志。 如果事务量较高,则操作可能会超时。请考虑在事务负载较低时重试操作。
切换操作失败,主实例卡在只读模式下。
执行数据库重启,使主实例恢复写入模式。
切换操作已完成,但 Google Cloud 控制台未显示实例的新反转角色。
刷新浏览器以显示更新后的拓扑。
副本故障切换操作失败。
确保为主实例指定了灾难恢复副本且该副本处于在线状态。
如果故障切换到灾难恢复副本的操作失败,则改为升级到常规(非灾难恢复)读取副本。
无法确定是否未发生复制
连接到副本 并输入以下内容:
show slave status;
如果正在进行复制,则第一列“Slave_IO_State
”会显示“Waiting for master to send
event
”,“Last_IO_Error
”字段为空。
如果未 进行复制,则第一列 "Slave_IO_State"
显示 "Connecting to
master"
。并且 "Last_IO_Error"
字段显示类似于 "error connecting to master 'cloudsqlreplica@x.x.x.x:3306"
的错误。
您还可以在 Cloud SQL 监控信息中心内查看副本的复制状态。如需了解详情,请参阅监控 Cloud SQL 实例 。
您收到以下错误消息:
"Instance was converted into a replica between the target PITR
time and the last available base backup. PITR logs are not available
for the period instance was a replica. Please clone from the instance
that was primary at time %s"
您不能在实例切换到副本的时间段内执行 PITR。PITR 日志在实例用作副本的时间段内不可用。
查看实例的操作列表,确定该实例在该时间点是否为副本
使用操作列表确定该时间点哪个实例是主实例。
克隆该实例以执行 PITR。
您收到以下错误消息:
"You can only designate a disaster recovery (DR) replica for primary instances that are
storing their PITR logs in Cloud Storage. PITR logs of the instance %s are not stored in Cloud Storage"
您的主实例尚未将其事务日志的存储位置切换到 Cloud Storage。您可在切换事务日志的存储位置后重试,也可以尝试为其他主实例指定灾难恢复副本。
如需详细了解如何移动用于 PITR 的事务日志的存储位置,请参阅使用时间点恢复 (PITR) 。
您收到以下错误消息:
"The specified failover dr replica name REPLICA_NAME must be
one of the replicas of the primary instance INSTANCE_NAME
。”
如需详细了解如何指定灾难恢复副本和正确的命令语法,请参阅为主实例指定灾难恢复副本 。
后续步骤