使用转储文件设置从外部数据库复制

本页面介绍使用外部服务器创建的转储文件时设置复制的过程。

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

准备工作

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

更新复制用户的权限

外部服务器上的复制用户已配置为接受来自任何主机 (%) 的连接。您应更新此用户账号,以使其只能与 Cloud SQL 副本配合使用。打开外部服务器上的终端,然后输入以下命令:

mysql 客户端

    UPDATE mysql.user
      SET Host='NEW_HOST'
      WHERE Host='OLD_HOST'
      AND User='USERNAME';
      GRANT REPLICATION SLAVE, EXECUTE
      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
      ON *.* TO 'gcp_user'@'gmail.com';
    FLUSH PRIVILEGES;
属性 说明
NEW_HOST 指定 Cloud SQL 副本的传出 IP 地址
OLD_HOST 分配给 Host 的当前值(您想要更改该值)。
USERNAME 外部服务器上的复制用户账号。
GCP_USERNAME Google Cloud Platform (GCP) 用户账号的用户名。
HOST Google Cloud Platform (GCP) 用户账号的主机名。

验证复制设置

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

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

  • Cloud SQL 副本和外部服务器之间的连接
  • 复制用户权限
  • 版本兼容性
  • Cloud SQL 副本当前没有执行复制操作
  • 在外部服务器上启用二进制日志
  • 启用了全局事务标识符 (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"
       }' \
     -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
属性 说明
SYNC_MODE verifyExternalSyncSettings 用于验证您在设置复制后可以确保 Cloud SQL 副本和外部服务器保持同步。同步模式包括 EXTERNAL_SYNC_MODE_UNSPECIFIEDONLINEOFFLINE
SKIP_VERIFICATION 在同步数据之前是否跳过内置验证步骤。仅在您已经验证过您的复制设置时才推荐使用。
PROJECT_ID Google Cloud 中的项目 ID。
REPLICA_INSTANCE Cloud SQL 副本的 ID。

将数据库导出到 Cloud Storage 存储桶

您可以使用 Cloud Storage 存储桶中的 mysqldump 文件填充 Cloud SQL 副本。请注意以下条件:

  • 您必须使用与 MySQL 捆绑在一起的 mysqldump 实用程序。
  • mysqldump 正在运行时,请勿在外部服务器上执行任何 DDL 操作。否则可能会导致导出文件不一致。

要将数据库导出到 Cloud Storage 存储桶,请按以下步骤操作:

  1. 在 Google Cloud 中,创建一个 Cloud Storage 存储桶
  2. 使用连接到外部数据库服务器的客户端打开终端,然后运行以下命令。

mysqldump

    mysqldump \
        --host=EXTERNAL_HOST \
        --port=EXTERNAL_PORT \
        --user=USERNAME\
        --password=PASSWORD \
        --databases=DATABASE_LIST  \
        --hex-blob \
        SOURCE_DATA  \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        --set-gtid-purged=on \
        ADD_DROP_TABLE \
        ROUTINES \
        COMPRESS \
        GZIP \
        | gcloud storage cp - gs://BUCKET/DUMP_FILENAME

示例

    mysqldump \
        --host=192.0.2.1 \
        --port=3306 \
        --user=replicationUser \
        --password \
        --databases guestbook journal \
        --hex-blob \
        --master-data=1 \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        --compress \
        | gzip \
        | gcloud storage cp - gs://replica-bucket/external-database.sql.gz
