天天看點

SqlServer 複制中将大事務分成小事務分發

在sql server 複制中,當在釋出資料庫執行1個大事務時,如一次性操作 十萬或百萬以上的資料。當操作資料在釋出資料庫執行完成後 ,日志讀取器代理将掃描事務日志,一次性傳遞到分發資料庫中。若上個事務未傳遞完成,連續執行多個事務,日志讀取器代理将掃描日志中多個事務同時傳遞到分發資料庫中,預設最大掃描500個事務。如果執行多次上百萬或千萬的資料将堵塞很久。

日志讀取器代理可配置将大事務劃分為多個小事務進行傳遞到分發資料庫中,分發隊列則按照小事務分發到訂閱資料庫中,這樣資料就很快同步!

在沒改代理參數之前,本人執行1次插入30萬的資料到釋出表中。插入完成後,監控釋出到分發的記錄如下:

SqlServer 複制中将大事務分成小事務分發

可以看到,這1個事務的指令都得一次傳遞完才能分發,而分發又消耗時間,這裡等待太久影響事務的實時性。

如果還有其他事務,預設500(參考參數:-ReadBatchSize),也将一起傳遞,耗時較長。

現在更改參數,掃描到 1000 左右的指令就即時分發,需要設定如下參數:

-MaxCmdsInTran number_of_commands

SqlServer 複制中将大事務分成小事務分發

注:該參數隻能添加到日志讀取器代理中,在代理配置檔案沒有此參數的設定。

添加後重新開機 日志讀取器代理。

再次插入 30 萬的資料!~到螢幕檢視

SqlServer 複制中将大事務分成小事務分發

可以看到,指令達到 1000 左右就進行分發了,此時檢視訂閱資料庫,資料也同步過來了,這樣就省去了較多掃描指令的時間。

更詳細檢視每個事務的指令數,如下:

SqlServer 複制中将大事務分成小事務分發

這個參數雖好,但是也可能引起資料的一緻性。

如:

 在釋出更新了一批資料,但是訂閱查詢時卻有不同。

分發事務遇到沖突或者死鎖,也導緻這部分的資料不一緻。

<a target="_blank" href="https://msdn.microsoft.com/zh-cn/library/ms146878(v=sql.100).aspx">參考:複制日志讀取器代理</a>