1. 程式人生 > 其它 >sql server distribution 庫資料檔案過大

sql server distribution 庫資料檔案過大

原因分析

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進行收縮。