管理副本

本页面介绍了如何为读取副本停用和启用复制功能,以及如何将副本提升为独立实例或删除副本。如需了解如何使用读取副本,请参阅 Cloud SQL 中的复制

停用复制功能

默认情况下,复制功能会随副本的启动而启用。 但您可以停用复制功能,例如,要对实例状态进行调试或分析时。准备就绪后,您可以明确重新启用复制功能。停用或重新启用复制功能会重启副本。

停用复制功能并不会使副本实例停止,而是使该实例变成一个不再从其主实例复制内容的只读实例。系统会继续向您收取该实例的费用。您可以为已停用的副本重新启用复制功能,删除副本,或者将副本提升为独立实例。但您不能停止副本。

如需停用复制功能,请按如下所述操作:

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 点击某副本实例的名称以打开该实例。
  3. 点击按钮栏中的停用复制功能按钮。
  4. 点击确定

gcloud

gcloud sql instances patch [REPLICA_NAME] --no-enable-database-replication

REST v1beta4

如需在命令行提示符处执行此 cURL 命令,请使用 gcloud auth print-access-token 命令获取访问令牌,也可以使用 Instances:patch 页面上的 APIs Explorer 发送 REST API 请求。

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

  • project-id:项目 ID
  • replica-name:副本实例的名称

HTTP 方法和网址:

PATCH https://www.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

请求 JSON 正文:

{
  "settings":
  {
    "databaseReplicationEnabled": "False"
  }
}

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

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

启用复制功能

如果某副本已有很长时间未复制内容,它将需要较长时间才能与主实例同步。在这种情况下,请删除该副本并创建一个新副本。

如需启用复制功能,请按如下所述操作:

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 点击某副本实例的名称以选择该实例。
  3. 点击按钮栏中的启用复制功能按钮。
  4. 点击确定

gcloud

gcloud sql instances patch [REPLICA_NAME] --enable-database-replication

REST v1beta4

如需在命令行提示符处执行此 cURL 命令,请使用 gcloud auth print-access-token 命令获取访问令牌,也可以使用 Instances:patch 页面上的 APIs Explorer 发送 REST API 请求。

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

  • project-id:项目 ID
  • replica-name:副本实例的名称

HTTP 方法和网址:

PATCH https://www.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

请求 JSON 正文:

{
  "settings":
  {
    "databaseReplicationEnabled": "True"
  }
}

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

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

提升副本

提升读取副本会停止复制,并会将实例转换为具有读写功能的独立 Cloud SQL 主实例。此操作无法撤消。

在提升读取副本之前,如果主实例仍然可用并为客户端提供服务,则您应停止对主实例的所有写入操作并检查副本的复制状态(请按照 MySQL 客户端标签页中的说明操作)。您应验证副本是否正在复制,然后等到 Seconds_Behind_Master 指标报告的复制延迟时间为 0。否则,新提升的实例可能缺少提交到主实例的部分事务。

如需将副本提升为独立实例,请按如下所述操作:

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 点击某副本实例的名称以选择该实例。
  3. 点击按钮栏中的提升副本按钮。
  4. 点击确定

gcloud

gcloud sql instances promote-replica [REPLICA_NAME]
  

REST v1beta4

如需在命令行提示符处执行此 cURL 命令,请使用 gcloud auth print-access-token 命令获取访问令牌,也可以使用 Instances:promoteReplica 页面上的 APIs Explorer 发送 REST API 请求。

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

  • project-id:项目 ID
  • replica-name:副本实例的名称

HTTP 方法和网址:

POST https://www.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name/promoteReplica

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

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

确认已正确配置提升的实例。 具体来说,应启用自动备份,并在需要时考虑配置实例以使其具备高可用性

检查复制状态

使用管理客户端登录某个副本实例时,您可以查看复制详情(包括状态和指标)。使用 Google Cloud Console 或 gcloud 命令行工具时,您会看到有关复制的简短摘要。

注意:对于主实例位于 Cloud SQL 外部的副本,您不能使用 Google Cloud Console 检查复制状态。

要检查复制状态,请执行以下操作:

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 点击某副本实例的名称以选择该实例。
  3. 复制状态会显示在页面顶部的横幅中。

gcloud

