数据同步支持的源和目标数据库
源数据库 | 目标数据库 |
---|---|
RDS for MySQL 自建 MySQL 5.6部分版本/5.7/8.0 |
RDS for MySQL |
说明自建MySQL数据库版本为5.6部分版本/5.7/8.0,且源数据库版本不得高于目标数据库版本。
支持的同步对象及SQL
同步对象
- 当前DTS支持表级(指定的表对象)、库级(整库)同步。
- 支持表、索引、存储过程、视图、函数、事件、触发器的结构同步。
- 视图、存储过程、函数依赖的表不支持做表名映射。
- 在结构同步时,如果源数据源中包含视图(VIEW)、函数(FUNCTION)、存储过程(PROCEDURE)、触发器(TRIGGER)、事件(EVENT),DTS会将上述对象的定义者(DEFINER)转换为当前同步任务中访问目标数据源的账号,原定义者账号将保留调用权限(INVOKER)。
- 数据同步仅针对数据源中的用户数据库,而系统库会被自动过滤。例如:MySQL 类型数据源中的 information_schema、mysql、performance_schema、sys 库不会出现在可同步列表当中。
- 同步过程中,如果待同步对象中存在触发器或事件,则系统会在全量同步结束以后才会同步触发器和事件。
- 若源库为空库(该库下未创建任何表、视图、函数、事件、触发器、存储过程),不支持作为待同步对象。
增量数据同步支持同步的SQL操作
-
DML
INSERT、UPDATE、DELETE。
-
DDL
增量同步的DDL操作仅支持CREATE INDEX、DROP INDEX、ALTER TABLE、TRUNCATE TABLE 和DROP TABLE,如果是整库同步,支持CREATE TABLE。
注意暂不支持 CREATE TABLE 表名 AS SELECT 语句。
数据库账号及权限
数据库账号及权限如下表:
数据库 所需权限 参考赋权语句 源库 源库为MySQL5.7时:
对MySQL库的SELECT权限。
对待同步库的SELECT,EVENT,TRIGGER权限。
部分全局权限:
LOCK TABLES
REPLICATION CLIENT
REPLICATION SLAVE
SHOW VIEW
PROCESS
如果是整库同步,需要对所有数据库的查询权限。
源库为MySQL8.0时:
对MySQL库的SELECT权限。
对待同步库的SELECT, EXECUTE, EVENT,TRIGGER权限。
部分全局权限:
PROCESS
LOCK TABLES
REPLICATION CLIENT
REPLICATION SLAVE
SHOW VIEW
SHOW_ROUTINE
如果是整库同步,需要对所有数据库的查询权限。
源库为MySQL5.7时:
GRANT SELECT ON mysql.* TO '同步账号'@'%';
GRANT SELECT, EVENT,TRIGGER ON 待同步的库.* TO '同步账号'@'%';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, REPLICATION SLAVE, SHOW VIEW, PROCESS ON *.* TO '同步账号'@'%';
源库为MySQL8.0时:
GRANT SELECT ON mysql.* TO '同步账号'@'%';
GRANT SELECT, EXECUTE, EVENT, TRIGGER ON 待同步的库.* TO '同步账号'@'%';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION SLAVE, REPLICATION CLIENT, SHOW VIEW, SHOW_ROUTINE ON *.* TO '同步账号'@'%';
目标库
以下全局权限:
SHOW DATABASES
PROCESS
CREATE USER
以下18项 库权限:
ALTER
ALTER ROUTINE
CREATE
CREATE ROUTINE
CREATE TEMPORARY TABLES
CREATE VIEW
DELETE
DROP
EVENT
EXECUTE
INDEX INSERT
LOCK TABLES
REFERENCES
SELECT
SHOW VIEW
TRIGGER
UPDATE
GRANT SELECT ON mysql.* TO '迁移账号'@'%';
GRANT SHOW DATABASES,PROCESS,CREATE USER ON *.* TO '迁移账号'@'%';
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES,CREATE VIEW, DELETE ,DROP, EVENT, EXECUTE, INDEX, INSERT,LOCK TABLES, REFERENCES, SELECT, SHOW VIEW, TRIGGER, UPDATE ON `待迁移库`.* TO '迁移账号'@'%';
注意如果待同步对象包含用户自定义function,则在满足上述权限的基础上,目标端数据库同时需将log_bin_trust_function_creators参数设置为1,参考语句如下:
set global log_bin_trust_function_creators = 1;
操作须知
-
MySQL源数据库的binlog日志必须打开,且binlog日志格式必须为Row格式。
-
在磁盘空间允许的情况下,建议源数据库binlog保存时间越长越好,建议为3天。
-
源数据库expire_logs_days参数值为0,可能会导致同步失败。
-
增量同步时,必须设置MySQL源数据库的server_id。如果源数据库版本小于或等于MySQL5.6,server_id的取值范围在2-4294967296之间;如果源数据库版本大于或等于MySQL5.7,server_id的取值范围在1-4294967296之间。
-
源数据库GTID状态建议为开启状态,源数据库实例没有开启GTID的情况下DTS不支持主备HA切换,因为DTS任务会因为位点不续接而中断导致无法恢复。
-
目标库若已存在数据,DTS在增量同步过程中源库相同主键的数据将覆盖目标库已存在的数据,因此在同步前需要用户自行判断数据是否需要清除,建议用户在同步前自行清空目标库。
-
目标实例及关联RDS实例的运行状态必须正常,若关联RDS实例是主备实例,复制状态也必须正常。
-
目标库关联RDS实例必须有足够的磁盘空间,建议至少为待同步数据量的2.5倍。(全量数据同步会并发执行 INSERT 操作,导致目标数据库的表产生碎片,因此全量同步完成后目标数据库的表存储空间会比源实例的表存储空间大,且会产生大量的BINLOG,占用大量空间)。
-
目标库关联RDS数据库的字符集必须与源数据库一致。
-
在结构同步时,DTS会将视图、存储过程和函数中的DEFINER转换为INVOKER。
-
由于DTS不同步USER信息,因此在调用目标库的视图、存储过程和函数时需要对调用者授予读写权限。
-
建议在适当的范围内设置源库的expire_log_day参数,以确保在服务中断后能够顺利恢复,并保证断点处的binlog尚未过期。
-
在任务进入增量迁移阶段之前,不建议对源数据库做DDL操作,这样可能会引起任务迁移失败。
-
迁移过程中,请勿修改、删除提供给DTS连接访问的源库和目标库及用户名、密码、权限,或修改源库和目标库的端口号;若用户源库、目标库的密码发生变化,请先暂停任务再修改DTS配置的连接源库、目标库的密码。
-
选择表级对象同步时,增量同步过程中不建议对表进行重命名操作。
-
增量同步场景下,不支持源数据库进行恢复操作。
-
增量同步场景下,支持无主键表的数据同步。
-
当将MySQL5.x同步到MySQL5.7,如源端数据库的引擎类型为MyISAM时,请您先手工将源端的MyISAM存储引擎改为InnoDB再进行同步。
-
当将MySQL5.x同步到MySQL8.x,如源端数据库的引擎类型为MyISAM时,DTS自动将目标库的引擎类型转换为innoDB。
-
当您在同步数据时包含了触发器(TRIGGER),可能会因为DTS写入目标端的增量数据触发TRIGGER导致源库和目标库数据不一致。为避免数据不一致的问题,DTS会在同步时在触发器对象头部加入触发控制语句,示例代码如下所示:
-
源库触发器:
CREATE TRIGGER testtrigger BEFORE INSERT ON test1 FOR EACH ROW BEGIN UPDATE test SET num = num - 1 WHERE id = 1; END;
-
目标库触发器:
CREATE TRIGGER testtrigger BEFORE INSERT ON test1 FOR EACH ROW BEGIN IF (SELECT @`__#ctyun_dts_writer#__) IS NULL THEN UPDATE test SET num = num - 1 WHERE id = 1; END IF; END;
-
-
增量迁移并开启增量DDL支持的场景下,当前暂不支持在结构迁移与全量迁移详情页面显示增量阶段新增的表。
操作步骤
1、购买DTS数据同步实例。
在管理控制台点击“创建实例”进入订购页面,“实例类型”选择“数据同步”,“目标库实例”的“数据库类型”选择MySQL,选择实例,完成其他信息的填写并完成购买。
2、进入实例配置页面。
DTS实例购买成功后,进入【数据同步】实例列表页面,上一步骤购买成功的实例在实例列表中显示状态为“待配置”,进入实例配置页面的操作分两种情况:
- 当DTS实例的网络接入类型为“公网EIP”时,请先点击“绑定弹性IP”按钮完成公网弹性IP的绑定,然后点击该实例操作列的“实例配置”按钮。
- 当DTS实例网络接入类型为“VPC网络”时,直接点击该实例操作列的“实例配置”按钮。
3、配置源库及目标库信息。
进入实例配置第一个步骤的【配置源库及目标库信息】页面,填入源库与目标库的相关配置信息,包括数据库类型、IP地址端口、数据库账号、数据库密码等信息。
完成上述信息的填写后,点击源数据库和目标数据库的“测试连接”按钮进行数据库连接测试,检查数据库能否正常连接。
4、配置同步对象及高级配置。
源库和目标库连通性测试成功后,点下一步按钮,进入实例配置第二个步骤的【配置同步对象及高级配置】页面,在“源库对象”中选择要迁移的源库对象,包含:库、TABLE、VIEW、FUNCTION等,选中后点击“>”按钮,将待同步对象移动到“已选择对象”中。
说明关于配置同步对象及高级配置页面的详细说明,与配置迁移对象类似,具体请参考数据传输服务 - 用户指南 - 数据迁移 - 实例配置和实例编辑 - 配置迁移实例文档配置迁移对象及高级配置详细说明。
5、预检查和启动同步。
完成同步对象和高级配置后,点击“下一步预检查”,进入【预检查】页面。预检查会检查如下列表信息,并给出检查结果,用户可以依据检查结果进行下一步操作。
检查项 | 检查内容 |
---|---|
gtid_mode参数检查 | 检查源库和目标库的gtid_mode参数是否为ON。 |
lower_case_table_names一致性检查 | 检查源车和目标库的lower_case_table_names变量是否一致。 |
mysql版本检查 | 检查源库和目标库的mysql版本是不是符合要求。 |
schema字符集检查 | 检查待同步库的字符设置是否在要求范围内。 |
sql_mode参数一致性检查 | 检查源库和目标库的sql_mode参数是否一致。 |
log_slave_updates参数检查 | 如果源库为集群的从节点,检查源库的log_slave_updates参数是否设置为ON。 |
同名对象存在性检查 | 检查目标库中是否存在和待同步库同名的库,若存在,检查该库下面是否存在同名的表、视图、函数和存储过程。 |
存储引擎检查 | 检查源库中待同步的表的存储引擎。 |
待同步表主键检查 | 检查待同步表是否都存在主键。 |
源库binlog存在性检查 | 查看源库的binlog文件是否被误删除。 |
源库binlog影像类型检查 | 查看源库的binlog_row_image参数是不是FULL。 |
源库binlog是否开启检查 | 查看源库的log_bin参数是不是ON。 |
源库binlog保留时间检查 | 检查源库的binlog保留时间是否满足要求。 |
源库binlog模式检查 | 查看源库的binlog_format参数是不是ROW。 |
源库server_id检查 | 查看源库的server_id是否大于0。 |
源库和目标库字符集一致性检查 | 检查源库和目标库的字符集是否一致。 |
源库和目标库时区一致性检查 | 检查源库和目标库的时区设置的值是否一致。 |
源库用户权限检查 | 检查源库用于DTS任务的用户是否具有相应的权限。 |
源库连接数检查 | 检查源库的连接数是否满足任务要求。 |
源库连通性检查 | 检查数据传输服务能否连通源数据库。 |
目标库日志包大小检查 | 检查目标库的日志包大小是否符合要求。 |
目标库用户权限检查 | 检查目标库用于DTS任务的用户是否具有相应的权限。 |
目标库连接数检查 | 检查目标库的连接数是否满足任务要求。 |
目标库连通性检查 | 检查数据传输服务器能否连通目标数据库。 |
约束完整性检查 | 检查待同步对象中所有表的约束外键所属对象是否被选中。 |
视图依赖关系检查 | 检查待同步视图所依赖的表是否都在待迁移对象中。 |
如果预检查通过,可点击【预检查】页面底部的“启动同步”按钮,开始同步任务。