数据库同步大数据量表之增量同步实现方案

遇到的需求:两个服务器上的两个不同类型的数据库,分别是源pg库-->目标库的MySQL

数据量:4亿条数据。

同步方案:同步每日新增和修改,删除的数据条。

由于之前同步是全量同步,每天都需要定时全量同步,不仅时间消耗长,也影响下游业务(查询慢,有时还会锁表)。全量同步使用的java的定时任务,多线程的方式进行同步,发现某一天同步任务执行不完的情况,修改为增量同步方案。

  • 增量同步要求:
  1. 有一个每天同步的执行时间点 - >截取点(每天都是从这个最新截取点开始同步)我取的是非空字段(更新时间UPDATE_DATE),因为新增和修改都会自动更新这个时间点,可以确保大于上一个截取点的数据是没有同步的(包含新增和修改数据)。
  2. 删除的数据(分为两种):逻辑删除和物理删除其中逻辑删除可以使用最新截取点开始查询出标志出删除行的唯一ID;物理删除需要在源库上做一个触发器,删除的数据存到另个表中,在同步这个表即可。

这种增量设计涉及到的表结构:

  1. pg库
    1. test----要同步的业务表
    2. test_del---物理删除记录表
    3. min_updatedate--同步结束的最大时间
    4. max_updatedate--同步的最大时间(取得是任务开始时的时间,后期排查问题使用,此表可用可不用,)
  2. mysql
    1. test
    2. test_del
    3. min_updatedate

任务顺序:

  1. 第一个任务:同步min_updatedate(需要有一个默认的一条记录)。mysql --> pg库
  2. 第二个任务:首先以当前pg 库 当前时间点 ,插入一条记录 ; 同步业务表;   where  update_date> min_updatedate  and  update_date<max_updatedate   (由于使用了多线程的方式,中间可以把时间分成多个时间片段,可以减少单线程拉去的数据量过大,出现服务oo;虽然这样也会出现某个时间段出现大量数据(思路有限))。同步完数据,需要在mysql 数据库 min_updatedate 表中 插入一条业务表中最大更新时间记录(select max(update_date) from test )。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章