近期发现数据服务器中数据库所在盘被占用的特别严重,一个800G的盘只剩下不到100G,排除备份所占用的其他的空间竟然有400G被安装目录下的分发数据库distribution.MDF所占用。

分发数据库distribution.MDF因为SQL代理“ 分发清除: distribution”停止了导致分发数据库的数据一直不能被清除。

问题找到了下面就是如何把分发数据库中数据给清除了。

先看一下清理前惨状

查询占用情况的SQL(这段SQL是从网上查到的,忘从哪复制的,感谢广大的DBA)

use distribution;
GO
select top 10 a.tablename,a.SCHEMANAME,sum(a.TotalSpaceMB) TotalSpaceMB,sum(a.RowCounts) RowCounts
from (
SELECT
t.NAME AS TableName,
s.Name AS SchemaName,
p.rows AS RowCounts,
SUM(a.total_pages) * 8 AS TotalSpaceKB,
CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
SUM(a.used_pages) * 8 AS UsedSpaceKB,
CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN
sys.schemas s ON t.schema_id = s.schema_id
GROUP BY
t.Name, s.Name, p.Rows) a
GROUP BY a.tablename,a.SCHEMANAME
order by sum(a.TotalSpaceMB) desc

可见上图中的总行数,达到了惊人的7亿条,占用空间400G

接下来就是如何清理了

方案1:执行EXEC dbo.sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 72,结果等了2个小时无任何效果(这种情况下就比较数据量少的情况)无奈放弃

方案2:通过Delete Top(500000) MSrepl_commands 与MSrepl_transactions 每次删除50万条数据,这个方案是有效果,但是分发数据库的日志也会不断增大,果断放弃了

方案3(最终成功的方案):通过TRUNCATE TABLE语句实现数据删除,这个也是最终成功的方案

在执行TRUNCATE TABLE MSrepl_commands 与TRUNCATE TABLE MSrepl_transactions前为了不让其他进程占用分发数据库可以通过”查看日志读取器代理状态“先停止日志往MSrepl_commands 的写入

需要说明的是在MSrepl_transactions有3千万条数据执行时间不到1秒

MSrepl_commands 表因为数据量大太执行的时间达到5分钟之多,强调如果数据量大要耐心等待。

到了此时我以为已经万事大吉了,但是想多了,真正完成还需要继续完成下面的步骤

首先我发现空间没有减少,什么原因呢:分发数据库没有回收,  执行完TRUNCATE后一定要回收一下数据库,通过命令或菜单操作均可。

其次在订阅服务器中发现查看同步状态不能启动代理,会提示:进程无法在“CRM-XXX”上执行“sp_repldone/sp_replcounters”

可以执行  EXEC sp_repldone @xactid =NULL, @xact_segno =NULL, @numtrans = 0, @time =0, @reset =1; EXEC sp_replflush然后重启一下SQL服务

如果发现还会有错误提示,如订阅服务器提示数据不一致查询不到等问题可以重新发布一下,在订阅中重新初始化

具体操作:在本地发布中找到发布的事务,右击选择”重新初始化所有订阅“,完成重新发布订阅

到这里就完成了分发服务器中表MSrepl_commands和表MSrepl_transactions的清理工作。

但是订阅服务器重新初始化后会发现非聚集索引不见了,我是这样解决的,先在分发库中找到所有自定义的索引,然后再订阅数据中执行一遍

查询所有自定义索引的SQL如下,因为我建的索引都是以index开头的,其他有需要可以自己修改一下

SELECT idx.name 索引名称,obj.name 表名,col.name 索引字段名
,'create index '+idx.name +' on '+obj.name +'('+col.name +')'+';' 创建索引语句
FROM sysindexes idx
JOIN sysindexkeys idxkey ON idx.id=idxkey.id AND idx.indid=idxkey.indid
JOIN sysobjects obj ON idxkey.id=obj.id
JOIN syscolumns col ON idxkey.id=col.id AND idxkey.colid=col.colid
WHERE idx.indid NOT IN(0,255) AND idx.name LIKE 'index%' AND obj.xtype='U'
--AND obj.name='sms_saleorder' --查指定表
ORDER BY obj.name,idx.name,col.name

以上是我遇到的问题及解决方法,记录一下,如果有类似情况的朋友可以参考,希望帮到您

