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权限。
部分全局权限:
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
PROCESS
REFERENCES
SELECT
SHOW DATABASES
SHOW VIEW
TRIGGER
UPDATE
正向同步(源库A同步至目标库B)A库参考赋权语句:
GRANT SELECT ON mysql.* TO '迁移账号'@'%';
GRANT SELECT,EVENT,TRIGGER ON 待迁移的库.* TO '迁移账号'@'%';
GRANT 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, 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权限。
部分全局权限:
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
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 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, 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任务的用户对回环标记表所在的数据库是否具有相应的权限。
如果预检查通过,可点击【预检查】页面底部的“启动同步”按钮,开始同步任务。