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

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

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

准备工作

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

  1. 配置外部服务器

  2. 创建源表示形式实例

  3. 设置 Cloud SQL 副本

更新复制用户的权限

外部服务器上的复制用户已配置为接受来自任何主机 (%) 的连接。更新此用户账号,以使其只能与 Cloud SQL 副本搭配使用。

所需的权限

迁移和转储有四种组合。

  • 类型 1:持续迁移和代管式转储
  • 类型 2:持续迁移和手动转储
  • 类型 3:一次性迁移和代管式转储
  • 类型 4:一次性迁移和手动转储

下面列出了每种迁移与转储组合的权限。

类型 1

用户账号必须具有以下权限:

对于 MySQL 8.0 版及更高版本,建议跳过 BACKUP ADMIN 权限,以获得最佳性能。

类型 2

用户账号必须具有以下权限:

类型 3

用户账号必须具有以下权限:

对于 MySQL 8.0 版及更高版本,建议跳过 BACKUP ADMIN 权限,以获得最佳性能。

类型 4

不需要任何权限。

更新权限

如需更新权限,请在外部服务器上打开终端并输入以下命令。

mysql 客户端

对于 GTID:

    UPDATE mysql.user
      SET Host='NEW_HOST'
      WHERE Host='OLD_HOST'
      AND User='USERNAME';
    GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION_CLIENT,
    RELOAD ON . TO
    'USERNAME'@'HOST';
    FLUSH PRIVILEGES;

对于 binlog:

    UPDATE mysql.user
    SET Host='NEW_HOST'
    WHERE Host='OLD_HOST'
    AND User='USERNAME';
    GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION CLIENT,
    RELOAD ON . TO 'GCP_USERNAME'@'HOST';
    FLUSH PRIVILEGES;

示例

UPDATE mysql.user
  SET Host='192.0.2.0'
  WHERE Host='%'
  AND User='replicationUser';
GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION CLIENT,
RELOAD ON *.* TO 'username'@'host.com';
FLUSH PRIVILEGES;
属性 说明
NEW_HOST 指定 Cloud SQL 副本的传出 IP 地址
OLD_HOST 分配给 Host 的当前值(您想要更改该值)。
USERNAME 外部服务器上的复制用户账号。
GCP_USERNAME 用户账号的用户名。
HOST 用户账号的主机名。

验证复制设置

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

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

  • Cloud SQL 副本和外部服务器之间的连接
  • 复制用户权限
  • 版本兼容性
  • Cloud SQL 副本当前没有执行复制操作
  • 在外部服务器上启用二进制日志
  • 如果您正在尝试从 RDS 外部服务器执行外部同步并且使用的是 Google Cloud 存储分区,则启用 GTID

如需验证这些设置,请打开 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",
         "mysqlSyncConfig": {
           "initialSyncFlags": "SYNC_FLAGS"
         }
       }' \
     -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

带有同步标志的示例

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"
         "mysqlSyncConfig": {
             "initialSyncFlags": [{"name": "max-allowed-packet", "value": "1073741824"}, {"name": "hex-blob"}, {"name": "compress"}]
             }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/verifyExternalSyncSettings

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

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

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

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

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

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

SYNC_FLAGS 要验证的初始同步标志的列表。仅当您计划在从来源复制时使用自定义同步标志的情况下,才建议使用此参数。如需查看允许的标志列表,请参阅初始同步标志
PROJECT_ID 您的 Google Cloud 项目的 ID。
REPLICA_INSTANCE_ID Cloud SQL 副本的 ID。

全局读取锁定权限

如果您无权访问外部服务器上的全局读取锁(Amazon RDS 和 Amazon Aurora 可能存在这种情况),请按照以下步骤操作,以暂停对服务器的写入:

  1. 转到日志查看器,然后从资源列表中选择 Cloud SQL 副本。 您应该会看到 Cloud SQL 副本的最新日志列表。请暂时忽略这些日志。
  2. 打开终端并输入在外部服务器上启动复制中的命令,以便从外部服务器进行复制。
  3. 返回到日志浏览器。当您看到如下日志时,请停止向外部服务器上的数据库写入数据。在大多数情况下,这只需占用几秒钟时间。

       DUMP_IMPORT(START): Start importing data, please pause any write to the
       external primary database.
    
  4. 在日志浏览器中看到以下日志条目时,请重新启用向外部服务器上的数据库写入数据。

       DUMP_IMPORT(SYNC): Consistent state on primary and replica. Writes to the
       external primary may resume.
    
    

在外部服务器上开始复制

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

在初始导入过程中,请勿在外部服务器上执行任何 DDL 操作。否则可能导致导入过程中出现不一致现象。导入过程完成后,副本使用外部服务器上的二进制日志来与外部服务器的当前状态同步。

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",
         "mysqlSyncConfig": {
           "initialSyncFlags": "SYNC_FLAGS"
         }
       }' \
     -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

带有同步标志的示例

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"
         "skipVerification": false,
         "mysqlSyncConfig": {
             "initialSyncFlags": [{"name": "max-allowed-packet", "value": "1073741824"}, {"name": "hex-blob"}, {"name": "compress"}]
             }
       }' \
     -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,因为此设置可提供良好的转移数据速度,并且对数据库产生合理的影响。我们建议您使用此默认值。

