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

原文地址:https://www.cnblogs.com/littlewrong/p/15469104.html