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进行收缩。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下