快照式複寫

適用於:SQL ServerAzure SQL 受控執行個體

快照式複寫可以精確地將資料以其特定時點的樣子散發出去,且不監視此資料的更新。 在進行同步處理的時候,會產生整個快照集並傳送至「訂閱者」。

注意

快照集複寫可以自行使用,但一般同時使用快照集處理 (它可建立所有發行集指定的物件和資料的副本) 以提供用於交易式發行集和合併式發行集的初始資料與資料庫物件集合。

若下列一或多項敘述為真,則最適合單獨使用快照式複寫:

  • 較少變更資料。

  • 可接受已過時的發行者相關資料副本放置一段時間。

  • 複寫小量資料時。

  • 在短時間內發生大量變更。

資料變更數量可觀但次數不頻繁時,最適合快照式複寫。 例如,某個銷售單位維護一個產品價格表,其中所有價格在一年當中會同時更新一至二次,建議您在變更後複寫整個資料的快照集。 指定類型的資料,也可能適合更頻繁的快照集。 例如,如果在白天更新「發行者」端的相對較小的資料表,但有一些延遲可以接受,則變更可以作為快照集每夜傳遞。

快照式複寫相對於異動複寫,其在「發行者」上的連續性負擔更低,因為它不追蹤累加的變更。 但是,如果複寫的資料集變得很大,它將需要大量資源來產生和套用快照集。 在評估是否使用快照式複寫時,請考慮整個資料集的大小和對資料進行變更的頻率。

本主題內容

快照式複寫如何運作

快照集代理程式

散發與合併代理程式

快照式複寫如何運作

依預設,三種類型的複寫均使用快照集來初始化「訂閱者」。 「SQL Server 快照集代理程式」總是會產生快照集檔案,但是根據所使用的複寫類型,傳遞檔案的代理程式有所不同。 快照式複寫和異動複寫使用「散發代理程式」傳遞檔案,而合併式複寫則使用「SQL Server 合併代理程式」。 快照集代理程式於發行者端執行。 「散發代理程式」和「合併代理程式」則在發送訂閱的「散發者」端或提取訂閱的「訂閱者」端執行。

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

除了本主題中描述的標準快照集處理之外,兩段式快照集處理還可以用於含參數化篩選的合併式發行集。

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

Snapshot replication components and data flow

快照集代理程式

針對合併式複寫,每次執行快照集代理程式都會產生快照集。 針對異動複寫,是否產生快照集是依照發行集屬性 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中指定的位置將快照集檔案套用至訂閱資料庫。