關係型數據庫同步sql
1)、全量同步數據庫
好比從oracle數據庫中同步一張表的數據到Mysql中,一般的作法就是分頁查詢源端的表,而後經過數據庫引擎批量(好比JDBC)插入到目標表,這個地方須要注意的是,分頁查詢時,必定要按照主鍵id來排序分頁,避免重複插入。緩存
2)、基於數據文件導出和導入的全量同步,這種同步方式通常只適用於同種數據庫之間的同步,若是是不一樣的數據庫,這種方式可能會存在問題。oracle
3)、基於觸發器的增量同步日誌
增量同步通常是作實時的同步,早期不少數據同步都是基於關係型數據庫的觸發器trigger來作的。blog
使用觸發器實時同步數據的步驟:排序
A、 基於原表創觸發器,觸發器包含insert,modify,delete 三種類型的操做,數據庫的觸發器分Before和After兩種狀況,一種是在insert,modify,delete 三種類型的操做發生以前觸發(好比記錄日誌操做,通常是Before),一種是在insert,modify,delete 三種類型的操做以後觸發。同步
B、 建立增量表,增量表中的字段和原表中的字段徹底同樣,可是須要多一個操做類型字段(分表表明insert,modify,delete 三種類型的操做),而且須要一個惟一自增ID,表明數據原表中數據操做的順序,這個自增id很是重要,否則數據同步就會錯亂。產品
C、 原表中出現insert,modify,delete 三種類型的操做時,經過觸發器自動產生增量數據,插入增量表中。效率
D、處理增量表中的數據,處理時,必定是按照自增id的順序來處理,這種效率會很是低,沒辦法作批量操做,否則數據會錯亂。 有人可能會說,是否是能夠把insert操做合併在一塊兒,modify合併在一塊兒,delete操做合併在一塊兒,而後批量處理,我給的答案是不行,由於數據的增刪改是有順序的,合併後,就沒有順序了,同一條數據的增刪改順序一旦錯了,那數據同步就確定錯了。
市面上不少數據交換產品都是基於這種思想來作的。
4)、基於時間戳的增量同步
A、首先咱們須要一張臨時temp表,用來存取每次讀取的待同步的數據,也就是把每次從原表中根據時間戳讀取到數據先插入到臨時表中,每次在插入前,先清空臨時表的數據
B、咱們還須要建立一個時間戳配置表,用於存放每次讀取的處理完的數據的最後的時間戳。
C、每次從原表中讀取數據時,先查詢時間戳配置表,而後就知道了查詢原表時的開始時間戳。
D、根據時間戳讀取到原表的數據,插入到臨時表中,而後再將臨時表中的數據插入到目標表中。
E、從緩存表中讀取出數據的最大時間戳,而且更新到時間戳配置表中。緩存表的做用就是使用sql獲取每次讀取到的數據的最大的時間戳,固然這些都是徹底基於sql語句在kettle中來配置,才須要這樣的一張臨時表。