使用代管式导入设置从外部数据库复制

本页面介绍如何在从外部服务器复制到 Cloud SQL 时设置并使用代管式数据导入。

您必须完成本页面中的所有步骤。完成后,您可以像管理任何其他 Cloud SQL 实例一样管理和监控源表示形式实例。

准备工作

在开始之前,请完成以下步骤:

  1. 配置外部服务器

  2. 创建源表示形式实例

  3. 设置 Cloud SQL 副本

验证复制设置

设置完成后,请确保 Cloud SQL 副本可以从外部服务器进行复制。

以下外部同步设置必须正确无误。

  • Cloud SQL 副本和外部服务器之间的连接
  • 复制用户权限
  • 版本兼容性
  • Cloud SQL 副本当前没有执行复制操作

如需验证这些设置,请打开 Cloud Shell 终端并输入以下命令:

curl

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "SYNC_MODE",
         "syncParallelLevel": "SYNC_PARALLEL_LEVEL"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE_ID/verifyExternalSyncSettings

示例

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "online",
         "syncParallelLevel": "optimal"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/myproject/instances/myreplica/verifyExternalSyncSettings

这些调用返回一个 sql#externalSyncSettingErrorList 类型的列表。

如果列表为空,则表示没有错误。无错误的响应如下所示:

  {
    "kind": "sql#externalSyncSettingErrorList"
  }
属性 说明
SYNC_MODE 确保在设置复制后可以使 Cloud SQL 副本和外部服务器保持同步。同步模式包括 EXTERNAL_SYNC_MODE_UNSPECIFIEDONLINEOFFLINE
SYNC_PARALLEL_LEVEL

验证用于控制数据库表中数据的转移速度的设置。您可以使用以下值:

  • min: 占用数据库上最少计算资源。这是最慢的转移数据速度。
  • optimal: 提供平衡的性能和最佳数据库负载。
  • max::提供最高的转移数据速度,但这可能会导致数据库负载增加。

注意:此参数的默认值为 optimal,因为此设置可提供良好的转移数据速度,并且对数据库产生合理的影响。我们建议您使用此默认值。

PROJECT_ID 您的 Google Cloud 项目的 ID。
REPLICA_INSTANCE_ID Cloud SQL 副本的 ID。

在外部服务器上开始复制

在验证您是否可以从外部服务器执行复制后,可以开始复制。对初始导入过程执行复制的速度高达每小时 500 GB。但是,此速度可能会因机器层级、数据磁盘大小、网络吞吐量和数据库的性质而异。

curl

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "SYNC_MODE",
         "skipVerification": "SKIP_VERIFICATION",
         "syncParallelLevel": "SYNC_PARALLEL_LEVEL"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE_ID/startExternalSync

示例

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "online",
         "syncParallelLevel": "optimal"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/startExternalSync
属性 说明
SYNC_MODE 确保在设置复制后可以使 Cloud SQL 副本和外部服务器保持同步。
SKIP_VERIFICATION 在同步数据之前是否跳过内置验证步骤。仅当您已验证复制设置的情况下,才建议使用此参数。
SYNC_PARALLEL_LEVEL

提供用于控制数据库表中数据的转移速度的设置。您可以使用以下值:

  • min: 占用数据库上最少计算资源。这是最慢的转移数据速度。
  • optimal: 提供平衡的性能和最佳数据库负载。
  • max::提供最高的转移数据速度,但这可能会导致数据库负载增加。

注意:此参数的默认值为 optimal,因为此设置可提供良好的转移数据速度,并且对数据库产生合理的影响。我们建议您使用此默认值。

PROJECT_ID 您的 Google Cloud 项目的 ID。
REPLICA_INSTANCE_ID Cloud SQL 副本的 ID。

监控迁移

从外部服务器开始复制后,您需要监控复制。如需了解详情,请参阅监控复制功能。 然后,您可以完成迁移。

问题排查

请考虑以下问题排查方案:

问题 问题排查
创建时读取副本未开始复制。 日志文件中可能有更具体的错误信息。在 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,然后重新启用。此操作会创建继续执行该过程所需的服务账号。

磁盘已满。 主实例磁盘大小可能在副本创建期间变满。 修改主实例以将其升级为更大的磁盘。
磁盘空间显著增加。 未主动用于跟踪数据的槽会使 PostgreSQL 无限期地保留在 WAL 分段中,从而导致磁盘空间无限增大。如果您使用 Cloud SQL 中的逻辑复制和解码功能,则系统会自动创建和丢弃复制槽。可通过查询 pg_replication_slots 系统视图并过滤 active 列检测到未使用的复制槽。您可以使用 pg_drop_replication_slot 命令丢弃未使用的槽以移除 WAL 分段。
副本实例占用的内存过多。 副本使用临时内存来缓存经常请求的读取操作,这可能会导致其占用的内存多于主实例。

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

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

修改实例以启用 automatic storage increase

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

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

  • 修改实例以增加副本的大小。
  • 减少数据库的负载。
  • 将读取流量发送到读取副本。
  • 将表编入索引。
  • 识别并修复速度缓慢的写入查询。
  • 重新创建副本。
在 PostgreSQL 9.6 中重建索引时出错。 您会收到来自 PostgreSQL 的错误,告知您需要重新构建特定索引。此操作只能在主实例上完成。如果您创建新的副本实例,则很快就会再次遇到同样的错误。在低于 10 的 PostgreSQL 版本中,哈希索引不会传播到副本

如果必须使用哈希索引,请升级到 PostgreSQL 10+。否则,如果您还想使用副本,请不要在 PostgreSQL 9.6 中使用哈希索引。

主实例上的查询始终运行。 创建副本后,查询 SELECT * from pg_stat_activity where state = 'active' and pid = XXXX and username = 'cloudsqlreplica' 应在主实例上连续运行。
副本创建失败并超时。 主实例上长时间运行的未提交事务可能会导致只读副本创建失败。

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

如果主实例和副本具有不同的 vCPU 大小,则可能存在查询性能问题,因为查询优化器会将 vCPU 大小考虑在内。

如需解决此问题,请完成以下步骤:

  1. 开启 log_duration 标志并将 log_statement 参数设置为 ddl。这样一来,您就可以同时获得针对数据库的查询和运行时间。但是,这可能会导致性能问题,具体取决于您的工作负载。
  2. 在主实例和读取副本上,针对查询运行 explain analyze
  3. 比较查询计划并检查差异。

如果是特定查询,请修改此查询。例如,您可以更改联接的顺序,以查看是否可以获得更好的性能。

查看复制日志

当您验证复制设置时,系统会生成日志。

您可以按照以下步骤查看这些日志:

  1. 转到 Google Cloud 控制台中的“日志查看器”。

    转到“日志查看器”

  2. 实例下拉列表中选择 Cloud SQL 副本。
  3. 选择 replication-setup.log 日志文件。

如果 Cloud SQL 副本无法连接到外部服务器,请确认以下内容:

  • 外部服务器上的任何防火墙已配置为允许来自 Cloud SQL 副本的传出 IP 地址的连接。
  • 您的 SSL/TLS 配置正确无误。
  • 您的复制用户、主机和密码正确无误。

后续步骤