操作场景
为避免全量迁移或同步阶段对源端主库造成读取压力,DTS 支持将源库连接配置为只读实例或只读节点,包括自建 MySQL 的只读从库、云数据库只读实例、其他云厂商数据库的只读节点等。
由于 DTS 在前置校验阶段需要在源库写入任务身份标记,只读实例无法完成该写入,因此使用只读实例作为源库前,需要先完成本文档的操作,否则任务的前置校验会失败。迁移任务和同步任务均适用。
背景说明
DTS 在前置校验阶段,会在源库的系统库
__tencentdb__ 中写入一个任务身份标记,用于识别源库和目标库的唯一身份,防止数据复制形成环路。只读实例不允许执行写入操作,该写入步骤会被拒绝,导致前置校验失败。部分云厂商的只读节点会直接拒绝写入语句并返回错误,例如源库为阿里云 PolarDB 只读节点时,会返回 "Not allowed to execute statement that may change data on polar slave"。
因此,使用只读实例作为源库时,需要先在源库对应的主实例(读写节点)上写入该标记,待标记通过主从复制同步到只读实例后,再配置任务。
操作步骤
步骤一:在主实例上写入任务身份标记
连接源库对应的主实例(读写节点),执行以下 SQL。
CREATE DATABASE IF NOT EXISTS `__tencentdb__`;CREATE TABLE IF NOT EXISTS `__tencentdb__`.`identify` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(64) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;INSERT IGNORE INTO `__tencentdb__`.`identify`(id, name) VALUES (1, UUID());
说明:
以上语句幂等,可重复执行。
__tencentdb__ 库仅存储 DTS 的任务标记信息,占用空间为 KB 级,DTS 不会迁移或同步该库中的数据。步骤二:确认标记已同步至只读实例
连接只读实例,执行以下 SQL。
SELECT * FROM `__tencentdb__`.`identify`;
能查询到一行记录(id 为1,name 为一串唯一标识),说明标记已同步完成。若查询报错提示库或表不存在,请等待主从复制延迟追平后重试。
步骤三:配置 DTS 任务
在 DTS 控制台创建迁移或同步任务时,源库连接配置为只读实例的连接地址,启动前置校验并启动任务即可。
注意事项
1. 增量迁移或同步要求只读实例已开启 binlog,且格式为 ROW。部分云数据库只读实例默认未开启 binlog,请先在只读实例上开启,否则任务无法进入增量阶段。
2. 源库为只读实例时,数据一致性校验将被跳过,因为校验同样需要向源库写入校验信息。如需校验数据一致性,请在任务结束后自行对比源库和目标库数据。
3. 若目标库是从源库克隆而来(连同
__tencentdb__ 库一起克隆),源库和目标库的任务身份标记相同,前置校验会报环路检测错误。请在目标库上执行以下 SQL 更换身份标记后重新校验。UPDATE `__tencentdb__`.`identify` SET `name` = UUID() WHERE `id` = 1;
4. 源库为腾讯云云数据库实例时,控制台的源实例列表默认仅展示主实例,如需将只读实例配置为源库,请 提交工单 申请。