快照式複寫如何運作

依預設,三種類型的複寫均使用快照集來初始化「訂閱者」。「SQL Server 快照集代理程式」總是會產生快照集檔案,但是根據所使用的複寫類型,傳遞檔案的代理程式有所不同。快照式複寫和交易式複寫使用「散發代理程式」傳遞檔案,而合併式複寫則使用「SQL Server 合併代理程式」。快照集代理程式於發行者端執行。「散發代理程式」和「合併代理程式」則在發送訂閱的「散發者」端或提取訂閱的「訂閱者」端執行。如需有關提取訂閱的資訊,請參閱<訂閱發行集>。如需代理程式的詳細資訊,請參閱<複寫代理程式概觀>。

快照集的產生和套用可以在訂閱建立後立即進行,也可以在發行集建立時所排定的時間進行。「快照集代理程式」會準備包含已發行資料表與資料庫物件之結構描述及資料的快照集檔案,將檔案儲存在「發行者」的快照集資料夾內,然後追蹤「散發者」散發資料庫中的資訊。在設定「散發者」時指定預設快照集資料夾,但也可以為發行集指定預設位置以外的替代位置,或兩個位置均指定。如需詳細資訊,請參閱<替代快照集資料夾位置>。

[!附註]

除了本主題中描述的標準快照集處理之外,兩段式快照集處理還可以用於含參數化篩選的合併式發行集。如需詳細資訊,請參閱<含參數化篩選之合併式發行集的快照集>。

下圖顯示快照式複寫的主體元件。

快照式複寫元件和資料流程

快照集代理程式

針對合併式複寫,每次執行快照集代理程式都會產生快照集。針對交易式複寫,是否產生快照集是依照發行集屬性 immediate_sync 的設定而定。若屬性設定為 TRUE (使用新增發行集精靈的預設),每次執行快照集代理程式都會產生快照集,同時隨時可套用至訂閱者。若屬性設定為 FALSE (使用 sp_addpublication 時的預設),則只有在上次執行快照集代理程式後有加入新訂閱的情況下,才會產生快照集。訂閱者必須等待快照集代理程式完成,才能同步處理。

「快照集代理程式」會執行下列步驟:

  1. 建立從「散發者」到「發行者」的連接,然後在必要時鎖定已發行的資料表:

    • 針對合併式發行集,快照集代理程式未使用任何鎖定。

    • 對於交易式發行集,「快照集代理程式」依預設僅在快照集產生的初始階段進行鎖定。

    • 對於快照式發行集,在整個快照集產生處理過程中均保持鎖定。

  2. 將每個發行項的資料表結構描述副本寫入 .sch 檔案。如果已發行其他資料庫物件 (例如索引、條件約束、預存程序、檢視、使用者自訂函數等),則會產生其他指令碼檔案。

  3. 從「發行者」端的已發行資料表複製資料,並將其寫入快照集資料夾。快照集以一組大量複製程式 (BCP) 檔案的形式產生。

  4. 對於快照式和交易式發行集,「快照集代理程式」會附加資料列至散發資料庫中的 MSrepl_commandsMSrepl_transactions 資料表。MSrepl_commands 資料表中的項目為命令,表示 .sch 和 .bcp 檔案的位置、其他快照集檔案,以及對前快照集 (pre-snapshot) 或後快照集 (post-snapshot) 指令碼的參考。MSrepl_transactions 資料表中的項目是與同步處理「訂閱者」相關的命令。

    對於合併式發行集,「快照集代理程式」還執行其他步驟。如需詳細資訊,請參閱<合併式複寫如何初始化發行集和訂閱>。

  5. 釋放對已發行資料表的鎖定。

在快照集產生期間,無法對已發行的資料進行結構描述變更。快照集檔案產生之後,您可以使用 Windows Explorer 在快照集資料夾中檢視這些檔案。

散發代理程式與合併代理程式

對於快照式發行集,每次為發行集執行「散發代理程式」時,它都會將新快照集移至每個尚未同步處理但已標示要進行重新初始化的「訂閱者」,或包含新發行項。

對於快照式和交易式複寫,「散發代理程式」執行下列步驟:

  1. 建立與「散發者」的連接。

  2. 檢查「散發者」上散發資料庫中的 MSrepl_commandsMSrepl_transactions 資料表。代理程式會從第一個資料表中讀取快照集檔案的位置,並從兩個資料表中讀取「訂閱者」同步處理命令。

  3. 將結構描述與命令套用至訂閱資料庫上。

對於未篩選的合併式複寫資料集,「合併代理程式」執行下列步驟:

  1. 建立與「發行者」的連接。

  2. 檢查「散發者」上的 sysmergeschemachange 資料表,並判斷是否存在應在「訂閱者」端套用的新快照集。

  3. 如果存在新快照集,「合併代理程式」會從 sysmergeschemachange 中指定的位置將快照集檔案套用至訂閱資料庫。