canal同步全量数据,存在部分数据无法同步到目标mysql,且同步时间长,容易中断等问题;鉴于此,采用mysql间表数据同步方式实现快速准确的同步历史数据。
源表名为eqs_pay_order,目标表名为max_pay_eqs_pay_order;
同步步骤如下:
1)启动canal adapter将数据实时增量写入目标表max_pay_eqs_pay_order中;
2)将源表eqs_pay_order的历史数据导出为sql文件,如下:
# 将源数据库的源表以sql格式导出,-t参数表示数据库名,--tables参数表示表名。
mysqldump -hIPHost -uuser -ppsssword -t database --tables eqs_pay_order > eqs_pay_order.sql
3)在目标库中创建和源表名相同的表eqs_pay_order
create table eqs_pay_order like max_pay_eqs_pay_order;
其中max_pay_eqs_pay_order是之前创建和源表eqs_pay_order结构相同的表;
4)将历史数据导入到eqs_pay_order 表中
# 登录目标mysql,导入目标数据;这里需要注意源表名和目标表名需要一致否则报错;
source eqs_pay_order.sql
5)将目标库eqs_pay_order表中的数据插入到目标表max_pay_eqs_pay_order中
#这里之所以有时间的筛选,是因为max_pay_eqs_pay_order表中已经有一部分数据,需要查出该表中最早的那条日志时间然后将该时间之前的数据导入;或者使用join的关联方式,查找max_pay_eqs_pay_order不存在但eqs_pay_order表中存在的数据插入即可;后者使用的方式相关更精准,第一种方式一个时间点有多条数据,可能会报错或遗漏个别数据。方式多种多样,按需选择。
insert into max_pay_eqs_pay_order select * from eqs_pay_order where create_time < '2021-05-12 14:00:00';
insert into max_pay_eqs_order select b.* from max_pay_eqs_order a right join eqs_order b on a.id = b.id where a.id is null ;