Canal同步MySQL到MySQL历史/全量数据的同步方式

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 ;

你可能感兴趣的:(Canal同步MySQL到MySQL历史/全量数据的同步方式)