近期发现数据服务器中数据库所在盘被占用的特别严重,一个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. vi 快捷键/ctags

    vi 配置 syntax enableset nu set relativenumberset hlsearch set autoindentset shiftwidth=4set tabstop=4 ...

  2. QML调用C++程序

    QML调用C++程序 1. 添加C++,MouseMemory文件(.h,.cpp) 2. 在main.cpp文件添加, qmlRegisterType<MouseMemory>(&quo ...

  3. db2入门必看命令清单--日常运维必需

    关注 推荐 嘉兴 视频 财经 科技 热点 国际 更多   搜索 34 消息 发布     5   2   收藏 分享 db2入门必看命令清单--日常运维必需 https://www.toutiao.c ...

  4. fix: because the volume group on the selected device also consist of physical volumes on other devices

    because the volume group on the selected device also consist of physical volumes on other devices 目标 ...

  5. 使用supervisor 管理 laravel 框架中的进程

    前言:在laravel中,经常要在项目根目录下执行 php artisan queue:work  来执行队列中的任务,由此,我们想到用supervisor来管理这个进程 Supervisor是用Py ...

  6. 部分jdk网盘链接

    链接:https://pan.baidu.com/s/1Nw84qVRL3Buarh2LY1lWEg 提取码:6q2z 含 6u45 7u80 8u202 11.0.X 的win及linux版 没有网 ...

  7. mybatis原理探究

    jdbc数据库运行流程: JDBC有哪三种statement接口: Statement 1.Statement接口提供了执行语句和获取结果的基本方法: 2.Statement继承自Wrapper:3. ...

  8. viewpager加fragment可滑动加radio跟随滑动

    public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, V ...

  9. PLSQL中文乱码问题(显示问号)解决办法

    select userenv('language') from dual; 在环境变量的系统变量中添加配置: NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK 这个 ...

  10. js转换文件的size由KB转换为B、MB、GB

    // 单位转换export function bytesToSize(sizes) { let mYsize = sizes if(mYsize == 0) return 0 + 'B'; if(mY ...