共用方式為


合併複寫如何初始化發行項和訂閱項

合併複寫必須初始化發行者和訂閱者,然後資料才能在它們之間流動。 本文提供初始化期間所發生步驟的相關資訊。

初始化發行集

下列清單詳細說明發行集的初始化步驟,這些步驟會在您執行列出的每個預存程序時,或在您完成 [新增發行集精靈] 之後發生。 在 Snapshot Agent 第一次運行發行時,會進行更進一步的初始化。

  • sp_replicationdboption

    • 發行資料庫會標示為複製。 除非移除複寫,否則無法卸除資料庫。

    • 系統資料表會新增至發行集資料庫 (除非資料庫中已存在合併發行集)。 如需系統資料表的完整清單,請參閱本文中的「在發行集和訂用帳戶資料庫中建立的系統資料表」一節。

  • sp_addmergepublication

    • 發佈條目會新增至系統表格。
  • sp_addpublication_snapshot

    • 快照代理程式作業會新增至 SQL Server 代理程式系統。 工作名稱的格式為 <Publisher>-<PublicationDatabase>-<Publication>-<Integer>
  • sp_addmergearticle

    • 每個複製的物件都會標記為複製。 除非從所有出版物中刪除相應的文章,否則無法刪除該對象。

    • 每篇文章的條目都會添加到系統表中。

發行項目資料庫初始化的其餘部分會在發行項目的 Snapshot 代理程式初始執行期間發生。 發行集資料庫不會在 Snapshot Agent 的後續執行期間重新初始化。 如果您使用 [新增發行集精靈],預設會在您完成向導之後建立初始快照。 如果您使用預存程序,則必須執行代理程式工作或直接執行代理程式。 如需執行代理程式的詳細資訊,請參閱 啟動和停止複寫代理程式 (SQL Server Management Studio)複寫代理程式可執行檔概念。

當一個發行物的快照代理程式第一次執行時:

  • 每個已發佈的資料表都會新增一個名為 rowguid 的資料行,除非資料表已有一個資料類型為 uniqueidentifier 且已設定屬性 ROWGUIDCOL 的資料行(在此情況下,將使用此資料行)。 該 rowguid 欄用於唯一識別每個已發佈表格中的每一列。 如果從發行項目中刪除資料表,將會移除 rowguid 欄;如果使用現有的欄進行追蹤,則不會移除該欄。

  • 下列物件會在發行資料庫中針對每個已發佈表格建立(所有物件都會在 dbo 模式中建立):

    • 插入觸發程序、更新觸發程序和刪除觸發程序會新增至已發佈的資料表,以追蹤變更。 觸發器會以MSmerge_ins_<GUID>MSmerge_upd_<GUID>MSmerge_del_<GUID>的形式命名。 GUID 值是從系統資料表 sysmergearticles 中的文章條目衍生而來的。

    • 建立預存程序是為了處理已發佈資料表的插入、更新和刪除,以及執行數個其他與複寫相關的作業。

    • 建立視圖是為了管理插入、更新、刪除和過濾。

    • 建立衝突表格是為了儲存衝突資訊。 衝突資料表會符合已發佈資料表的結構描述:每個已發佈的資料表都會編寫腳本,然後使用該腳本來在發佈資料庫中建立衝突資料表。 衝突表格的名稱為dbo.MSmerge_conflict_<Publication>_<Article>的形式。