发布订阅清理distribution未执行导致distribution库特别大处理办法的更多相关文章

  1. 使用EventBus + Redis发布订阅模式提升业务执行性能

    前言 最近一直奔波于面试,面了几家公司的研发.有让我受益颇多的面试经验,也有让我感觉浪费时间的面试经历~因为疫情原因,最近宅在家里也没事,就想着使用Redis配合事件总线去实现下具体的业务. 需求 一 ...

  2. 使用EventBus + Redis发布订阅模式提升业务执行性能(下)

    前言 上一篇博客上已经实现了使用EventBus对具体事件行为的分发处理,某种程度上也算是基于事件驱动思想编程了.但是如上篇博客结尾处一样,我们源码的执行效率依然达不到心里预期.在下单流程里我们明显可 ...

  3. 我在生产项目里是如何使用Redis发布订阅的?(二)Java版代码实现(含源码)

    上篇文章讲了在实际项目里的哪些业务场景用到Redis发布订阅,这篇文章就讲一下,在Java中如何实现的. 图解代码结构 发布订阅的理论以及使用场景大家都已经有了大致了解了,但是怎么用代码实现发布订阅呢 ...

  4. jsp中一个标签两种方式绑定两个click事件导致未执行的问题

    近日,在开发过程中,写了一个标签 <li id="a1" onclick="doSomething()">...</li> 在js页面中 ...

  5. kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统

    一.kafka 简介 今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 ...

  6. 使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题

    最近给客户做了基于SQLServer的发布订阅的“读写分离”功能,但是某些表数据很大,经常发生某几条数据丢失的问题,导致订阅无法继续进行.但是每次发现问题重新做一次发布订阅又非常消耗时间,所以还得根据 ...

  7. Kafka(分布式发布-订阅消息系统)工作流程说明

    Kafka系统架构Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和 ...

  8. sqlserver 实时同步(发布订阅)

    配置发布订阅手册 不同版本须知:https://www.sqlmanager.net/en/articles/1548 向后兼容性:参考https://docs.microsoft.com/zh-cn ...

  9. sqlserver关于发布订阅replication_subscription的总结

    (转载)sqlserver关于发布订阅replication_subscription的总结 来自 “ ITPUB博客 ” ,原文地址:http://blog.itpub.net/30126024/v ...

  10. MS SQL 2008 发布订阅配置错误总结

          最近在配置SQL 2008的发布订阅功能时,遇到了几个小错误,顺便归纳总结一下(以后碰到各类关于发布订阅的错误都将收录.更新到这篇文章),方便自己在以后碰到这类问题时,能够迅速解决问题.毕 ...

随机推荐

  1. R7-1 字符排队

    R7-1 字符排队 分数 15 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 本题要求编写程序,将给定字符串中的字符,按照ASCII码顺序从小到大排序后输出. 输入格式: 输入是一个以回车结 ...

  2. win10 右键添加cmd当前目录打开

    新建.txt粘贴以下命令保存修改扩展名为.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\Ope ...

  3. [JSOI2015]圈地

    原题链接:P6094 [JSOI2015]圈地 题意简述 把一块 \(n \times m\) 的地分给两个人,选择分出第 \(i\) 行第 \(j\) 列的地可以获得 \(a_{i,j}\) 的收益 ...

  4. Codeforces Global Round 17 - D. Not Quite Lee

    裴蜀定理 + lowbit Problem - D - Codeforces 题意 定义一个包含 \(m\) 个元素的数组 \(b\) 是好的,当且仅当满足以下两个条件 对于 \(b[i]\), 存在 ...

  5. WPF实现一个简单自定义管道

    先看效果  xaml代码 <UserControl x:Class="WPF控件测试.Control.Pipeline" xmlns="http://schemas ...

  6. TODOList小黄条

    TODOList http://www.yynote.cn/ 总结 windows中的神器

  7. 小米手机MIUI12获取hci.log的方法记录

    按照之前的方式,开发者选项打开获取蓝牙HCI的log开关,但是在本地一直找不到log. 在网上查了很久资料,终于找到有用的方法了.记录一下. 感谢大佬 https://www.jianshu.com/ ...

  8. iOS 扩展与分类的区别

    1.分类 category 分类的作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法 分类也能使用@property 添加属性 [通过runtime 关联对 ...

  9. Taro3 扫描不同二维码参数不同,但是热启动之后参数不变 根据环境不同更换域名

    热启动:先执行缓存的静态数据,然后再执行页面代码.比如右上角退出或者按home键错误用法:用的Taro3 react function函数,之前用的  Taro.getLaunchOptionsSyn ...

  10. liveview能设定开机最小化到托盘吗 对liveview 3.5.2的建议

    liveview能设定开机最小化到托盘吗?[建议]      能不能添加上面的功能,最好能开机自动录制       目前我的版本是3.5.2   建议增加功能   1.开机最化到托盘   2.开机自动 ...