標籤:cas gravity replica == open 過程 sof 隊列 儲存
原文:SQLServer 使用sp_repldone標識所有未分發的事務為已分發
對於發行集資料庫的資料大量操作時,會使日誌掃描並讀取太多,會導致分發堵塞很久。也有一些解決方案,參考 《SqlServer 複製中將大事務分成小事務分發》 , 《SqlServer大量更新引起同步鏈延時問題》 。當然也可以使這些資料不分發,尤其是新表,資料尚未讓使用者使用,可以在日誌讀取器跳過掃描標識為 “複製” 的事務。
注: 以下類比操作,操作都在發行集資料庫執行!
1. 將佇列讀取器代理程式 -Continuous 去掉,使日誌讀取器不連續掃描交易記錄
2. 更新資料
3. 啟用日誌讀取器,資料正常同步到訂閱中
4. 再次更新資料,執行以下操作
將佇列讀取器代理程式 -Continuous 去掉的操作如下:
過程指令碼如下,不詳細說明:
-- 因為日誌讀取器停止,分發表還沒有剛才更新的記錄SELECT * FROM distribution.dbo.MSrepl_commandsSELECT * FROM distribution.dbo.MSrepl_transactions-- 但是交易記錄中標識為複製(REPLICATE) 的日誌增多了SELECT count(*) FROM ::fn_dblog(NULL, NULL) WHERE Description='REPLICATE'-- 查看最早的分布式和非分布式複製事務-- https://msdn.microsoft.com/zh-cn/library/ms182792.aspxDBCC OPENTRAN() WITH TABLERESULTS; REPL_DIST_OLD_LSN (535:23:10)REPL_NONDIST_OLD_LSN (535:26:1)-- 轉換上面的整數為16進位SELECT cast(cast(535 as int) as binary(4)) + cast(cast(23 as int) as binary(4)) + cast(cast(10 as int) as binary(2))SELECT cast(cast(535 as int) as binary(4)) + cast(cast(26 as int) as binary(4)) + cast(cast(1 as int) as binary(2))(534:2536:18) >>> 0x00000217:00000017:000A(534:2552:1) >>> 0x00000217:0000001A:0001-- 在交易記錄中的記錄select [Current LSN],[Operation],[Transaction ID],Left([Description],20)from::fn_dblog('0x00000217:00000017:000A','0x00000217:0000001A:0001') -- 將交易記錄中標識為複製的記錄全部標記為已分發,之後日誌讀取器將不掃描這些記錄-- ( 只有當 xactid 和 xact_seqno 都為 NULL 時,reset 才有效。)-- https://msdn.microsoft.com/zh-cn/library/ms173775.aspxexec sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1@reset = 1 則日誌中所有複製的事務將標記為已分發;@reset = 0 則交易記錄將重設為第一個複製的事務,事務將重新讀取和發布;-- 查看當前沒有分發的事務(保留在交易記錄中尚未發送到散發者的事務)-- https://msdn.microsoft.com/zh-cn/library/ms175114.aspxexec sp_replshowcmds-- 再查看開啟的事務,事務也不存在了dbcc opentran () with tableresults; -- 重新整理項目緩衝(為提高效率,項目定義儲存在緩衝中)-- https://msdn.microsoft.com/zh-cn/library/ms174992(v=sql.120).aspxexec sp_replflush-- 此時再次更新其他行資料,啟用記錄讀取器代理程式,該行資料能正常同步到訂閱;之前未同步的,則不會同步.
最後把 -Continuous 添加會日誌讀取器中!完成!(或者停止記錄讀取器代理程式也可以)
參考:Using sp_repldone to mark all pending transactions as having been Replicated
SQLServer 使用sp_repldone標識所有未分發的事務為已分發