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进行收缩。