本页面介绍使用外部服务器创建的转储文件时设置复制的过程。
您必须完成本页面中的所有步骤。完成后,您可以像管理任何其他 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_UNSPECIFIED 、ONLINE 和 OFFLINE 。 |
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 存储桶,请按以下步骤操作:
- 在 Google Cloud 中,创建一个 Cloud Storage 存储桶。
- 使用连接到外部数据库服务器的客户端打开终端,然后运行以下命令。
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 | 外部服务器上所有数据库(系统数据库 sys 、mysql 、performance_schema 和 information_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_timeout 和 net_write_timeout 标志的值,以停止出现此错误。如需详细了解这些标志的允许值,请参阅配置数据库标志。 如需详细了解如何使用 |
初始数据迁移成功,但未复制任何数据。 | 一个可能的根本原因是源数据库已定义了复制标志,导致部分或所有数据库更改没有被复制。 确保没有以冲突的方式设置 在主实例上运行 |
初始数据迁移成功,但一段时间后数据复制停止工作。 | 可以尝试的操作:
|
mysqld check failed: data disk is full 。 |
副本实例的数据磁盘已满。
增加副本实例的磁盘大小。 您可以手动增加磁盘大小或启用存储空间自动扩容功能。 |
查看复制日志
当您验证复制设置时,系统会生成日志。
您可以按照以下步骤查看这些日志:
转到 Google Cloud 控制台中的“日志查看器”。
- 从实例下拉列表中选择 Cloud SQL 副本。
- 选择
replication-setup.log
日志文件。
如果 Cloud SQL 副本无法连接到外部服务器,请确认以下内容:
- 外部服务器上的任何防火墙已配置为允许来自 Cloud SQL 副本的传出 IP 地址的连接。
- 您的 SSL/TLS 配置正确无误。
- 您的复制用户、主机和密码正确无误。
后续步骤
- 了解如何更新实例。
- 了解如何管理副本。
- 了解如何监控实例。
- 了解如何提升 Cloud SQL 副本以将副本提升为独立实例并停止从外部服务器进行复制。