sql server distribution 庫資料檔案過大
阿新 • • 發佈:2021-10-27
原因分析
distribution庫過大原因在於MSrepl_commands,MSrepl_transactions沒有進行有效清理
解決方法一
修改sp_MSdelete_dodelete及sp_MSdelete_publisherdb_trans兩個儲存過程,在刪除時迴圈部份進行刪除
分別將DELETE TOP(2000) MSrepl_commands 和 delete TOP(5000) MSrepl_transactions 的top數量調大到合適的數量級
,需要注意同時要修改判斷條件
修改完成後,執行
use distribution; EXEC dbo.sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 72
或者執行清除作業,在執行清除作業時,注意看一下歷史記錄,是否執行成功,執行成功後,對DB進行收縮。
解決方法二
distribution庫已經上T,或大得刪除時需要耗費大量時間時,採用此法:
1、在複製管理器裡,停止所有的log reader代理
2、將事務分發到訂閱端,可以使用以下查詢未分發的命令數
With MaxXact (ServerName, PublisherDBID, XactSeqNo) As (Select S.name, DA.publisher_database_id, max(H.xact_seqno) From distribution.dbo.MSdistribution_history H with(nolock) Inner Join distribution.dbo.MSdistribution_agents DA with(nolock) On DA.id = H.agent_id Inner Join master.sys.servers S with(nolock) On S.server_id = DA.subscriber_id Group By S.name, DA.publisher_database_id) Select MX.ServerName, MX.PublisherDBID, COUNT(*) As CommandsNotReplicated From distribution.dbo.MSrepl_commands C with(nolock) Right Join MaxXact MX On MX.XactSeqNo < C.xact_seqno And MX.PublisherDBID = C.publisher_database_id Group By MX.ServerName, MX.PublisherDBID;
當剩餘命令為1時,再雙擊任務檢視未分發命令,如果為0時,執行
3、執行 TRUNCATE TABLE distribution.dbo.MSrepl_commands
4、然後啟動log reader代理
5、最後,執行完後,對DB進行收縮。