定義
複製的一種,允許站點對已複製數據進行匿名更改,並在晚些時候合併更改和根據需要解決
衝突。
適用情況
多個訂閱
伺服器可能會在不同時間更新同一數據,並將這些更改傳播到發布伺服器和其他訂閱伺服器。
訂閱伺服器需要接收數據,脫機更改數據,並在以後與發布伺服器和其他訂閱伺服器同步更改。
每個訂閱伺服器都需要不同的數據分區。
可能會發生衝突。如果發生衝突,則需要具備檢測和解決衝突的功能。
應用程式需要最終的數據更改結果,而不是訪問中間數據狀態。例如,如果在訂閱伺服器與發布伺服器進行同步之前,訂閱伺服器中的行更改了五次,則該行在發布伺服器中僅更改一次,並更改為第五個值以反映最終數據更改。
工作原理
合併複製允許不同
站點自主工作,然後在以後將更新合併成一個統一的結果。由於更新是在多個伺服器中進行,因此,同一數據可能由發布伺服器和多個訂閱伺服器進行了更新。於是,合併更新時就可能出現衝突。合併複製提供有數種處理衝突的方法
執行步驟
合併複製的執行需要快照代理和合併代理。其主要步驟是:
(1) 與
快照複製、
事務複製中快照代理的作用一樣,合併複製的快照代理在開始複製之前也要完成二項任務;創建快照檔案(同步集合)將存儲在分發者的複製目錄下;在出版資料庫記錄同步作業。合併代理將初始快照檔案分發給訂購者,從而完成訂購初始化(出版資料庫與訂購資料庫同步)。
(2) 當在某一節點(訂購者)對出版物中表的某一行進行修改時,觸發器會觸發,並將該行的生成列generation column 設定為零。當合併代理執行時,它把所有生成列為零的合成一組或多組,凡是新的生成列值比原來的大,則用新值替換舊值。
(3) 在進行同步處理時,合併代理把所有生成列值為零的列(被修改的列)複製到所有其它訂購者。
(4) 在目標資料庫,從節點送來的數據與已存在數據進行合併,合併代理來進行衝突檢測,如果未發生衝突則接收複製數據;如果發生衝突,合併代理根據預設或所設定的衝突解決規則來解決衝突。
發布與訂閱
合併複製必須先初始化發布伺服器和訂閱伺服器,然後才能在它們之間傳遞數據。 本主題提供有關初始化期間所進行的操作的信息。
初始化發布
下表列出了發布的初始化操作的詳細信息,在您執行列出的每個存儲過程時,或在完成新建發布嚮導後,都會發生這些初始化操作。 在為發布首次運行快照代理後,會發生進一步的初始化。
sp_replicationdboption
將發布
資料庫標記為要進行複製。 除非刪除複製,否則不能刪除該資料庫。
將系統表添加到發布資料庫中(除非該資料庫中已存在合併發布)。 有關係統表的完整列表,請參閱本主題中的“在發布資料庫和訂閱資料庫中創建的系統表”部分。
sp_addmergepublication
將發布項添加到系統表中。
sp_addpublication_snapshot
將快照代理作業添加到 SQL Server 代理系統中。 作業名稱的格式為 <發布伺服器>-<發布資料庫>-<發布>-<整數>。
sp_addmergearticle
將複製的每個對象標記為要進行複製。 除非從所有發布中刪除對象的相應項目,否則不能刪除對象。
將代表每個項目的條目添加到系統表中。
發布資料庫的其餘初始化操作在為發布首次運行快照代理時執行(以後運行快照代理時,不會重新初始化發布資料庫)。 如果使用新建發布嚮導,默認情況下會在完成嚮導後創建初始快照。 如果使用存儲過程,則必須運行代理作業或直接運行代理。 有關運行代理的詳細信息,請參閱如何啟動和停止複製代理 (SQL Server Management Studio)和
複製代理執行檔概念。
為發布首次運行快照代理:
在每個已發布的表中添加一個名為 rowguid的列,除非表中已有一個數據類型為 uniqueidentifier 並具有 ROWGUIDCOL 屬性集的列(這種情況下將使用此列)。 rowguid列用於唯一標識每個已發布表中的每一行。 如果從發布中刪除表,將刪除 rowguid列;如果將現有列用於跟蹤,則不刪除該列。
在發布資料庫中為每個已發布的表創建下列對象(所有對象都在 dbo架構中創建):
將插入、更新和刪除觸發器添加到已發布的表中,以跟蹤更改。 觸發器的命名格式為 MSmerge_ins_<GUID>、MSmerge_upd_<GUID>和 MSmerge_del_<GUID>。 GUID 值從系統表 sysmergearticles中項目的項派生而來。
創建存儲過程以處理已發布表的插入、更新和刪除操作,並執行與複製相關的其他一些操作。
創建視圖以管理插入、更新、刪除和篩選操作。
創建衝突表以存儲衝突信息。 衝突表與已發布表的架構相匹配: 為每個已發布的表編寫
腳本,然後用腳本在發布資料庫中創建衝突表。 衝突表的命名格式為
dbo.MSmerge_conflict_<發布>_<項目>。
每次運行快照代理時,都會為發布資料庫中的每個項目創建下列類型的檔案(帶有相應的檔案擴展名):
架構 (.sch)
約束和索引 (.dri)
觸發器 (.trg)
系統表數據 (.sys)
衝突表 (.cft)
數據 (.bcp) -- 不會為使用參數化篩選器的發布創建。
如果發布不使用任何
參數化篩選器,快照會將已發布表的數據包含在一組 .bcp 檔案中。 如果發布使用參數化篩選器(對於合併發布通常如此),初始快照將不包含任何數據。 將使用訂閱伺服器分區的快照提供數據,這將在“初始化訂閱”部分進行討論。
初始化訂閱
每個訂閱都在訂閱的合併代理運行並將初始快照複製到訂閱資料庫時進行初始化。 除了已複製對象的架構和數據之外,快照還包含發布資料庫中存在的系統表、視圖、觸發器和存儲過程(還會將一個或兩個額外的系統表複製到訂閱資料庫中)。 有關係統表的完整列表,請參閱本主題中的“在發布資料庫和訂閱資料庫中創建的系統表”部分。 如果重新初始化訂閱,將覆蓋所有已複製對象和複製系統對象。
如果發布資料庫中的任何表都未使用參數化篩選器,則向每個訂閱伺服器上複製相同的發布快照。 如果使用了一個或多個參數化篩選器,則每個訂閱的初始化方式將由下列邏輯決定:
如果在命令行中為合併代理提供了快照位置:
則從此位置套用快照。
否則,如果快照是預生成的:
則從發布資料庫中的 MSmerge_dynamic_snapshots檢索快照的位置,並從該位置套用快照。
否則,如果發布允許訂閱伺服器初始化快照:
如果已經為具有同一分區的其他訂閱伺服器生成了快照,則將該快照套用於訂閱伺服器。
否則,將生成快照並將其套用於訂閱伺服器。
否則,將對發布中的表使用 SELECT 語句初始化訂閱伺服器。 此方法要比使用訂閱伺服器分區的快照慢得多。
如果快照傳輸在任一點中斷,它將自動恢復並且不再重新傳送已經全部傳輸的任何檔案。 對於每個發布項目,快照代理的傳遞單位是bcp 檔案,因此已部分傳遞的檔案必須全部重新傳遞。 不過,恢復快照可以大幅度減少傳輸的數據量,即便在連線不可靠的情況下也可以確保及時進行快照傳遞。 有關創建快照的詳細信息,請參閱帶有參數化篩選器的合併發布的快照。