SYNC_FLAGS 要验证的初始同步标志的列表。仅当您计划在从来源复制时使用自定义同步标志的情况下,才建议使用此参数。如需查看允许的标志列表,请参阅初始同步标志
PROJECT_ID 您的 Google Cloud 项目的 ID。
REPLICA_INSTANCE_ID Cloud SQL 副本的 ID。

初始同步标志

如需使用自定义数据库标志进行迁移,您可以使用以下允许的标志:

  • --add-drop-database
  • --add-drop-table
  • --add-drop-trigger
  • --add-locks
  • --allow-keywords
  • --all-tablespaces
  • --apply-slave-statements
  • --column-statistics
  • --comments
  • --compact
  • --compatible
  • --complete-insert
  • --compress
  • --compression-algorithms
  • --create-options
  • --default-character-set
  • --delayed-insert
  • --disable-keys
  • --dump-date
  • --events
  • --extended-insert
  • --fields-enclosed-by
  • --fields-escaped-by
  • --fields-optionally-enclosed-by
  • --fields-terminated-by
  • --flush-logs
  • --flush-privileges
  • --force
  • --get-server-public-key
  • --hex-blob
  • --ignore-error
  • --ignore-read-lock-error
  • --ignore-table
  • --insert-ignore
  • --lines-terminated-by
  • --lock-all-tables
  • --lock-tables
  • --max-allowed-packet
  • --net-buffer-length
  • --network-timeout
  • --no-autocommit
  • --no-create-db
  • --no-create-info
  • --no-data
  • --no-defaults
  • --no-set-names
  • --no-tablespaces
  • --opt
  • --order-by-primary
  • --pipe
  • --quote-names
  • --quick
  • --replace
  • --routines
  • --secure-auth
  • --set-charset
  • --shared-memory-base-name
  • --show-create-skip-secondary-engine
  • --skip-opt
  • --ssl-cipher
  • --ssl-fips-mode
  • --ssl-verify-server-cert
  • --tls-ciphersuites
  • --tls-version
  • --triggers
  • --tz-utc
  • --verbose
  • --xml
  • --zstd-compression-level

如需了解允许的值,请参阅 MySQL 公开文档

监控迁移

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

问题排查

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

问题 问题排查
创建时读取副本未开始复制。 日志文件中可能有更具体的错误信息。在 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 等查询会导致基于行的复制出现复制延迟。

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

复制延迟时间突然激增。 这是因为长时间运行的事务导致。当事务(单语句或多语句)在源实例上提交时,事务的开始时间记录在二进制日志中。当副本收到此 binlog 事件时,会将该时间戳与当前时间戳进行比较,以计算复制延迟时间。因此,来源上的长时间运行的事务将导致副本的复制延迟时间大幅度增加。如果事务中的行更改量很大,则副本还会花费很长时间来执行它。在此期间,复制延迟时间不断增加。一旦副本完成此事务,同步周期将取决于来源上的写入工作负载以及副本的处理速度。

为了避免长时间运行的事务,可以考虑一些可能的解决方案,包括:

  • 将事务拆分为多个小事务
  • 将单个大型写入查询分成较小的批次
  • 尝试将长时间运行的 SELECT 查询与混合 DML 的事务分开
更改并行复制标志会导致错误。 一个或多个这些标志的值设置错误。

在显示错误消息的主实例上,设置并行复制标志:

  1. 修改 binlog_transaction_dependency_trackingtransaction_write_set_extraction 标志:
    • binlog_transaction_dependency_tracking=COMMIT_ORDER
    • transaction_write_set_extraction=OFF
  2. 添加 slave_pending_jobs_size_max 标志:

    slave_pending_jobs_size_max=33554432

  3. 修改 transaction_write_set_extraction 标志:

    transaction_write_set_extraction=XXHASH64

  4. 修改 binlog_transaction_dependency_tracking 标志:

    binlog_transaction_dependency_tracking=WRITESET

副本创建失败并超时。 主实例上长时间运行的未提交事务可能会导致只读副本创建失败。

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

此外,对于 MySQL,还要考虑以下选项:

问题 问题排查
Lost connection to MySQL server during query when dumping table 来源可能不可用,或者转储包含的数据包过大。

确保外部主实例可供连接。 您还可以修改源实例上的 net_read_timeoutnet_write_timeout 标志的值以停止错误。 如需详细了解这些标志的允许值,请参阅配置数据库标志

如需详细了解如何使用 mysqldump 标志进行托管式导入迁移,请参阅允许和默认的初始同步标志

初始数据迁移成功,但未复制任何数据。 一个可能的根本原因是源数据库已定义了复制标志,导致部分或所有数据库更改没有被复制。

确保没有以冲突的方式设置 binlog-do-dbbinlog-ignore-dbreplicate-do-dbreplicate-ignore-db 等复制标志。

在主实例上运行 show master status 命令以查看当前设置。

初始数据迁移成功,但一段时间后数据复制停止工作。 可以尝试的操作:

  • 在 Google Cloud 控制台的 Cloud Monitoring 部分中查看副本实例的复制指标
  • MySQL IO 线程或 SQL 线程中的错误可以在 mysql.err log 文件的 Cloud Logging 中找到。
  • 在连接到副本实例时,也可能会发现此错误。 运行 SHOW SLAVE STATUS 命令,并在输出中检查以下字段:
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full 副本实例的数据磁盘已满。

增加副本实例的磁盘大小。 您可以手动增加磁盘大小或启用存储空间自动扩容功能。

查看复制日志

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

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

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

    转到“日志查看器”

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

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

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

后续步骤