canal 关联表数据同步源码分析
2023-01-27 22:05:40 15 举报
canal 关联表数据同步源码分析
作者其他创作
大纲/内容
是
1.注意上面是canal配置的同步sql外层加了一个父查询,通过新增附表的id。2.显然如果新增了附表的数据(数据库中没有关联的主表数据),那么是无法从数据库中查询到数据的,所以也不会同步至es.3.如果一个配置数据被多个主表数据关联了,显然多条es也会被同步。
否
获取附表的id
进一步思考1.当附表的数据能够保存主表的id,那么删除不会存在问题。如果附表无法保存主表的id(因为被多个主表记录关联着,这时候mysql设计上会再建一张关联关系表),那么就需要考虑附表的数据拷贝一份到主表中去了。2.另一种解决方案,其实canal只针对第一种场景提供了方案,其实第二种方案需要用户去mysql中查询出关联了该附表的记录的id集合。需要查一次库来确定主表的id集合,可能这也是canal未对该场景进行处理的原因之一吧。
删除一条数据
因为附表被删除了,且用的是附表的id,所以无法查出结果,所以最终也不会把关联的附表的数据删除的操作同步至es。这会导致数据不同步。
新增一条数据
获取新增数据的id
遍历附表所有的字段
判断是否新增的主表数据
解决方案:方案一1.修改代码逻辑,附表删除,需要同步更新所有关联附表的同步的es数据.方案二2.业务应用方面如果删除附表和删除主表是同时进行的,那无所谓,因为删除主表的时候会把完整的数据进行删除。如果存在变更附表的情况,会先删除之前的附表数据,再新增新的关联的附表数据(两个操作同时进行),那么也没问题,会因为新的附表数据的新增而修改es中的数据。如果存在仅删除附表数据的业务,那么就会出现问题。那么删除的附表的数据不会同步更新至es中。
获取插入主表数据的id
查出的数据完整的同步至es
... 暂不做了解
根据id直接删除es数据即可
判断附表的所有需要同步字段(配置文件的sql中的)是否是简单字段
判断是不是子查询
判断是否删除的主表数据
不是子查询,就是联表查询了
查询到的数据进行同步(显然可以有多条)
使用右上角的那个查询sql进行查询,过滤条件是附表的id
收藏
收藏
0 条评论
下一页