对于副本实例,请使用以下命令检查复制状态:

gcloud sql instances describe [REPLICA_NAME]

在输出中,查找属性 databaseReplicationEnabledmasterInstanceName

对于主实例,请使用以下命令检查是否存在副本:

gcloud sql instances describe [PRIMARY_INSTANCE_NAME]

在输出中,查找属性 replicaNames

MySQL 客户端

  1. 使用 MySQL 客户端连接到副本。

    如需了解详情,请参阅外部应用连接方案

  2. 检查副本的状态:
    SHOW SLAVE STATUS \G
  3. 在此命令的输出中查找以下指标:
    • Master_Host:主实例的名称。
    • Slave_IO_Running:指示用于从主实例读取的 I/O 线程是否正在运行。复制开始时,此值为 Yes
    • Slave_SQL_Running:指示用于执行中继日志事件的 SQL 线程是否正在运行。复制开始时,此值为 Yes
    • Seconds_Behind_Master:副本 SQL 线程落后于处理主实例的二进制日志的秒数。此值为 O 或较小秒数值。

    如需详细了解此命令的输出,请参阅检查复制状态

问题排查

点击表中的链接可查看详细信息:

针对此问题… 可能的原因… 请尝试以下操作…
创建时读取副本未开始复制。 启用二进制日志记录后,必须至少已创建一个备份。 启用二进制日志后,等到至少创建了一个备份
无法创建读取副本 - 未知错误。 可能存在多个根本原因。 查看日志以了解详情
磁盘已满。 主实例磁盘大小可能在副本创建期间变满。 将主实例升级为更大的磁盘。
副本实例占用的内存过多。 副本可以缓存经常请求的读取操作。 重启副本实例以收回临时内存空间。
已停止复制。 已达到存储空间上限,且未启用存储空间自动扩容功能。 启用存储空间自动扩容功能
复制延迟一直很高。 可能存在多个不同的根本原因 此处罗列了一些可以尝试的操作。

创建时读取副本未开始复制

创建时读取副本未开始复制。

可能的原因

主实例必须至少具有一周的二进制日志,否则副本无法开始复制。

可以尝试的操作

等到有足够的二进制日志。


无法创建读取副本 - 未知错误

无法创建读取副本 - unknown error

可能的原因

日志文件中可能有更具体的错误信息。

可以尝试的操作

在 Cloud Logging 中查看日志以找到实际错误。如果错误为 set Service Networking service account as servicenetworking.serviceAgent role on consumer project,则停用 Service Networking API,然后重新启用。此操作会创建继续执行该过程所需的服务帐号。


磁盘已满

UPDATE_DISK_SIZEmysqld: disk is full 错误。

可能的原因

主实例磁盘大小可能在副本创建期间变满。

可以尝试的操作

对主实例进行修改以将其升级为更大的磁盘。


副本实例占用的内存过多

副本实例占用的内存过多。

可能的原因

副本使用临时内存来缓存经常请求的读取操作,这可能会导致其占用的内存多于主实例。

可以尝试的操作

重启副本实例以收回临时内存空间。


已停止复制

已停止复制。

可能的原因

已达到存储空间上限并且 >automatic storage increase is disabled

可以尝试的操作

对实例进行修改以启用 automatic storage increase


复制延迟一直很高

复制延迟一直很高。

可能的原因

写入负载过高,副本无法处理。当副本上的 SQL 线程无法与 IO 线程保持同步时,会发生复制延迟。某些类型的查询和工作负载会导致指定架构出现暂时性或永久性的高复制延迟。下面列出了复制延迟的部分常见原因:

  • 对副本的查询速度较慢。您可以启用 log_slow_slave_statements 来检测此问题并进行修复。
  • 所有表都必须具有唯一键/主键。每次更新此类没有唯一键/主键的表都会导致对副本进行全表扫描。
  • 由于大量更新堆积在副本上,因此 DELETE ... WHERE field < 50000000 等查询会导致基于行的复制出现复制延迟。

可以尝试的操作

以下是一些可行的解决方案:

  • 修改实例以增加副本的大小。
  • 减少数据库的负载。
  • 将表编入索引。
  • 识别并修复速度缓慢的查询。
  • 重新创建副本。

后续步骤