管理读取副本

本页面介绍如何管理读取副本。相关操作包括停用和启用复制功能、提升副本、配置并行复制以及检查复制状态。

如需详细了解复制的工作原理,请参阅 Cloud SQL 中的复制

本页面适用于 Cloud SQL 实例的副本。如需设置 Cloud SQL 实例以充当外部订阅者的发布者,请参阅配置外部副本

停用复制功能

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

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

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

控制台

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

    转到“Cloud SQL 实例”

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

gcloud

gcloud sql instances patch REPLICA_NAME \
--no-enable-database-replication

REST v1

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

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

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

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

请求 JSON 正文:

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

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

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

REST v1beta4

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

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

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

HTTP 方法和网址:

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

请求 JSON 正文:

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

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

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

启用复制功能

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

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

控制台

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

    转到“Cloud SQL 实例”

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

gcloud

gcloud sql instances patch REPLICA_NAME \
--enable-database-replication

REST v1

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

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

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

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

请求 JSON 正文:

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

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

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

REST v1beta4

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

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

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

HTTP 方法和网址:

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

请求 JSON 正文:

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

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

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

提升副本

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

提升时,读取副本会自动配置备份,但不会自动配置为高可用性 (HA) 实例。您可以在升级副本后启用高可用性,就像处理任何非副本实例一样。为高可用性配置读取副本的方式与为主实例配置的方式相同。详细了解如何配置实例以实现高可用性

在提升只读副本之前,如果主实例仍然可用并为客户端提供服务,则您应执行以下操作:

  1. 停止对主实例的所有写入操作。
  2. 检查副本的复制状态。这样做的一种选择是 SQL Server Management Studio (SSMS) 中的 Always On 可用性组信息中心
  3. 验证副本是否正在复制,然后检查复制延迟时间(例如,根据 seconds_behind_master 指标的报告)。

否则,新提升的实例可能缺少提交到主实例的部分事务。

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

控制台

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

    转到“Cloud SQL 实例”

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

gcloud

gcloud sql instances promote-replica REPLICA_NAME
  

REST v1

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

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

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

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name/promoteReplica

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

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

REST v1beta4

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

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

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

HTTP 方法和网址:

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

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

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

确认已正确配置提升的实例。 具体而言,如果需要,请考虑配置实例以使其具备高可用性

检查复制状态

目前,您应该使用 T-SQL 查询或 SSMS 来监控复制状态。详情请参阅以下内容:

问题排查

问题 问题排查
创建时读取副本未开始复制。 日志文件中可能有更具体的错误信息。在 Cloud Logging 中查看日志以找到实际错误。
无法创建只读副本 - invalidFlagValue 错误 请求中的某个标志无效。它可能是您明确提供的标志,也可能是设置为默认值的标志。

首先,检查 max_connections 标志的值是否大于或等于主实例上的值。

如果 max_connections 标志设置正确,请在 Cloud Logging 中检查日志以找出实际错误。

无法创建只读副本 - 未知错误。 日志文件中可能有更具体的错误信息。在 Cloud Logging 中查看日志以找到实际错误。

如果错误为 set Service Networking service account as servicenetworking.serviceAgent role on consumer project,则停用 Service Networking API,然后重新启用。此操作会创建继续执行该过程所需的服务账号。

磁盘已满。 主实例磁盘大小可能在副本创建期间变满。 修改主实例以将其升级为更大的磁盘。
副本实例占用的内存过多。 副本使用临时内存来缓存经常请求的读取操作,这可能会导致其占用的内存多于主实例。

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

已停止复制。 已达到存储空间上限,且未启用存储空间自动扩容功能。

修改实例以启用 automatic storage increase

复制延迟一直很高。 写入负载过高,副本无法处理。当副本上的 SQL 线程无法与 IO 线程保持同步时,会发生复制延迟。某些类型的查询和工作负载会导致指定架构出现暂时性或永久性的高复制延迟。下面列出了复制延迟的部分常见原因:
  • 对副本的查询速度较慢。找到这些查询并进行修复。
  • 由于大量更新堆积在副本上,因此 DELETE ... WHERE field < 50000000 等查询会导致基于行的复制出现复制延迟。

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

  • 修改实例以增加副本的大小。
  • 减少数据库的负载。
  • 将读取流量发送到读取副本。
  • 将表编入索引。
  • 识别并修复速度缓慢的写入查询。
  • 重新创建副本。
副本创建失败并超时。 主实例上长时间运行的未提交事务可能会导致只读副本创建失败。

停止所有正在运行的查询后重新创建副本。

后续步骤