數據庫同步大數據量表之增量同步實現方案

遇到的需求:兩個服務器上的兩個不同類型的數據庫,分別是源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 )。

 

 

 

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