distribution數據庫過大問題


從事件探查器中監控到如下語句執行時間查過 1分鍾:

EXEC dbo .sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 72

該存儲過程被“ 分發清除:分發 ”作業每10 分鍾調用一次,用戶 從分發數據庫中刪除復制的事務。 停用在最大分發保持期內尚未同步的訂閱。

該存儲過程主要是刪除 MSrepl_commands和MSrepl_transactions 兩個表過期數據

查詢數據庫以及這兩個表的數據

Image[16]

可以看到 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萬數據能夠刪除有一個小時內的數據,而且可以防止有激增數據情況。

Image(1)[4]


解決方案:

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小時執行一次。

Image(2)[4]

Image(3)[4]

3、總體上每小時的記錄數還是很多,所以需要一次減少保留的時間。根據需求,我改為了 36小時

Image(4)[4]

編輯步驟,將 72改成36

Image(5)[4]

4、第一次建議手工執行刪除,並收縮表空間

執行 EXEC dbo .sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 36

Image(6)[4]

執行DBCC SHRINKDATABASE ( '數據庫' )收縮數據庫,收縮后,數據庫大小減小為原來一半

Image(7)[4]

 

建議將replicate的恢復模式改為簡單,並且開啟自動收縮功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM