原文:SqlServer 监控发布中未分发的命令数

对于查看未分发的命令数,我们通常这样查看。

然而当服务器有很多发布时,一个个打开查看就很麻烦

当然,如果想用脚本查看就更方便了,运行下面的语句

  1. --查看各发布订阅未分发的命令数和估计时间
  2. SELECT 'EXEC distribution.sys.sp_replmonitorsubscriptionpendingcmds @publisher = N'''
  3. + a.publisher + ''', @publisher_db = N''' + a.publisher_db
  4. + ''', @publication = N''' + a.publication + ''', @subscriber = N'''
  5. + c.name + ''', @subscriber_db = N''' + b.subscriber_db
  6. + ''', @subscription_type =' + CAST(b.subscription_type AS VARCHAR)
  7. FROM distribution.dbo.MSreplication_monitordata a ( NOLOCK )
  8. INNER JOIN (
  9. SELECT publication_id ,subscriber_id ,subscriber_db ,subscription_type
  10. FROM distribution.dbo.MSsubscriptions (NOLOCK)
  11. GROUP BY publication_id ,subscriber_id ,subscriber_db ,subscription_type
  12. ) b ON a.publication_id = b.publication_id
  13. INNER JOIN sys.servers c ( NOLOCK ) ON b.subscriber_id = c.server_id
  14. WHERE a.agent_type = 1

上面自动生成各个发布 未分发的命令的存储过程,执行就能查看各个发布等待分发的命令和估计时间:

  1. EXEC distribution.sys.sp_replmonitorsubscriptionpendingcmds
  2. @publisher = N'发布服务器'
  3. , @publisher_db = N'发布数据库'
  4. , @publication = N'发布名称'
  5. , @subscriber = N'订阅服务器'
  6. , @subscriber_db = N'订阅数据库'
  7. , @subscription_type =0

  1. /***************************************************************************/
  2. /***************************************************************************/

但是,由于监控需要,只想统计所有发布未分发的命令数“ pendingcmdcount”的总和,

本来想用下面这个方法把各个存储过程的返回值插入到临时表,但是没有这种方法!!

  1. CREATE TABLE #countab(pendingcmdcount int,estimatedprocesstime int)
  2.  
  3. INSERT INTO #countab(pendingcmdcount,estimatedprocesstime)
  4. EXEC distribution.sys.sp_replmonitorsubscriptionpendingcmds
  5. @publisher = N'发布服务器'
  6. , @publisher_db = N'发布数据库'
  7. , @publication = N'发布名称'
  8. , @subscriber = N'订阅服务器'
  9. , @subscriber_db = N'订阅数据库'
  10. , @subscription_type =0

上面这个方法也可行,但是只在本地的测试可行。就是创建链接服务器,加到数据库distribution前面。

实际服务器有本地的链接服务器,但是没显示出来,也用不了。虽然可以创建其他命名的,但不想创建太多链接服务器。

于是想到更改系统的存储过程!!~错了,是参考系统存储过程创建一个几乎一样定义的存储过程。

即不需要distribution.sys.sp_replmonitorsubscriptionpendingcmds ,创建类似的dbo.sp_getsubscriptionpendingcmds ,如下

  1. create procedure dbo.sp_getsubscriptionpendingcmds
  2. (
  3. @publisher sysname -- cannot be null
  4. ,@publisher_db sysname -- cannot be null
  5. ,@publication sysname -- cannot be null
  6. ,@subscriber sysname -- cannot be null
  7. ,@subscriber_db sysname -- cannot be null
  8. ,@subscription_type int
  9. ,@pendingcmdcount int output
  10. )
  11. as
  12. begin
  13. set nocount on
  14. declare @retcode int
  15. ,@agent_id int
  16. ,@publisher_id int
  17. ,@subscriber_id int
  18. ,@lastrunts timestamp
  19. ,@xact_seqno varbinary(16)
  20.  
  21. ,@inactive int = 1
  22. ,@virtual int = -1
  23.  
  24. select @publisher_id = server_id from sys.servers where upper(name) = upper(@publisher)
  25. select @subscriber_id = server_id from sys.servers where upper(name) = upper(@subscriber)
  26.  
  27. select @agent_id = id
  28. from distribution.dbo.MSdistribution_agents
  29. where publisher_id = @publisher_id
  30. and publisher_db = @publisher_db
  31. and publication in (@publication, 'ALL')
  32. and subscriber_id = @subscriber_id
  33. and subscriber_db = @subscriber_db
  34. and subscription_type = @subscription_type
  35.  
  36. ;with dist_sessions (start_time, runstatus, timestamp)
  37. as(
  38. select start_time, max(runstatus), max(timestamp)
  39. from distribution.dbo.MSdistribution_history
  40. where agent_id = @agent_id
  41. group by start_time
  42. )
  43. select @lastrunts = max(timestamp) from dist_sessions where runstatus in (2,3,4);
  44.  
  45. if (@lastrunts is null)
  46. begin
  47. if exists (
  48. select * from distribution.dbo.MSpublications p
  49. inner join distribution.dbo.MSsubscriptions s on p.publication_id = s.publication_id
  50. where p.publisher_id = @publisher_id
  51. and p.publisher_db = @publisher_db
  52. and p.publication = @publication
  53. and p.immediate_sync = 1
  54. and s.status = @inactive and s.subscriber_id = @virtual)
  55. begin
  56. select 'pendingcmdcount' = 0, N'estimatedprocesstime' = 0
  57. return 0
  58. end
  59.  
  60. select @lastrunts = max(timestamp) from distribution.dbo.MSdistribution_history where agent_id = @agent_id
  61. end
  62.  
  63. select @xact_seqno = xact_seqno from distribution.dbo.MSdistribution_history where agent_id = @agent_id and timestamp = @lastrunts
  64.  
  65. select @xact_seqno = isnull(@xact_seqno, 0x0)
  66.  
  67. DECLARE @countab TABLE ( pendingcmdcount int )
  68. insert into @countab (pendingcmdcount)
  69. exec @retcode = distribution.sys.sp_MSget_repl_commands
  70. @agent_id = @agent_id
  71. ,@last_xact_seqno = @xact_seqno
  72. ,@get_count = 2
  73. ,@compatibility_level = 9000000
  74. if (@retcode != 0 or @@error != 0)
  75. return 1
  76.  
  77. select @pendingcmdcount=pendingcmdcount from @countab
  78.  
  79. return @pendingcmdcount
  80. end

上面的存储过程主要更改3个地方,然后在其他一个数据库运行,页可在distribution运行。

1. 多一个返回参数,@pendingcmdcount int output ,返回未分发的命令数

2. 估计时间不需要,去掉

3. 查询的每个表或内部存储过程加数据库前缀distribution



接下来再用一个存储过程把所有值加起来,给计数器!

新建一个作业,定时每分钟执行,观察性能计数器统计情况。

这样也可以再cacti捕获了!~

SqlServer 监控发布中未分发的命令数的更多相关文章

  1. Sysstat性能监控工具包中20个实用命令

    Sysstat性能监控工具包中20个实用命令 学习mpstat, pidstat, iostat和sar等工具,这些工具可以帮组我们找出系统中的问题.这些工具都包含了不同的选项,这意味着你可以根据不同 ...

  2. SQLServer 使用sp_repldone标识所有未分发的事务为已分发

    原文:SQLServer 使用sp_repldone标识所有未分发的事务为已分发 对于发布数据库的数据大量操作时,会使日志扫描并读取太多,会导致分发堵塞很久.也有一些解决方法,参考 <SqlSe ...

  3. Replication--查看未分发命令和预估所需时间

    当复制有延迟时,我们可以使用复制监视器来查看各订阅的未分发命令书和预估所需时间,如下图: 但是当分发和订阅数比较多的时候,依次查看比较费时,我们可以使用sys.sp_replmonitorsubscr ...

  4. SQLServer 事务复制中使用脚本添加某个对象的发布

    原文:SQLServer 事务复制中使用脚本添加某个对象的发布 -- use [发布库] --添加表:创建项目并将其添加到发布中 exec sp_addarticle @publication = N ...

  5. SQLSERVER监控复制并使用数据库邮件功能发告警邮件

    SQLSERVER监控复制并使用数据库邮件功能发告警邮件 最近熬出病来了,都说IT行业伤不起,不说了,说回今天的正题 正题 上个月月底的时候因为要搬迁机房,需要将一个数据信息数据库先搬到我们的机房,然 ...

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

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

  7. 监控Linux性能的18个命令行工具

    监控 Linux 性能的 18 个命令行工具 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐 认识到监控和保 ...

  8. 使用MySQL中的EXPLAIN解释命令来检查SQL

    我们看到许多客户的系统因为SQL及数据库设计的很差所以导致许多性能上的问题,这些问题不好解决,但是可以采用一套简单的策略来检查生产系统,发现并纠正一些共性问题. 很显然,您应该尽最大努力设计出最好的数 ...

  9. iOS应用发布中的一些细节

    iOS应用发布中的一些细节 前言 这几天最大的新闻我想就是巴黎恐怖袭击了,诶,博主每年跨年都那么虔诚地许下“希望世界和平”的愿望,想不到每年都无法实现,维护世界和平这么难,博主真是有心无力啊,其实芸芸 ...

随机推荐

  1. uml精粹——11.活动图(及整个读书笔记分享)

    11.活动图activity diagram   活动图是描写叙述过程化逻辑procedural logic.业务过程business process和工作流work flow的技术. 他和流程图fl ...

  2. Android与IOS的UUID的区别

    UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OS ...

  3. Git之同一台电脑如何连接多个远程仓库

    Git之同一台电脑如何连接多个远程仓库 一.总结 一句话总结: 1.git使用.git目录里面的内容(ssh或用户名密码)来自动和远程仓库通信 2.在不同的仓库中配置不同的.git目录,可以连接不同的 ...

  4. C++ 快速入门笔记:进阶编程

    C++入门笔记:高级编程 文件和流 打开文件 void open (const char *filename, ios::openmode mode); ios::app 追加模式.所有写入都追加到文 ...

  5. [SVG] Optimize SVGs for Better Performance using svgo

    Just like a bitmap image, you can compress an SVG by removing various pieces of code that aren’t nec ...

  6. php数学和时间常用函数有哪些(总结表)(看学习视频效率挺高的)(复习)

    php数学和时间常用函数有哪些(总结表)(看学习视频效率挺高的)(复习) 一.总结 一句话总结: 1.数学函数常用的6个:max().min().cell().floor().round().mt_r ...

  7. Linux下新手怎样将VIM配置成C++编程环境(能够STL自己主动补全)

    ~ 弄拉老半天,最终弄的几乎相同啦,果然程序猿还是须要有点折腾精神啊. 首先你要安装vim,命令:sudo apt-get install vim vim它仅仅是一个编辑器,它不是IDE(比方code ...

  8. KindEditor4.1.10,支持粘贴图片

    转载自https://blog.csdn.net/jimmy0021/article/details/73251406 我已经忘记我是不是从这个博主的那里找到的解决kindeditor粘贴图片的方法了 ...

  9. 在C++ Builder6上使用Boost正则表达式库

    本文关键词:正则表达式 c++ python 软件 正则表达式是一种模式匹配形式,它通常用在处理的文本程序中.比如我们经常使用的grep工具,还是perl语言都使用了正则表达式. 正则表达式是一种模式 ...

  10. cordova/phoneGap 开发调试工具

    原文地址 一.前言 Ripple Emulate:使用Google模拟器,可以帮到大部分的调试,除了需要调用手机设备方面的功能除外.GapDebug:真机安装apk,电脑端和真机端同步调试,适用的项目 ...