-
合併複製
鎖定
合併複製通常也是從發佈數據庫對象和數據的報表快照開始。並用觸發器跟蹤在發佈服務器和訂閲服務器中所做的後續數據更改和架構修改。訂閲服務器與發佈服務器在連接到網絡時進行同步,並交換自上次同步以來發布服務器和訂閲服務器間發生變化的所有行。
- 中文名
- 合併複製
- 開 始
- 發佈數據庫對象和數據的報表快照
- 開始代碼
- sp_replicationdboption
- 定 義
- 複製的一種
合併複製定義
複製的一種,允許站點對已複製數據進行匿名更改,並在晚些時候合併更改和根據需要解決衝突。
[1]
合併複製適用情況
多個訂閲服務器可能會在不同時間更新同一數據,並將這些更改傳播到發佈服務器和其他訂閲服務器。
訂閲服務器需要接收數據,脱機更改數據,並在以後與發佈服務器和其他訂閲服務器同步更改。
每個訂閲服務器都需要不同的數據分區。
可能會發生衝突。如果發生衝突,則需要具備檢測和解決衝突的功能。
應用程序需要最終的數據更改結果,而不是訪問中間數據狀態。例如,如果在訂閲服務器與發佈服務器進行同步之前,訂閲服務器中的行更改了五次,則該行在發佈服務器中僅更改一次,並更改為第五個值以反映最終數據更改。
[2]
合併複製工作原理
合併複製允許不同站點自主工作,然後在以後將更新合併成一個統一的結果。由於更新是在多個服務器中進行,因此,同一數據可能由發佈服務器和多個訂閲服務器進行了更新。於是,合併更新時就可能出現衝突。合併複製提供有數種處理衝突的方法
[2]
合併複製執行步驟
合併複製的執行需要快照代理和合並代理。其主要步驟是:
(1) 與快照複製、事務複製中快照代理的作用一樣,合併複製的快照代理在開始複製之前也要完成二項任務;創建快照文件(同步集合)將存儲在分發者的複製目錄下;在出版數據庫記錄同步作業。合併代理將初始快照文件分發給訂購者,從而完成訂購初始化(出版數據庫與訂購數據庫同步)。
(2) 當在某一節點(訂購者)對出版物中表的某一行進行修改時,觸發器會觸發,並將該行的生成列generation column 設置為零。當合並代理執行時,它把所有生成列為零的合成一組或多組,凡是新的生成列值比原來的大,則用新值替換舊值。
(3) 在進行同步處理時,合併代理把所有生成列值為零的列(被修改的列)複製到所有其它訂購者。
合併複製發佈與訂閲
合併複製必須先初始化發佈服務器和訂閲服務器,然後才能在它們之間傳遞數據。 本主題提供有關初始化期間所進行的操作的信息。
合併複製初始化發佈
下表列出了發佈的初始化操作的詳細信息,在您執行列出的每個存儲過程時,或在完成新建發佈嚮導後,都會發生這些初始化操作。 在為發佈首次運行快照代理後,會發生進一步的初始化。
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 語句初始化訂閲服務器。 此方法要比使用訂閲服務器分區的快照慢得多。