每次執行快照代理程式時,都會為發行集資料庫中的每個文章建立下列類型的檔案 (及其對應的副檔名):

  • 架構(.sch

  • 條件約束和索引 (.dri

  • 觸發器 (.trg

  • 系統表格資料 (.sys

  • 衝突表(.cft

  • 資料.bcp:不會針對使用參數化篩選器的發布物建立。

    如果未使用任何參數化篩選,快照會包含一組 .bcp 檔案中已發佈資料表的資料。 如果發行集使用參數化篩選 (這是合併發行集的典型做法),則初始快照集不會包含任何資料。 資料是透過訂閱者分割區的快照來提供,接下來的部分將會討論這一點。

初始化訂閱

當訂用帳戶的合併代理程式執行並將初始快照集複製到訂用帳戶資料庫時,每個訂用帳戶都會初始化。 除了複寫物件的結構描述和資料之外,快照還包含發行資料庫中現有的系統資料表、檢視表、觸發程式和預存程序。 一兩個額外的系統表格也會複製到訂閱資料庫。 如需系統資料表的完整清單,請參閱本文的 發行集和訂用帳戶資料庫中建立的系統資料表 一節。 如果重新初始化訂閱,則會覆寫所有的複製物件及複製系統物件。

如果發行集資料庫中沒有任何資料表使用參數化篩選,則會將相同的發行集快照集複製到每個訂閱者。 如果使用一或多個參數化篩選器,則每個訂用帳戶的初始化方式會由下列邏輯控管:

  • 如果快照集位置已在命令列上提供給合併代理程式:

    • 從此位置套用快照。
  • 如果快照已經預生成:

    • MSmerge_dynamic_snapshots 發行集資料庫中取得快照的位置,並從該位置套用快照。
  • 否則,如果文件允許訂閱者建立快照:

    • 如果已為具有相同分割區的另一個訂閱者產生快照集,請將該快照集套用至訂閱者。

    • 否則,生成快照並將其應用到訂閱者。

  • 否則,使用針對發行集中資料表的陳述式來 SELECT 初始化訂閱者。 此方法比起對訂閱者分割區使用快照更慢。

如果快照傳輸在任何時候中斷,它會自動恢復,並且不會重新傳送任何已完全傳輸的檔案。 快照代理程式的傳遞單位是每個發行文章的 bcp 檔案,因此,部分傳遞的檔案必須完整重新傳遞。 不過,恢復快照可以大幅減少傳輸的數據量,並確保即使連線不可靠,快照也能及時傳遞。 如需有關建立快照的詳細資訊,請參閱參數 化篩選器 - 參數化列篩選器

快照位置

快照位置取決於:為預設或替代快照位置指定的路徑;發行集是否針對快照集資料夾使用 UNC 路徑或 FTP 共用;以及出版物是否使用參數化過濾器。 在這些範例中,假設快照資料夾位置為: \\<MyComputer>\<MyFolder>

  • 如果發行集使用 UNC,則路徑的第一部分為: \\<MyComputer>\<MyFolder>\unc\。 如果它使用 FTP,則為 \\<MyComputer>\<MyFolder>\ftp\

  • 如果發行集使用 UNC 且未使用參數化篩選,則路徑為\\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication>

  • 如果發行集使用 UNC 並使用參數化篩選,則位置會以快照集資料夾路徑和發行集的參數化資料列篩選準則為基礎。 例如,如果使用 HOST_NAME() 函數篩選文章,且分區的值 HOST_NAME()SalesLaptop,則該分區的快照集路徑為 \\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication>\SalesLaptop_12,其中 12 是分區內部使用的識別碼。

在發行集和訂閱資料庫中建立的系統表格

下列資料表會在發行集資料庫和每個訂用帳戶資料庫中建立。

說明
MS動態快照工作 包含關於使用參數化篩選器的發佈快照作業的信息。
MSdynamicsnapshot視圖 追蹤 Snapshot Agent 所建立的所有暫時性快照檢視。 系統會使用它來清理視圖,以防 SQL Server 代理程式和快照集代理程式異常關閉。
MSmerge_altsyncpartners 追蹤發行者當前的同步夥伴關係。
MSmerge_articlehistory 追蹤在合併代理程式同步處理階段期間對文章所做的變更,每個進行變更的文章都有一列。
MSmerge_conflicts_info 追蹤同步訂閱至合併發行集時發生的衝突。
MSmerge_contents 自資料庫發佈後,現有資料庫中每個被修改的列都包含一個記錄。 合併程序會使用此表格來判斷已變更的資料列。
MSmerge_current_partition_mappings 每一個指定變更資料列所屬的分割區皆包含一列。
MSmerge_dynamic_snapshots 追蹤為合併發行集所定義的每個分割區的快照位置。
MSmerge_errorlineage 包含已在訂閱者刪除的資料列,但其刪除不會傳播至發行者。
MSmerge_generation_partition_mappings 追蹤指定的世代是否包含與指定分割區相關的任何變更。
MSmerge_genhistory 每代包含一列。 世代是傳遞至發行者或訂閱者的變更集合。 每次執行合併代理程式時,都會 關閉 世代;資料庫中的後續變更會新增至一或多個 開啟世代
MSmerge_history 包含歷史資料列,內含先前合併代理程式作業階段結果的詳細描述。
MSmerge_identity_range 追蹤指派給身分識別欄的數值範圍,以取得複寫會自動管理範圍指派之發行集的訂閱。
MSmerge_metadataaction_request 針對每個所需的補償動作各包含一列。 如果在另一個節點上的變更失敗,則可以使用補償動作來回復在某一節點的變更。
MSmerge_partition_groups 包含給定資料庫中每個預先計算分割區的一列。
MSmerge_past_partition_mappings 包含一列資料,對於每個已更改資料列曾經屬於但不再屬於的分割區。
MSmerge_replinfo 每個訂閱包含一列。 此表格追蹤有關傳送與接收世代的內部資訊。
MSmerge_sessions 包含歷史資料列,其中包含先前合併代理程式工作階段的結果。
MSmerge_settingshistory (合併設置歷史) 包含對文章和發行內容所做的變更歷程記錄,每個變更都有一列。
MSmerge_tombstone 包含已刪除資料列的相關資訊,並允許將刪除內容傳播至其他訂閱者。
MSrepl_errors 包含任何代理程式失敗的詳細資訊。
sysmergearticles 包含每個合併項目的資料列。
sysmergepartitioninfo 包含每篇文章分區的相關資訊,每篇文章對應一列。
SysmergePartitionInfoView 包含表格文章的分割資訊。
sysmergepublications 每個合併發行集包含一列。
sysmergeschema資料表 追蹤僅限結構描述的文章,例如預存程序。
sysmergeschemachange 包含快照代理程式所產生之已發佈文章的相關資訊。
sysmergesubscriptions 每列包含一位訂閱者的資料。
sysmergesubset篩選器 包含分割項目的聯結篩選資訊。

此外,MSsnapshotdeliveryprogress 資料表會在每個訂閱資料庫中建立,而 MSsubscription_properties 資料表會在每個使用提取訂閱的訂閱資料庫中建立。

說明
MSsnapshotdelivery進度 追蹤在套用快照時成功傳送到訂閱者的檔案。 此資料可用來繼續傳遞檔案,以防合併代理程式無法在工作階段期間傳遞所有檔案。
MSsubscription_properties 包含在訂閱者上執行複寫代理程式所需的參數資訊