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

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

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

准备工作

在开始之前,您应该先配置外部服务器,创建源表示形式实例,并设置 Cloud SQL 副本

更新复制用户的权限

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

如果复制基于 GTID,您需要 REPLICATION SLAVEEXECUTESELECTSHOW VIEW 权限。

如果复制基于 binlog,您需要 REPLICATION SLAVEEXECUTESELECTSHOW VIEWREPLICATION CLIENTRELOAD 权限。

在外部服务器上打开一个终端,然后输入以下命令。

mysql 客户端

对于 GTID:

    UPDATE mysql.user
      SET Host='NEW_HOST'
      WHERE Host='OLD_HOST'
      AND User='USERNAME';
    GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW 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 GCP 用户帐号的用户名。
HOST GCP 用户帐号的主机名。

验证复制设置

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

首先,请确保您的外部同步设置正确无误。为此,请使用以下命令来进行验证:

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

打开终端并输入以下命令,以验证外部同步设置是否正确:

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",
         "mysqlSyncConfig": {
           "syncFlags": SYNC_FLAGS"
         }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE/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",
       }' \
     -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",
         "skipVerification": false,
         "mysqlSyncConfig": {
             "syncFlags": [{"name": "max-allowed-packet", "value": "1073741824"}, {"name": "hex-blob"}, {"name": "compress"}, {"name": "databases", "value": "db1 db2"}]"
             }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/verifyExternalSyncSettings
属性 说明
SYNC_MODE verifyExternalSyncSettings 用于验证您在设置复制后可以确保 Cloud SQL 副本和外部服务器保持同步。同步模式包括 EXTERNAL_SYNC_MODE_UNSPECIFIEDONLINEOFFLINE
SKIP_VERIFICATION 在同步数据之前是否跳过内置验证步骤。仅在您已经验证过您的复制设置时才推荐使用。
SYNC_FLAGS 要验证的初始同步标志的列表。仅当您计划在从来源复制时使用自定义同步标志时,才建议这样做。如需查看允许的标志列表,请参阅此处
PROJECT_ID Google Cloud 中的项目 ID。
REPLICA_INSTANCE Cloud SQL 副本的 ID。

在外部服务器上启动复制

在您验证自己可以从外部服务器执行复制操作后,就可以执行复制操作了。预计副本每小时导入大约 25-50 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",
         "mysqlSyncConfig": {
           "syncFlags": "SYNC_FLAGS"
         }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/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",
         "skipVerification": false
       }' \
     -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",
         "skipVerification": false,
         "mysqlSyncConfig": {
             "syncFlags": [{"name": "max-allowed-packet", "value": "1073741824"}, {"name": "hex-blob"}, {"name": "compress"}, {"name": "databases", "value": "db1 db2"}]"
             }
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/startExternalSync
属性 说明
SYNC_MODE 用于验证您在设置复制后可以确保 Cloud SQL 副本和外部服务器保持同步。
SKIP_VERIFICATION 在同步数据之前是否跳过内置验证步骤。仅在您已经验证过您的复制设置时才推荐使用。
SYNC_FLAGS 要验证的初始同步标志的列表。仅当您计划在从来源复制时使用自定义同步标志时,才建议这样做。如需查看允许的标志列表,请参阅此处
PROJECT_ID Google Cloud 中的项目 ID。
REPLICA_INSTANCE Cloud SQL 副本的 ID。

允许和默认的初始同步标志

使用代管式导入时设置复制时,mysqldump 默认使用以下标志运行:

  • --host=[HOST_SPECIFIED_IN_SOURCE_CONFIG]
  • --port=[PORT_SPECIFIED_IN_SOURCE_CONFIG]
  • --ssl-ca=[SSL_CA_SPECIFIED_IN_SOURCE_CONFIG]
  • --ssl-cert=[SSL_CERT_SPECIFIED_IN_SOURCE_CONFIG]
  • --ssl-key=[SSL_KEY_SPECIFIED_IN_SOURCE_CONFIG]
  • --master-data=[SPECIFIED_BY_SYNC_MODE_AND_SOURCE_GTID_MODE]
  • --set-gtid-purged=AUTO
  • --single-transaction
  • --hex-blob
  • --compress
  • --no-autocommit
  • --default-character-set=utf8mb4
  • --databases [ALL_NON_SYSTEM_DBS]
  • --add-drop-table
  • --routines

我们建议大多数客户使用此配置。

但针对特定情况,您可能需要指定自定义同步标志。允许使用以下标志:

  • --add-drop-database
  • --add-drop-table
  • --add-drop-trigger
  • --add-locks
  • --all-databases
  • --allow-keywords
  • --all-tablespaces
  • --apply-slave-statements
  • --column-statistics
  • --comments
  • --compact
  • --compatible
  • --complete-insert
  • --compress
  • --compression-algorithms
  • --create-options
  • --databases
  • --default-character-set
  • --delayed-insert
  • --disable-keys
  • --dump-date
  • --events
  • --exclude-databases
  • --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
  • --tables
  • --tls-ciphersuites
  • --tls-version
  • --triggers
  • --tz-utc
  • --verbose
  • --xml
  • --zstd-compression-level

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

全局读取锁定权限

如果您无权访问外部服务器上的全局读取锁并且 GTID 已关闭(Amazon RDS 可能存在这种情况),您需要暂停对服务器的写入,如下所述步骤:

  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.
    

继续复制

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

问题排查

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

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

确保外部主实例可供连接,或将 max_allowed_packet 选项与 mysqldump 结合使用。

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

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

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

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

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

  • 在 Google Cloud Console 的 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 副本实例的数据磁盘已满。

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

查看复制日志

当您验证复制设置时,系统会生成日志。您可以按照以下步骤查看这些日志:

  • 转到 Google Cloud Console 中的“日志查看器”。

    转到“日志查看器”

  • 实例下拉列表中选择 Cloud SQL 副本。
  • 选择 replication-setup.log 日志文件。
  • 如果 Cloud SQL 副本无法连接到外部服务器,请确认以下内容:

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

后续步骤