MS SQL Server資料庫中合併複製詳解

iSQlServer發表於2009-12-30

  合併複製的概述

  也許讀者對下面的實際例子並不陌生,在某一大型企業的分銷系統中,銷售經理或一些銷售骨幹人員經常要外出處理業務,將簽訂的合同通過手邊的膝上型電腦傳遞到總部銷售資訊資料庫。在這一例子中有兩個主要的特;徵任何銷售經理和銷售骨幹都可以修改銷售資訊資料庫;只有在進行資料傳遞時才將源資料庫與目標資料庫相連。在SQL Server 中,合併複製為這一情況提供了較好的解決方案。

  合併複製作為一種從出版者向訂購者分發資料方法允許出版者和訂購者對出版資料進行修改,而不管訂購者與出版者是相互連線或斷開,然後當所有(或部分)節點相連時便合併發生在各個節點的變化。在合併複製中,每個節點都獨立完成屬於自己的任務,不像事務複製和快照複製那樣訂購者與出版者之間要相互連線,完全不必連線到其它節點,也不必使用MS DTC 來實現兩階段提交就可以在多個節點對出版進行修改,只是在某一時刻才將該節點與其它節點相連(此時所指的其它節點並不一定指所有其它節點),然後將所發生的資料變化複製到這些相連節點的資料庫中。如果在複製時因更新同一資料而發生衝突,則資料的最終結果並不總是出版者修改後的結果,也不一定包含在某一節點上所做的所有修改。因為各節點都有自主權,都可以對出版物(複製資料)進行修改,這樣在按照所設定的衝突解決規則對衝突處理之後,資料庫最終的結果往往是包含了多個節點的修改。

  可以看出儘管最後所有的資料庫都有相同的結果集,但這個結果是在多個節點共同參與下形成的,是多個修改合併到目標資料庫的結果。因此合併複製並不維護事務的一致。

  與建立快照複製和事務複製出版物相比,當建立一個合併出版物時,SQL Server 會對資料庫以及出版表進行以下處理(見圖16-54):

  (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 操作。

  16.5.2 合併複製的執行步驟

  合併複製的執行需要快照代理和合並代理。其主要步驟是:

  (1) 與快照複製、事務複製中快照代理的作用一樣,合併複製的快照代理在開始複製之前也要完成二項任務;建立快照檔案(同步集合)將儲存在分發者的複製目錄下;在出版資料庫記錄同步作業。合併代理將初始快照檔案分發給訂購者,從而完成訂購初始化(出版資料庫與訂購資料庫同步)。

  (2) 當在某一節點(訂購者)對出版物中表的某一行進行修改時,觸發器會觸發,並將該行的生成列generation column 設定為零。當合並代理執行時,它把所有生成列為零的合成一組或多組,凡是新的生成列值比原來的大,則用新值替換舊值。

  (3) 在進行同步處理時,合併代理把所有生成列值為零的列(被修改的列)複製到所有其它訂購者。

  (4) 在目標資料庫,從節點送來的資料與已存在資料進行合併,合併代理來進行衝突檢測,如果未發生衝突則接收復制資料;如果發生衝突,合併代理根據預設或所設定的衝突解決規則來解決衝突。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-623981/,如需轉載,請註明出處,否則將追究法律責任。

相關文章