從事件探查器中監控到如下語句執行時間查過 1分鍾:
EXEC dbo .sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 72
該存儲過程被“ 分發清除:分發 ”作業每10 分鍾調用一次,用戶 從分發數據庫中刪除復制的事務。 停用在最大分發保持期內尚未同步的訂閱。
該存儲過程主要是刪除 MSrepl_commands和MSrepl_transactions 兩個表過期數據
查詢數據庫以及這兩個表的數據
可以看到 MSrepl_commands的數據庫的空間和數據庫空間幾乎一致,對其進行刪除是性能瓶頸所在。
查詢 MSrepl_commands表中未過期數據按照小時分組的命令數。
SELECT T.[publisher_database_id] ,datepart(mm,[entry_time]) 'month' , datepart(dd,[entry_time]) 'day' , datepart(hh,[entry_time]) 'hour' ,count(C.[xact_seqno]) 'count of commands' FROM [distribution].[dbo].[MSrepl_transactions](nolock) T JOIN [MSrepl_commands](nolock) C ON T.[xact_seqno] = C.[xact_seqno] GROUP BY T.[publisher_database_id] ,datepart(mm,[entry_time]) , datepart(dd,[entry_time]) , datepart(hh,[entry_time]) order by 1,2,3,4
從結果中看出,定義每次刪除 50萬數據能夠刪除有一個小時內的數據,而且可以防止有激增數據情況。
解決方案:
1、刪除MSrepl_commands 表的存儲過程是 sp_MSdelete_publisherdb_trans,刪除msrepl_transaction 表的存儲過程是 sp_MSdelete_dodelete
分別修改兩個存儲過程中刪除兩張表的語句:
DELETE TOP(2000) MSrepl_commands 改為DELETE TOP(500000) MSrepl_commands,兩處;delete TOP(5000) MSrepl_transactions 改為delete TOP(500000) MSrepl_transactions兩處
2、即使每次刪除的數據量很大,但 10分鍾執行的頻度還是太高,調整為 1小時執行一次。
3、總體上每小時的記錄數還是很多,所以需要一次減少保留的時間。根據需求,我改為了 36小時
編輯步驟,將 72改成36
4、第一次建議手工執行刪除,並收縮表空間
執行 EXEC dbo .sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 36
執行DBCC SHRINKDATABASE ( '數據庫' )收縮數據庫,收縮后,數據庫大小減小為原來一半
建議將replicate的恢復模式改為簡單,並且開啟自動收縮功能。