从事件探查器中监控到如下语句执行时间查过 1分钟:

EXEC dbo .sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 72

该存储过程被“ 分发清除:分发 ”作业每10 分钟调用一次,用户 从分发数据库中删除复制的事务。 停用在最大分发保持期内尚未同步的订阅。

该存储过程主要是删除 MSrepl_commands和MSrepl_transactions 两个表过期数据

查询数据库以及这两个表的数据

可以看到 MSrepl_commands的数据库的空间和数据库空间几乎一致,对其进行删除是性能瓶颈所在。

查询 MSrepl_commands表中未过期数据按照小时分组的命令数。

SELECT T.[publisher_database_id]
,datepart(mm,[entry_time]) 'month'
, datepart(dd,[entry_time]) 'day'
, datepart(hh,[entry_time]) 'hour'
,count(C.[xact_seqno]) 'count of commands'
FROM [distribution].[dbo].[MSrepl_transactions](nolock) T
JOIN [MSrepl_commands](nolock) C
ON T.[xact_seqno] = C.[xact_seqno]
GROUP BY T.[publisher_database_id]
,datepart(mm,[entry_time])
, datepart(dd,[entry_time])
, datepart(hh,[entry_time])
order by 1,2,3,4

从结果中看出,定义每次删除 50万数据能够删除有一个小时内的数据,而且可以防止有激增数据情况。


解决方案:

1、删除MSrepl_commands 表的存储过程是 sp_MSdelete_publisherdb_trans,删除msrepl_transaction 表的存储过程是 sp_MSdelete_dodelete

分别修改两个存储过程中删除两张表的语句:

DELETE TOP(2000) MSrepl_commands 改为DELETE TOP(500000) MSrepl_commands,两处;delete TOP(5000) MSrepl_transactions 改为delete TOP(500000) MSrepl_transactions两处

2、即使每次删除的数据量很大,但 10分钟执行的频度还是太高,调整为 1小时执行一次。

3、总体上每小时的记录数还是很多,所以需要一次减少保留的时间。根据需求,我改为了 36小时

编辑步骤,将 72改成36

4、第一次建议手工执行删除,并收缩表空间

执行 EXEC dbo .sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 36

执行DBCC SHRINKDATABASE ( '数据库' )收缩数据库,收缩后,数据库大小减小为原来一半

建议将replicate的恢复模式改为简单,并且开启自动收缩功能。

distribution数据库过大问题的更多相关文章

  1. SQL Server删除distribution数据库

    在数据库服务器删除复制(发布订阅)后,如何删除掉数据库distribution呢?如果你通过SSMS工具去删除数据库distribution,你会发现根本没有删除选项. 下面介绍一下删除distrib ...

  2. SQL Server删除distribution数据库二

    以前总结过一遍博文SQL Server删除distribution数据库,里面介绍了如何删除distribution数据库.今天介绍一个删除distribution的特殊案例, 在这之前,我不知道这个 ...

  3. 【查阅】教你使用SQL SERVER复制

    关键词:复制,复制总结,复制汇总,复制查阅 1.概念与搭建 Step1:SQL SERVER复制介绍 Step2:SQL Server 复制事务发布 Step3:SQL Server 通过备份文件初始 ...

  4. distribution 分发数据库 灾难恢复 备份恢复

    参考: http://www.sqlservercentral.com/articles/Replication/117265/ 前提:     准备一台电脑,主机名和以前的分发数据库一致.并且安装s ...

  5. 镜像切换Logreader Agent报错:分发数据库中可能存在不一致的状态(续)

    报错: 分发数据库中可能存在不一致的状态: dist_backup_lsn {00000030:000001ba:0004},dist_last_lsn {00000030:000001cd:0004 ...

  6. Distribution1:Distribution Reader

    在transactional replication中,在publication中执行了一个更新,例如:update table set col=? Where ?,如果table中含有大量的数据行, ...

  7. 5、SQL Server数据库、T-SQL

    SQL Server数据库基础 一.安装SQL Server数据库 setup.exe->安装->全新SQL Server独立安装或向现有安装添加功能->输入序列号->下一步- ...

  8. 教你管理SQL数据库系列(1-4)

    原文 教你管理 SQL Server 数据库(1)数据库的结构  http://bbs.51cto.com/thread-1084951-1.html教你管理 SQL Server 数据库(2)系统数 ...

  9. SQL Server性能调优——报表数据库与业务数据库分离

    前段时间把公司的主数据库切了,分成业务库和报表库,业务库向报表库进行实时的Replication.这个项目的上线提升了系统的性能和可维护性,现在把设计时的考量和所做的工作重新回顾一下,作为备忘. 项目 ...

随机推荐

  1. POJ3461Oulipo 题解

    题目大意: 求字符串A在字符串B中出现的次数. 思路: KMP板题,用Hash也可水过~要学习KMP可参考http://blog.csdn.net/u011564456/article/details ...

  2. Android 应用内存优化 之 onLowMemory & onTrimMemory

    OnLowMemory: 是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory.OnTri ...

  3. [Java] java.util.Arrays 中使用的 sort 采用的算法 (转)

    http://book.douban.com/annotation/15154366/Q: java.util.Arrays 中使用的 sort 采用的是什么算法?   A: java中Arrays. ...

  4. POJ 1673 EXOCENTER OF A TRIANGLE(垂心)

    题目链接 折腾了半天,没想出怎么证明,以前初中老师教过,不知道怎么办,就量量...受不了,怒抄模版1Y... #include <cstdio> #include <iostream ...

  5. 【BZOJ1208】[HNOI2004]宠物收养所 Splay

    还是模板题,两颗splay,找点删即可. #include <iostream> #include <cstdio> #include <cstdlib> #def ...

  6. [iOS-UI]点击清空按钮,却会有提交的感觉

    一,问题分析 1.感觉像是点击清空按钮时调用了添加按钮的事件. 2.插入断电后,还真是这样. 3.仔细想想,才发现,原来是我复制了添加按钮,变成为添加按钮,进而点击清空时,不仅清空了所有内容,还把最新 ...

  7. poj 1995 裸快速幂

    1. poj 1995  Raising Modulo Numbers 2.链接:http://poj.org/problem?id=1995 3.总结:今天七夕,来发水题纪念一下...入ACM这个坑 ...

  8. preventDefault()方法

    该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作). 例如,如果 type 属性是 "submit",在事件传播的任意阶段可以调用任意的事件句柄,通过调 ...

  9. Centos 安装了 Wkhtmltopdf 却依旧显示 无法打印pdf

    Odoo里判断wkhtmlpdf是否安装的代码在 openerp/tools/misc.py 文件中: def find_in_path(name): path = os.environ.get('P ...

  10. linux中,常用的账号管理命令

    创建新用户:adduser 用户名创建新用户并将其加入一个现有组中:adduser 用户名 -G 组名创建新用户并使其只属于该组:adduser 用户名 -g 组名创建用户密码:passwd 用户名创 ...