本页面介绍如何在从外部服务器复制到 Cloud SQL 时设置并使用托管式数据导入。
您必须完成本页面中的所有步骤。完成后,您可以像管理任何其他 Cloud SQL 实例一样管理和监控源表示形式实例。
准备工作
在开始之前,请完成以下步骤:
更新复制用户的权限
外部服务器上的复制用户已配置为接受来自任何主机 (%
) 的连接。更新此用户账号,以使其只能与 Cloud SQL 副本搭配使用。
所需的权限
迁移和转储有四种类型的组合。
- 类型 1:持续迁移和托管式转储
- 类型 2:持续迁移和手动转储
- 类型 3:一次性迁移和托管式转储
- 类型 4:一次性迁移和手动转储
下面列出了每种迁移与转储组合的权限。
类型 1
用户账号必须具有以下权限:
- REPLICATION SLAVE
- 执行
- SELECT
- SHOW VIEW
- REPLICATION CLIENT
- 重新加载
- 触发器
- (仅适用于从 Amazon RDS 和 Amazon Aurora 迁移)LOCK TABLES
对于 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_UNSPECIFIED 、ONLINE 和 OFFLINE 。 |
SYNC_PARALLEL_LEVEL | 验证用于控制数据库表中数据转移速度的设置。您可以使用以下值:
注意:此参数的默认值为 |
SYNC_FLAGS | 要验证的初始同步标志的列表。仅当您计划在从来源复制时使用自定义同步标志的情况下,才建议使用此参数。如需查看允许的标志列表,请参阅初始同步标志。 |
PROJECT_ID | 您的 Google Cloud 项目的 ID。 |
REPLICA_INSTANCE_ID | Cloud SQL 副本的 ID。 |
全局读取锁定权限
如果您无权访问外部服务器上的全局读取锁(Amazon RDS 和 Amazon Aurora 可能存在这种情况),请按照以下步骤操作,以暂停对服务器的写入:
- 转到日志查看器,然后从资源列表中选择 Cloud SQL 副本。 您应该会看到 Cloud SQL 副本的最新日志列表。请暂时忽略这些日志。
- 打开终端并输入在外部服务器上启动复制中的命令,以便从外部服务器进行复制。
返回到 Logs Explorer。当您看到如下日志时,请停止向外部服务器上的数据库写入数据。在大多数情况下,这只需占用几秒钟时间。
DUMP_IMPORT(START): Start importing data, please pause any write to the external primary database.
在日志浏览器中看到以下日志条目时,请重新启用向外部服务器上的数据库写入数据。
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 | 提供一项设置,用于控制从数据库表传输数据的速度。您可以使用以下值:
注意:此参数的默认值为 |
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 错误 | 请求中的某个标志无效。它可能是您明确提供的标志,也可能是设置为默认值的标志。 首先,检查 如果 |
无法创建只读副本 - 未知错误。 | 日志文件中可能有更具体的错误信息。在 Cloud Logging 中查看日志以找到实际错误。 如果错误为 |
磁盘已满。 | 主实例磁盘大小可能在副本创建期间变满。 修改主实例以将其升级为更大的磁盘。 |
副本实例占用的内存过多。 | 副本使用临时内存来缓存经常请求的读取操作,这可能会导致其占用的内存多于主实例。 重启副本实例以收回临时内存空间。 |
已停止复制。 | 已达到存储空间上限,且未启用存储空间自动扩容功能。 修改实例以启用 |
复制延迟一直很高。 | 写入负载过高,副本无法处理。当副本上的 SQL 线程无法与 IO 线程保持同步时,会发生复制延迟。某些类型的查询和工作负载会导致指定架构出现暂时性或永久性的高复制延迟。下面列出了复制延迟的部分常见原因:
以下是一些可行的解决方案:
|
复制延迟时间突然激增。 | 这是因为长时间运行的事务导致。当事务(单语句或多语句)在源实例上提交时,事务的开始时间记录在二进制日志中。当副本收到此 binlog 事件时,会将该时间戳与当前时间戳进行比较,以计算复制延迟时间。因此,来源上的长时间运行的事务将导致副本的复制延迟时间大幅度增加。如果事务中的行更改量很大,则副本还会花费很长时间来执行它。在此期间,复制延迟时间不断增加。一旦副本完成此事务,同步周期将取决于来源上的写入工作负载以及副本的处理速度。 为了避免长时间运行的事务,可以考虑一些可能的解决方案,包括:
|
更改并行复制标志会导致错误。 | 一个或多个这些标志的值设置错误。
在显示错误消息的主实例上,设置并行复制标志:
|
副本创建失败并超时。 | 主实例上长时间运行的未提交事务可能会导致只读副本创建失败。
停止所有正在运行的查询后重新创建副本。 |
此外,对于 MySQL,还要考虑以下选项:
问题 | 问题排查 |
---|---|
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 副本。