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

合併式複寫必須在資料可於「發行者」和「訂閱者」之間流動前對兩者進行初始化。本主題提供初始化期間發生步驟的相關資訊。

初始化發行集

下列清單詳細說明了發行集的初始化步驟,此發生於列出的每個預存程序執行時或「新增發行集精靈」完成之後。進一步的初始化發生在第一次為發行集執行快照集代理程式之後。

  • sp_replicationdboption

    • 發行集資料庫標示為複寫。無法卸除資料庫,除非複寫已移除。

    • 系統資料表會加入到發行集資料庫中 (除非該資料庫中已存在合併式發行集)。如需系統資料表的完整清單,請參閱此主題中的「發行集與訂閱資料庫中建立的系統資料表」一節。

  • sp_addmergepublication

    • 發行集項目會加入到系統資料表。
  • sp_addpublication_snapshot

    • 「快照集代理程式」作業會加入到 SQL Server Agent 系統。作業名稱格式為**<Publisher>-<PublicationDatabase>-<Publication>-<Integer>**。
  • sp_addmergearticle

    • 每一個已複寫物件將標示為複寫。無法刪除物件,除非對應的發行項從所有的訂閱中卸除。

    • 每一個發行項的項目會加入到系統資料表。

對發行集資料庫初始化的其他部份會在發行集的「快照集代理程式」初始執行期間發生 (「快照集代理程式」後續執行期間,不會對該發行集資料庫重新初始化)。如果您使用「新增發行集精靈」,依預設,在完成此精靈之後會建立初始快照集。如果您使用預存程序,則必須執行代理程式作業或直接執行代理程式。如需有關執行代理程式的資訊,請參閱<如何:啟動和停止複寫代理程式 (SQL Server Management Studio)>和<複寫代理程式可執行檔概念>。

第一次執行發行集的「快照集代理程式」時:

  • 名稱為 rowguid 的資料行會加入到每個已發行的資料表中,除非該資料表中已含有設定了 ROWGUIDCOL 屬性之資料類型 uniqueidentifier 的資料行 (在此狀況下會使用此資料行)。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 是資料分割內部使用的 ID。

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

在發行集資料庫和每個訂閱資料庫中建立下列資料表。

資料表

描述

MSdynamicsnapshotjobs (Transact-SQL)

包含具有參數化篩選之發行集的快照集作業資訊。

MSdynamicsnapshotviews (Transact-SQL)

追蹤由「快照集代理程式」建立的所有暫存快照集檢視。系統用它來清除 SQL Server Agent 或「快照集代理程式」異常關機情況下的檢視。

MSmerge_altsyncpartners (Transact-SQL)

追蹤「發行者」和目前同步夥伴的關聯。

MSmerge_articlehistory (Transact-SQL)

在「合併代理程式」同步處理工作階段期間追蹤對發行項所作的變更,每個作過此變更的發行項具有一個資料列。

MSmerge_conflicts_info (Transact-SQL)

追蹤針對合併式發行集同步處理訂閱時發生的衝突。

MSmerge_contents (Transact-SQL)

包含自目前資料庫發行以來,每個已修改資料列的一個資料列。合併處理使用這個資料表來決定已變更的資料列。

MSmerge_current_partition_mappings

包含給定的已變更資料列所屬之每一個資料分割的一個資料列。

MSmerge_dynamic_snapshots (Transact-SQL)

追蹤針對合併式發行集定義的每一個資料分割的快照集位置。

MSmerge_errorlineage (Transact-SQL)

包含在「訂閱者」端已經刪除,但此刪除未傳播到「發行者」的資料列。

MSmerge_generation_partition_mappings (Transact-SQL)

追蹤給定的層代是否包含任何與給定之資料分割相關的變更。

MSmerge_genhistory (Transact-SQL)

包含每個層代的一個資料列。生成集是傳遞至發行者或訂閱者的變更集合。每次執行合併代理程式,都會關閉生成集。資料庫的後續變更會加入一或多個開啟生成集

MSmerge_history (Transact-SQL)

包含記錄資料列,其含有前一個「合併代理程式」作業工作階段之結果的詳細描述。

MSmerge_identity_range (Transact-SQL)

追蹤指派給發行集之訂閱識別欄位的數值範圍,複寫自動管理此發行集的範圍指派。

MSmerge_metadataaction_request (Transact-SQL)

包含所需每個補償動作的一個資料列。補償動作用來在某個節點上回復變更 (如果變更在另一個節點上失敗)。

MSmerge_partition_groups (Transact-SQL)

包含給定資料庫中每個預先計算之資料分割的一個資料列。

MSmerge_past_partition_mappings (Transact-SQL)

包含給定已變更資料列曾經屬於 (卻不再屬於) 之每個資料分割的一個資料列。

MSmerge_replinfo (Transact-SQL)

包含每個訂閱的一個資料列。此資料表會追蹤已傳送和已收到之層代的內部資訊。

MSmerge_sessions (Transact-SQL)

包含具有前一個「合併代理程式」作業工作階段之結果的記錄資料列。

MSmerge_settingshistory (Transact-SQL)

包含對發行項和發行集屬性所作之變更的記錄,每個所作的變更都有一個資料列。

MSmerge_tombstone (Transact-SQL)

包含已刪除資料列的資訊並允許將刪除傳播到其他「訂閱者」。

MSrepl_errors (Transact-SQL)

包含任何代理程式失敗的詳細資訊。

sysmergearticles (Transact-SQL)

包含每個合併發行項的一個資料列。

sysmergepartitioninfo (Transact-SQL)

包含每個發行項之資料分割的資訊,每個發行項都有一個資料列。

sysmergepartitioninfoview (Transact-SQL)

包含資料表發行項的資料分割資訊。

sysmergepublications (Transact-SQL)

包含每個合併式發行集的一個資料列。

sysmergeschemaarticles (Transact-SQL)

追蹤僅限結構描述的發行項,例如預存程序。

sysmergeschemachange (Transact-SQL)

包含由「快照代理程式」已發行之發行項的資訊。

sysmergesubscriptions (Transact-SQL)

包含每個「訂閱者」的一個資料列。

sysmergesubsetfilters (Transact-SQL)

包含分割發行項之聯結篩選條件的資訊。

此外,MSsnapshotdeliveryprogress 資料表建立於每一個訂閱資料庫中,MSsubscription_properties 資料表建立於使用提取訂閱的每個訂閱資料庫中:

資料表

描述

MSsnapshotdeliveryprogress (Transact-SQL)

追蹤套用快照集且已成功傳遞到「訂閱者」的檔案。「合併代理程式」無法在工作階段期間傳遞所有檔案的情況下,就會使用此資料來繼續傳遞檔案。

MSsubscription_properties (Transact-SQL)

包含在「訂閱者」端執行複寫代理程式所需的參數資訊