合併式複寫的概述
也許讀者對下面的實際例子並不陌生,在某一大型企業的分銷系統中,銷售經理或一些銷售骨幹人員經常要外出處理業務,將簽訂的合約通過手邊的膝上型電腦傳遞到總部銷售資訊資料庫。在這一例子中有兩個主要的特;征任何銷售經理和銷售骨幹都可以修改銷售資訊資料庫;只有在進行資料傳遞時才將來源資料庫與目標資料庫相連。在SQL Server 中,合併式複寫為這一情況提供了較好的解決方案。
合併式複寫作為一種從出版者向訂購者分發資料方法允許出版者和訂購者對出版資料進行修改,而不管訂購者與出版者是相互串連或斷開,然後當所有(或部分)節點相連時便合并發生在各個節點的變化。在合併式複寫中,每個節點都獨立完成屬於自己的任務,不像事務複製和快照式複寫那樣訂購者與出版者之間要相互串連,完全不必串連到其它節點,也不必使用MS DTC 來實現兩階段交易認可就可以在多個節點對出版進行修改,只是在某一時刻才將該節點與其它節點相連(此時所指的其它節點並不一定指所有其它節點),然後將所發生的資料變化複製到這些相連節點的資料庫中。
如果在複製時因更新同一資料而發生衝突,則資料的最終結果並不總是出版者修改後的結果,也不一定包含在某一節點上所做的所有修改。因為各節點都有自主權,都可以對出版物(複製資料)進行修改,這樣在按照所設定的衝突解決規則對衝突處理之後,資料庫最終的結果往往是包含了多個節點的修改。
可以看出儘管最後所有的資料庫都有相同的結果集,但這個結果是在多個節點共同參與下形成的,是多個修改合并到目標資料庫的結果。因此合併式複寫並不維護事務的一致。
與建立快照式複寫和事務複製出版物相比,當建立一個合并出版物時,SQL Server 會對資料庫以及出版表進行以下處理:
(1) SQL Server 把出版表中的每一行都加上一個識別欄位,這樣在表的多個拷貝間能惟一標識出該行。如果基本表上已存在具有ROWGUIDCOL 屬性的識別欄位,則 SQL Server 將自動把其作為複製表的行標識,如果沒有,則或在建立出版物過程中這些表被啟用時,或在SQL Server Agent 第一次為該出版物提供服務時, SQL Server 將向表中添加一個具有ROWGUIDCOL 屬性的rowguid。
(2) SQL Server 添加一個觸發器來跟蹤每一行或列資料的變化,並把捕捉到的變化儲存到幾個系統資料表中,或在建立出版物過程中複製表被啟用時,或在SQL Server Agent 第一次為出版物提供服務時,將建立這些跟蹤觸發器。
(3) SQL Server 把使用者跟蹤的系統資料表添加到資料庫,來執行衝突的檢測,解決和記錄。MSmerger_contents MSmerger_tombstone 系統資料表用來跟蹤對出版物中資料的UPDATE、 DELETE、 INSERTS 操作。
合併式複寫的執行步驟
合併式複寫的執行需要快照代理和合并代理。其主要步驟是:
(1) 與快照式複寫、事務複製中快照代理的作用一樣,合併式複寫的快照代理在開始複製之前也要完成二項任務;建立快照檔案(同步集合)將儲存在分發者的複製目錄下;在出版資料庫記錄同步作業。合并代理將初始快照集檔案分發給訂購者,從而完成訂購初始化(出版資料庫與訂購資料庫同步)。
(2) 當在某一節點(訂購者)對出版物中表的某一行進行修改時,觸發器會觸發,並將該行的產生列generation column 設定為零。當合并代理執行時,它把所有產生列為零的合成一組或多組,凡是新的產生列值比原來的大,則用新值替換舊值。
(3) 在進行同步處理時,合并代理把所有產生列值為零的列(被修改的列)複製到所有其它訂購者。
(4) 在目標資料庫,從節點送來的資料與已存在資料進行合并,合并代理來進行衝突檢測,如果未發生衝突則接收複製資料;如果發生衝突,合并代理根據預設或所設定的衝突解決規則來解決衝突。
http://tech.sina.com.cn/s/2009-12-14/15281173251.shtml