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

posted @   littlewrong  阅读(745)  评论(0编辑  收藏  举报
编辑推荐:
· 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代理 了,记录一下
点击右上角即可分享
微信分享提示