共用方式為


快照式複寫

適用於:SQL Server Azure SQL 受控執行個體

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

注意

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

若下列一或多個案例為真,最適合單獨使用快照式複寫:

  • 較少變更資料。
  • 已過時一段時間的發行者相關資料副本。
  • 複寫小量資料時。
  • 在短時間內發生大量變更。

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

相較於異動複寫,快照式複寫在發行者的連續額外負荷更低,因為未追蹤累加變更。 但是,如果複寫的資料集規模大,則需要大量資源才能產生及套用快照。 在評估是否使用快照式複寫時,請考慮整個資料集的大小和對資料進行變更的頻率。

快照式複寫如何運作

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

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

除了本文描述的標準快照流程,合併含參數化篩選條件的出版使用兩段式快照流程。

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

快照式複寫元件和資料流程的螢幕擷取畫面。

快照集代理程式

針對合併式複寫,每次執行快照集代理程式都會產生快照集。 針對異動複寫,是否產生快照取決於出版屬性 immediate_sync 的設定。 若屬性設定為 true (使用新增出版精靈的預設),每次執行快照集代理程式都會產生快照,同時隨時可套用至訂閱者。 若屬性設定為 false (使用 sp_addpublication 時的預設),則只有在上次執行快照集代理程式後有加入新訂用帳戶的情況下,才會產生快照;訂閱者必須先等快照集代理程式完成,才能同步處理。

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

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

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

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

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

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

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

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

    針對合併出版,快照集代理程式會執行額外步驟。

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

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

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

針對快照出版,每次為發行執行散發代理程式時,它都會將新快照移至下列情況的每個訂閱者:

  • 尚未同步處理、
  • 標示為重新初始化,或
  • 包含新發行項。

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

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

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

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

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

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

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

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