MySQL实例间双向同步支持的源和目标数据库
源数据库 | 目标数据库 |
---|---|
RDS for MySQL 自建 MySQL 5.6部分版本/5.7/8.0 |
RDS for MySQL 自建 MySQL 5.6部分版本/5.7/8.0 |
说明自建MySQL数据库版本为5.6部分版本/5.7/8.0,RDS for MySQL数据库版本为5.7/8.0,且源数据库和目标数据库的大版本需保持一致。
支持同步的SQL操作
- DML
INSERT、UPDATE、DELETE。 - DDL
增量同步的DDL操作仅支持CREATE INDEX、DROP INDEX、ALTER TABLE、TRUNCATE TABLE 和DROP TABLE,如果是整库迁移或同步,支持CREATE TABLE。
说明
暂不支持 CREATE TABLE 表名 AS SELECT 语句。 仅正向同步(源库同步至目标库)支持DDL,反向同步(目标库同步至源库)不支持同步DDL,将自动过滤DDL操作。
数据库账号及权限
MySQL5.7<->MySQL5.7双向同步
数据库 所需权限 参考赋权语句 源库
正向同步(源库A同步至目标库B)A库所需权限:
对MySQL库的SELECT权限。
对待迁移库的SELECT,EVENT,TRIGGER权限。
部分全局权限:
LOCK TABLES
REPLICATION CLIENT
REPLICATION SLAVE
SHOW VIEW
PROCESS
如果是整实例迁移,需要对所有数据库的查询权限。
反向同步(目标库B同步至源库A)A库所需权限为以下全局权限:
ALTER
ALTER ROUTINE
CREATE
CREATE ROUTINE
CREATE TEMPORARY TABLES
CREATE USER
CREATE VIEW
DELETE
DROP
EVENT
EXECUTE
INDEX
INSERT
LOCK TABLES
PROCESS
REFERENCES
SELECT
SHOW DATABASES
SHOW VIEW
TRIGGER
UPDATE
正向同步(源库A同步至目标库B)A库参考赋权语句:
GRANT SELECT ON mysql.* TO '迁移账号'@'%';
GRANT SELECT,EVENT,TRIGGER ON 待迁移的库.* TO '迁移账号'@'%';
GRANT LOCK TABLES, REPLICATION CLIENT, REPLICATION SLAVE, SHOW VIEW, PROCESS ON *.* TO '迁移账号'@'%';
反向同步(目标库B同步至源库A)A库参考赋权语句:
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE USER, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, PROCESS, REFERENCES, SELECT, SHOW DATABASES, SHOW VIEW, TRIGGER, UPDATE ON *.* TO '迁移账号'@'%';
目标库 同上 同上
注意双向同步时,如果待同步对象包含用户自定义function,则在满足上述权限的基础上,源端和目标库数据库都需要将log_bin_trust_function_creators设置为1,参考语句如下:
set global log_bin_trust_function_creators = 1;
MySQL8.0<->MySQL8.0双向同步
数据库 所需权限 参考赋权语句 源库
正向同步(源库A同步至目标库B)A库所需权限:
对MySQL库的SELECT权限。
对待迁移库的SELECT, EXECUTE, EVENT,TRIGGER权限。
部分全局权限:
LOCK TABLES
REPLICATION CLIENT
REPLICATION SLAVE
SHOW VIEW
SHOW_ROUTINE
PROCESS
如果是整实例迁移,需要对所有数据库的查询权限。
反向同步(目标库B同步至源库A)A库所需权限为以下全局权限:
ALTER
ALTER ROUTINE
REATE
CREATE ROUTINE
CREATE TEMPORARY TABLES
CREATE USER
CREATE VIEW
DELETE
DROP
EVENT
EXECUTE
INDEX
INSERT
LOCK TABLES
PROCESS
REFERENCES
SELECT
SHOW DATABASES
SHOW VIEW
TRIGGER
UPDATE
正向同步(源库A同步至目标库B)A库参考赋权语句:
GRANT SELECT ON mysql.* TO '迁移账号'@'%';
GRANT SELECT, EXECUTE, EVENT, TRIGGER ON 待迁移的库.* TO '迁移账号'@'%';
GRANT LOCK TABLES, REPLICATION CLIENT, REPLICATION SLAVE, SHOW VIEW, SHOW_ROUTINE,PROCESS ON *.* TO '迁移账号'@'%';
反向同步(目标库B同步至源库A)A库参考赋权语句:
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE USER, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, PROCESS, REFERENCES, SELECT, SHOW DATABASES, SHOW VIEW, TRIGGER, UPDATE ON *.* TO '迁移账号'@'%';
目标库 同上 同上
注意双向同步时,如果待同步对象包含用户自定义function,则在满足上述权限的基础上,源端和目标库数据库都需要将log_bin_trust_function_creators设置为1,参考语句如下:
set global log_bin_trust_function_creators = 1;
源库要求
- 在磁盘空间允许的情况下,建议数据库binlog保存时间越长越好,建议为3天。
- 数据库的binlog日志必须打开,且binlog日志格式必须为Row格式。
- 数据库expire_logs_days参数值为0,可能会导致同步失败。
- 待同步的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
- 必须设置MySQL数据库的server-id。如果数据库版本小于或等于MySQL5.6,server-id的取值范围在2-4294967296之间;如果数据库版本大于或等于MySQL5.7,server-id的取值范围在1-4294967296之间。
- 数据库GTID状态建议为开启状态,数据库实例没有开启GTID的情况下DTS不支持主备HA切换,因为DTS任务会因为位点不续接而中断导致无法恢复。
- 数据库必须有足够的磁盘空间。
- 目标库关联RDS数据库的字符集必须与源数据库一致。
- 源库和目标库的大版本号需保持一致。
目标库要求
与源库要求保持一致。
操作须知
- 双向同步是在全量同步完成后才开始进行,全量同步完成之前,目标库只能读不能写,否则会导致源库与目标库数据不一致。待全量同步完成后,目标库可读可写。
- 为了防止双向回环同步, DTS会在源库和目标库的ctyun_dts库下面分别创建回环标记表,表名:circle_任务id_时间戳,任务运行期间请勿操作此表。
- 双向同步场景中,反向同步所同步的数据导致的触发触发器行为产生的数据,不会在目标数据库写入。
冲突检测
正向和反向都可以选择如下冲突修复策略,DTS根据用户配置的冲突修复策略进行冲突的检测和处理:
- TaskFailed(遇到冲突,任务报错退出)。
当数据同步遇到冲突时,同步任务直接报错并退出,同步任务进入失败状态,需要您介入修复任务。 - Ignore(遇到冲突,直接使用目标实例中的冲突记录)。
当数据同步遇到冲突时,直接跳过当前同步语句,继续往下执行,选择使用目标库中的冲突记录。 - Overwrite(遇到冲突,直接覆盖目标实例中的冲突记录)。
当数据同步遇到冲突时,直接覆盖目标库中的冲突记录。
说明
DTS无法完全保证冲突检测机制能够完全防止数据的冲突。在使用双向同步时,您需要在业务层面配合进行相应的改造,保证同一个主键或唯一键的记录只在双向同步的某个节点进行更新。
如果同步任务暂停或重启后存在延迟,在延迟期间,这些策略均不生效,默认覆盖目标端数据。
操作步骤
1、购买DTS数据同步实例。
在管理控制台点击“创建实例”进入订购页面,“实例类型”选择“数据同步”,“目标库实例”的“数据库类型”选择MySQL,选择实例,选择网络接入类型等,完成其他信息的填写并完成购买。
注意
目标库的空余空间建议为同步数据量的三倍(少于三倍需要监控磁盘空间,定期清BINLOG) 。
目标库使用VPC网络时,直接使用数据库主库ip而不是vip,可在性能上有20%的提升。
2、进入实例配置页面。
DTS实例购买成功后,进入【数据同步】实例列表页面,上一步骤购买成功的实例在实例列表中显示状态为“待配置”,进入实例配置页面的操作分两种情况:
- 当DTS实例的网络接入类型为“公网EIP”时,请先点击“绑定弹性IP”按钮完成公网弹性IP的绑定,然后点击该实例操作列的“实例配置”按钮。
- 当DTS实例网络接入类型为“VPC网络”时,直接点击该实例操作列的“实例配置”按钮。
3、配置源库及目标库信息。
进入实例配置第一个步骤的【配置源库及目标库信息】页面,填入源库与目标库的相关配置信息,源库数据库类型选择MySQL,完成IP地址端口、数据库账号、数据库密码等信息的填写。
完成上述信息的填写后可以进行数据库的连接测试,测试数据库能否正常连接。
4、配置同步对象及高级配置。
源库和目标库连通性测试成功后,点下一步按钮,进入实例配置第二个步骤的【配置同步对象及高级配置】页面,同步拓扑选择“双向同步”。
5、预检查和启动同步。
点击“下一步预检查”,进入【预检查】页面。预检查会检查如下列表信息,并给出检查结果,用户可以依据检查结果进行下一步操作。
方向 检查项 检查内容 正向预检查 gtid_mode参数检查 检查源库和目标库的gtid_mode参数是否为ON。 lower_case_table_names 一致性检查 检查源库和目标库的lower_case_table_names变量是否一致。 mysql版本检查 检查源库和目标库的mysql版本是不是符合要求。 scheme字符集检查 检查待迁移库的字符集设置是否在要求范围内。 sql_mode参数一致性检查 检查源库和目标库的sql_mode参数是否一致。 双向回环标记表存在性检查 检查源库和目标库是否存在双向回环标记表,否则双向同步将会进入无限循环同步。 源库用户对回环标记数据库的权限检查
检查源库用于DTS任务的用户对回环标记表所在的数据库是否具有相应的权限。 同名对象存在性检查 检查目标库中是否存在和待迁移库同名的库,若存在,检查该库下面是否存在同名的表、视图、函数和存储过程。 存储引擎检查 检查源库中待迁移的表的存储引擎。 待迁移表主键检查 检查待迁移表是否都存在主键。 源库binlog存在性检查 查看源库的binlog文件是否被误删除。 源库binlog影像类型检查 查看源库的binlog_row_image参数是不是FULL。 源库binlog是否开启检查 查看源库的log_bin参数是不是ON。 源库binlog模式检查 查看源库的binlog_format参数是不是ROW。 源库server_id检查 查看源库的server_id是否大于0。 源库和目标库字符集一致性检查 检查源库和目标库的字符集是否一致。 源库和目标库时区一致性检查 检查源库和目标库的时区设置的值是否一致。 源库用户权限检查 检查源库用于DTS任务的用户是否具有相应的权限。 源库连接数检查 检查源库的连接数是否满足任务要求。 源库连通性检查 检查数据传输服务器能否连通源数据库。 目标库日志包大小检查 检查目标库的日志包大小是否符合要求。 目标库用户权限检查 检查目标库用于DTS任务的用户是否具有相应的权限。 目标库连接数检查 检查目标库的连接数是否满足任务要求。 目标库连通性检查 检查数据传输服务器能否连通目标数据库。 约束完整性检查 检查待迁移对象中所有表的约束外键所属对象是否被选中。 视图依赖关系检查 检查待迁移视图所依赖的表是否都在待迁移对象中。 反向预检查 源库binlog存在性检查 查看源库的binlog文件是否被误删除。 源库binlog影像类型检查 查看源库的binlog_row_image参数是不是FULL。 源库binlog是否开启检查 查看源库的log_bin参数是不是ON。 源库binlog模式检查 查看源库的binlog_format参数是不是ROW。 源库server_id检查 查看源库的server_id是否大于0。 源库用户权限检查 检查源库用于DTS任务的用户是否具有相应的权限。 目标库用户权限检查 检查目标库用于DTS任务的用户是否具有相应的权限。 目标库用户对回环标记数据库的权限检查 检查目标库用于DTS任务的用户对回环标记表所在的数据库是否具有相应的权限。
如果预检查通过,可点击【预检查】页面底部的“启动同步”按钮,开始同步任务。