属性 说明
EXTERNAL_HOST 外部服务器的 IPv4 或 DNS 地址。
EXTERNAL_PORT 外部服务器的端口。如果外部服务器托管在 Cloud SQL 上,则此属性为 3306
USERNAME 外部服务器上具有数据库读取权限的复制用户账号或用户账号的名称。
PASSWORD 复制用户密码。
DATABASE_LIST 外部服务器上所有数据库(系统数据库 sysmysqlperformance_schemainformation_schema 除外)的列表,以英文逗号分隔。使用 SHOW DATABASES MySQL 命令可以列出您的数据库。
SOURCE_DATA 如果您使用的是低于 8.0.26 的 MySQL 版本,请将 --master-data 用作此参数的值。 对于 8.0.26 或更高版本的 MySQL,请将此参数的值设置为 --source-data
ADD_DROP_TABLE 如果您希望在每个 CREATE TABLE 语句之前添加 DROP TABLE 语句,请包含 --add-drop-table
ROUTINES 如果您希望在转储数据库的输出中显示存储的例程(例如过程和函数),请包含 --routines
COMPRESS 如果您希望压缩 Cloud SQL 副本和外部服务器之间发送的所有信息,请使用 --compress
GZIP 如果您希望进一步压缩转储文件,请使用 | gzip。如果您的数据库包含压缩效果不明显的数据(例如无法压缩的二进制数据或 JPG 图片),请勿使用此属性。
BUCKET 您在第 1 步为了包含转储文件而创建的存储桶的名称。
DUMP_FILENAME 系统会在存储桶中创建一个使用此名称的文件。此文件包含外部服务器上的数据库内容。

使用 Cloud Storage 存储桶的文件路径更新源表示形式实例

源表示形式实例是一个 Cloud SQL 实例,代表 Cloud SQL 副本的源数据库服务器。该实例会显示在 Google Cloud 控制台中,并且看起来与常规 Cloud SQL 实例相同,但不包含任何数据,无需进行任何配置或维护,也不会影响结算。

source.json 文件包含与源表示形式实例相关的信息。

REST

{
  "name": "PRIMARY_INSTANCE_NAME",
  "region": "REGION_NAME",
  "databaseVersion": "DB_NAME_AND_VERSION",
  "onPremisesConfiguration": {
    "hostPort": "IP_ADDRESS_AND_PORT",
    "username": "USERNAME",
    "password": "PASSWORD"
  },
  "dumpFilePath" :"DUMP_FILE_PATH"
}

示例

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "MYSQL_5_7",
  "onPremisesConfiguration": {
    "hostPort": "192.0.2.0:3306",
    "username": "replicationUser",
    "password": "486#@%*@"
  },
  "dumpFilePath" :"gs://replica-bucket/source-database.sql.gz"
}
属性 说明
PRIMARY_INSTANCE_NAME 与源表示形式实例关联的 Cloud SQL 实例的名称。
REGION_NAME 分配给源表示形式实例的区域的名称。
DB_NAME_AND_VERSION 与源表示形式实例关联的数据库的名称和版本号。
IP_ADDRESS_AND_PORT 为源表示形式实例预留的 IP 地址和端口号。
USERNAME 源表示形式实例的用户名。
PASSWORD 源表示形式实例的密码。
DUMP_FILE_PATH 包含外部服务器上数据库内容的转储文件的路径。

设置 Cloud SQL 副本后,您需要使用 Cloud Storage 存储桶的文件路径更新源表示形式实例。

REST

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @JSON_PATH \
         -X PATCH \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/SOURCE_REPRESENTATION_INSTANCE

示例

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @./source.json \
         -X PATCH \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/cloudsql-source-instance
属性 说明
JSON_PATH 存储在 Cloud Storage 存储桶中的 JSON 文件的路径。 此文件包含与源表示形式实例相关的数据。
PROJECT_ID Google Cloud 中的项目 ID。
SOURCE_REPRESENTATION_INSTANCE 源表示形式实例的名称。

在外部服务器上开始复制

在您验证自己可以从外部服务器执行复制操作后,就可以执行复制操作了。

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

打开终端,使用 gcloud 登录,然后输入 curl 命令以从外部服务器进行复制。

REST

  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"
         }' \
       -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
属性 说明
SYNC_MODE 用于验证您在设置复制后可以确保 Cloud SQL 副本和外部服务器保持同步。
SKIP_VERIFICATION 在同步数据之前是否跳过内置验证步骤。仅在您已经验证过您的复制设置时才推荐使用。
PROJECT_ID Google Cloud 中的项目 ID。
REPLICA_INSTANCE Cloud SQL 副本的 ID。

清理存储空间

如果您从存储桶中的文件复制过数据,则可以移除此文件和存储桶。请参阅 Cloud Storage 文档,了解如何删除对象以及如何删除存储桶

继续复制

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

问题排查

问题 问题排查
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 配置正确无误。
  • 您的复制用户、主机和密码正确无误。

后续步骤