擷取作業
擷取作業是透過執行無參數的預存程序 sp_MScdc_capture_job 起始的。這個預存程序一開始會從 msdb.dbo.cdc_jobs 中擷取擷取作業之 maxtrans、maxscans、continuous 和 pollinginterval 的設定值。然後,這些設定值會當做參數傳遞給 sp_cdc_scan 預存程序。這個預存程序是用來叫用 sp_replcmds,以便執行記錄檔掃描。
擷取作業參數
若要瞭解擷取作業行為,您必須瞭解 sp_cdc_scan 如何使用可設定的參數。
maxtrans 參數
maxtrans 參數會指定可以在記錄檔之單一掃描循環中處理的最大交易數目。在掃描期間,如果要處理的交易數目達到這個限制,目前的掃描就不會加入其他任何交易。在掃描循環完成之後,已處理的交易數目一定會小於或等於 maxtrans。
maxscans 參數
maxscans 參數會指定傳回 (continuous = 0) 或執行 Waitfor (continuous = 1) 之前嘗試清空記錄檔的最大掃描循環數目。
continous 參數
continuous 參數會控制 sp_cdc_scan 在清空記錄檔或執行最大掃描循環數目 (一次模式) 之後讓出控制權。它也會控制 sp_cdc_scan 是否繼續執行,直到明確停止為止 (連續模式)。
一次模式
在一次模式中,擷取作業會要求 sp_cdc_scan 執行最多 maxtrans 次掃描,以便嘗試清空記錄檔並傳回。存在記錄檔中 maxtrans 以外的任何交易將在後續掃描中處理。
一次模式會用於受到控制的測試中,因為已知要處理的交易數量,而且作業完成時自動關閉具有一些優點。不建議您在實際執行環境中使用一次模式。這是因為它會仰賴作業排程來管理執行掃描循環的頻率。
在一次模式中執行時,您可以使用下列計算來計算擷取作業之預期輸送量的上限 (以每秒交易數表示):
(maxtrans * maxscans) / number of seconds between scans
即使掃描記錄檔和擴展變更資料表所需的時間並未與 0 完全不同,此作業的平均輸送量仍無法超過將單一掃描允許的最大交易數乘以允許的最大掃描數再除以分隔記錄檔處理的秒數所取得的值。
如果您使用一次模式來管理記錄檔掃描,記錄檔處理之間的秒數就必須受到作業排程的管制。需要這種行為時,在連續模式中執行擷取作業是管理重新排程記錄檔掃描的較佳方式。
連續模式和輪詢間隔
在連續模式中,擷取作業會要求 sp_cdc_scan 連續執行。這會透過提供 maxtrans 和 maxscans,以及記錄檔處理之間秒數的值 (輪詢間隔),讓此預存程序管理自己的等候迴圈。在這種模式中執行時,擷取作業會維持使用中,並且在記錄檔掃描之間執行 WAITFOR。
[!附註]
當輪詢間隔的值大於 0 時,重複執行一次作業之輸送量的相同上限也會套用至連續模式中的作業。也就是說,(maxtrans * maxscans) 除以非零的輪詢間隔會針對擷取作業可以處理的平均交易數目放置上限。
擷取作業自訂
您可以針對擷取作業套用其他邏輯,以便決定新的掃描是否會立即開始,或者在啟動新的掃描之前是否加上休眠,而非仰賴固定的輪詢間隔。這項選擇可能僅僅依據當天時間,或許在尖峰活動時段強制執行非常長的休眠,甚至在當天結束時移至輪詢間隔 0 (如果完成日間處理和準備夜間執行很重要的話)。您也可以監視擷取處理序進度,以便判斷午夜之前認可之所有交易已經掃描並儲放在變更資料表中的時間。這會讓擷取作業結束,以便依據排程的每日重新啟動時間重新啟動。透過將呼叫 sp_cdc_scan 的傳遞作業步驟取代成 sp_cdc_scan 之使用者撰寫包裝函式的呼叫,您只要進行少數額外步驟就可以取得高度自訂的行為。