当复制有延迟时,我们可以使用复制监视器来查看各订阅的未分发命令书和预估所需时间,如下图:

但是当分发和订阅数比较多的时候,依次查看比较费时,我们可以使用sys.sp_replmonitorsubscriptionpendingcmds来查看,但是该命令需要输入多个参数,也比较累人,后从菠萝兄哪找寻得一个脚本,对该命令进行了一次封装:

--在分发服务器执行
USE distribution SELECT  'EXEC distribution.sys.sp_replmonitorsubscriptionpendingcmds @publisher = N'''+ a.publisher + ''', @publisher_db = N''' + a.publisher_db+ ''', @publication = N''' + a.publication + ''', @subscriber = N'''+ c.name + ''', @subscriber_db = N''' + b.subscriber_db+ ''', @subscription_type =' + CAST(b.subscription_type AS VARCHAR)
FROM    dbo.MSreplication_monitordata a ( NOLOCK )JOIN ( SELECT   publication_id ,subscriber_id ,subscriber_db ,subscription_typeFROM     MSsubscriptions (NOLOCK)GROUP BY publication_id ,subscriber_id ,subscriber_db ,subscription_type) b ON a.publication_id = b.publication_idJOIN sys.servers c ( NOLOCK ) ON b.subscriber_id = c.server_id
WHERE   a.agent_type = 1

执行该脚本,可以生成相应命令,再依次执行命令可以获取我们想要的结果。

为方便查看,我在菠萝的脚本上做了改进,以便可以更方便查看:

--查看为传递到订阅的命令和预估时间
--在分发服务器执行
IF(OBJECT_ID('tempdb..#tmpSubscribers') IS NOT NULL)
BEGIN
DROP TABLE #tmpSubscribers
END
GO
--IF(OBJECT_ID('tempdb..#tmpPendingResult') IS NOT NULL)
--BEGIN
--DROP TABLE #tmpPendingResult
--END--GO
--IF(OBJECT_ID('tempdb..#tmpSinglePendingResult') IS NOT NULL)
--BEGIN
--DROP TABLE #tmpSinglePendingResult
--END
GO
USE distribution
GO
SELECT
a.publisher
,a.publisher_db
,a.publication
,c.name as subscriber
,b.subscriber_db as subscriber_db
,CAST(b.subscription_type AS VARCHAR) as subscription_type
,'EXEC distribution.sys.sp_replmonitorsubscriptionpendingcmds @publisher = N'''+ a.publisher + ''', @publisher_db = N''' + a.publisher_db+ ''', @publication = N''' + a.publication + ''', @subscriber = N'''+ c.name + ''', @subscriber_db = N''' + b.subscriber_db+ ''', @subscription_type =' + CAST(b.subscription_type AS VARCHAR) AS ScriptTxt
INTO #tmpSubscribers
FROM    dbo.MSreplication_monitordata a ( NOLOCK )JOIN ( SELECT   publication_id ,subscriber_id ,subscriber_db ,subscription_typeFROM     MSsubscriptions (NOLOCK)GROUP BY publication_id ,subscriber_id ,subscriber_db ,subscription_type) b ON a.publication_id = b.publication_idJOIN sys.servers c ( NOLOCK ) ON b.subscriber_id = c.server_id
WHERE   a.agent_type = 1
--====================================================
--CREATE TABLE #tmpPendingResult
--(
--publisher NVARCHAR(200)
--,publisher_db NVARCHAR(200)
--,publication NVARCHAR(200)
--,subscriber NVARCHAR(200)
--,subscriber_db NVARCHAR(200)
--,subscription_type NVARCHAR(200)
--,pendingcmdcount BIGINT
--,estimatedprocesstime BIGINT
--)--CREATE TABLE #tmpSinglePendingResult
--(
--pendingcmdcount BIGINT
--,estimatedprocesstime BIGINT
--)--==================================================
--使用游标遍历
DECLARE @publisher NVARCHAR(200);;
DECLARE @publisher_db NVARCHAR(200);
DECLARE @publication NVARCHAR(200);DECLARE @subscriber NVARCHAR(200);;
DECLARE @subscriber_db NVARCHAR(200);
DECLARE @subscription_type NVARCHAR(200);
DECLARE @ScriptTxt NVARCHAR(MAX);DECLARE MyCursor CURSOR FOR
SELECT publisher
,publisher_db
,publication
,subscriber
,subscriber_db
,subscription_type
,ScriptTxt
FROM #tmpSubscribers;OPEN MyCursorFETCH NEXT FROM MyCursor
INTO @publisher
,@publisher_db
,@publication
,@subscriber
,@subscriber_db
,@subscription_type
,@ScriptTxt;WHILE @@FETCH_STATUS = 0
BEGIN
SELECT
@publisher AS publisher
,@publisher_db AS publisher_db
,@publication AS publication
,@subscriber AS subscriber
,@subscriber_db AS subscriber_db
,@subscription_type AS subscription_type
,@ScriptTxt;EXEC(@ScriptTxt)FETCH NEXT FROM MyCursor
INTO @publisher
,@publisher_db
,@publication
,@subscriber
,@subscriber_db
,@subscription_type
,@ScriptTxt;ENDCLOSE MyCursor
DEALLOCATE MyCursor

由于使用sp_replmonitorsubscriptionpendingcmds,无法将存储过程的结果插入到一个临时表中查看,因此想到参考其存储过程,编写一个类似脚本,于是有了下面脚本:

USE distribution
go
IF ( OBJECT_ID('dbo.sp_replmonitorsubscriptionpendingcmds_EX ') IS NOT NULL ) BEGINDROP PROCEDURE dbo.sp_replmonitorsubscriptionpendingcmds_EX END
GO
CREATE PROCEDURE dbo.sp_replmonitorsubscriptionpendingcmds_EX
AS BEGINSET nocount ONCREATE TABLE #tmpPendingResult(publisher NVARCHAR(200) ,publisher_db NVARCHAR(200) ,publication NVARCHAR(200) ,subscriber NVARCHAR(200) ,subscriber_db NVARCHAR(200) ,subscription_type NVARCHAR(200) ,pendingcmdcount BIGINT ,estimatedprocesstime BIGINT)--查找所有订阅SELECT  a.publisher ,a.publisher_db ,a.publication ,c.name AS subscriber ,b.subscriber_db AS subscriber_db ,CAST(b.subscription_type AS VARCHAR) AS subscription_typeINTO    #tmpSubscribersFROM    dbo.MSreplication_monitordata a ( NOLOCK )JOIN ( SELECT   publication_id ,subscriber_id ,subscriber_db ,subscription_typeFROM     MSsubscriptions (NOLOCK)GROUP BY publication_id ,subscriber_id ,subscriber_db ,subscription_type) b ON a.publication_id = b.publication_idJOIN sys.servers c ( NOLOCK ) ON b.subscriber_id = c.server_idWHERE   a.agent_type = 1DECLARE @count INTSELECT  @count = COUNT(1)FROM    #tmpSubscribersPRINT 'Subscriber Counter:' + CAST(@count AS VARCHAR(200));DECLARE @publisher NVARCHAR(200);;DECLARE @publisher_db NVARCHAR(200);DECLARE @publication NVARCHAR(200);DECLARE @subscriber NVARCHAR(200);;DECLARE @subscriber_db NVARCHAR(200);DECLARE @subscription_type NVARCHAR(200);DECLARE MyCursor CURSORFORSELECT  publisher ,publisher_db ,publication ,subscriber ,subscriber_db ,subscription_typeFROM    #tmpSubscribers;OPEN MyCursorFETCH NEXT FROM MyCursor
INTO @publisher, @publisher_db, @publication, @subscriber, @subscriber_db,@subscription_type;DECLARE @Error NVARCHAR(MAX)WHILE @@FETCH_STATUS = 0 BEGINSELECT  @Error = '@publisher=' + @publisher+ ';@publisher_db=' + @publisher_db + ';@publication='+ @publication + ';@subscriber=' + @subscriber+ ';@subscriber_db' + @subscriber_dbPRINT '开始:' + @Error;DECLARE @retcode INT ,@agent_id INT ,@publisher_id INT ,@subscriber_id INT ,@lastrunts TIMESTAMP ,@avg_rate FLOAT ,@xact_seqno VARBINARY(16) ,@inactive INT = 1 ,@virtual INT = -1--
    -- PAL security check done inside sp_MSget_repl_commands-- security: Has to be executed from distribution database--
  --  if sys.fn_MSrepl_isdistdb (db_name()) != 1--  begin--      --raiserror (21482, 16, -1, 'sp_replmonitorsubscriptionpendingcmds', 'distribution')--      --return 1--SELECT  @Error='@publisher='+@publisher+';@publisher_db='+@publisher_db--+';@publication='+@publication+';@subscriber='+@subscriber+';@subscriber_db'+@subscriber_db--PRINT @Error--CONTINUE;--  end--
    -- validate @subscription_type--
                IF ( @subscription_type NOT IN ( 0, 1 ) ) BEGIN--raiserror(14200, 16, 3, '@subscription_type')--return 1PRINT 'ERROR IN subscription_type'CONTINUE;END--
    -- get the server ids for publisher and subscriber--
                SELECT  @publisher_id = server_idFROM    sys.serversWHERE   UPPER(name) = UPPER(@publisher)IF ( @publisher_id IS NULL ) BEGIN--raiserror(21618, 16, -1, @publisher)--return 1PRINT 'ERROR IN publisher_id'CONTINUE;ENDSELECT  @subscriber_id = server_idFROM    sys.serversWHERE   UPPER(name) = UPPER(@subscriber)IF ( @subscriber_id IS NULL ) BEGIN--raiserror(20032, 16, -1, @subscriber, @publisher)--return 1PRINT 'ERROR IN subscriber_id'CONTINUE;END--
    -- get the agent id--
                SELECT  @agent_id = idFROM    dbo.MSdistribution_agentsWHERE   publisher_id = @publisher_idAND publisher_db = @publisher_dbAND publication IN ( @publication, 'ALL' )AND subscriber_id = @subscriber_idAND subscriber_db = @subscriber_dbAND subscription_type = @subscription_typeIF ( @agent_id IS NULL ) BEGIN--raiserror(14055, 16, -1)--return (1)PRINT 'ERROR IN agent_id'CONTINUE;END;--
    -- Compute timestamp for latest run--
                WITH    dist_sessions ( start_time, runstatus, timestamp )AS ( SELECT   start_time ,MAX(runstatus) ,MAX(timestamp)FROM     dbo.MSdistribution_historyWHERE    agent_id = @agent_idAND runstatus IN ( 2, 3, 4 )GROUP BY start_time)SELECT  @lastrunts = MAX(timestamp)FROM    dist_sessions;IF ( @lastrunts IS NULL ) BEGIN--
        -- Distribution agent has not run successfully even once-- and virtual subscription of immediate sync publication is inactive (snapshot has not run), no point of returning any counts-- see SQLBU#320752, orig fix SD#881433, and regression bug VSTS# 140179 before you attempt to fix it differently :)IF EXISTS ( SELECT  *FROM    dbo.MSpublications pJOIN dbo.MSsubscriptions s ON p.publication_id = s.publication_idWHERE   p.publisher_id = @publisher_idAND p.publisher_db = @publisher_dbAND p.publication = @publicationAND p.immediate_sync = 1AND s.status = @inactiveAND s.subscriber_id = @virtual ) BEGIN--   select 'pendingcmdcount' = 0, N'estimatedprocesstime' = 0--return 0INSERT  INTO #tmpPendingResult( publisher ,publisher_db ,publication ,subscriber ,subscriber_db ,subscription_type ,pendingcmdcount ,estimatedprocesstime)SELECT  @publisher ,@publisher_db ,@publication ,@subscriber ,@subscriber_db ,@subscription_type ,0 ,0END--
        -- Grab the max timestamp--
                        SELECT  @lastrunts = MAX(timestamp)FROM    dbo.MSdistribution_historyWHERE   agent_id = @agent_idEND--
    -- get delivery rate for the latest completed run-- get the latest sequence number--
                SELECT  @xact_seqno = xact_seqno ,@avg_rate = delivery_rateFROM    dbo.MSdistribution_historyWHERE   agent_id = @agent_idAND timestamp = @lastrunts--
    -- if no rows are selected in last query-- explicitly initialize these variables--
                SELECT  @xact_seqno = ISNULL(@xact_seqno, 0x0) ,@avg_rate = ISNULL(@avg_rate, 0.0)--
    -- if we do not have completed run-- get the average for the agent in all runs--
                IF ( @avg_rate = 0.0 ) BEGINSELECT  @avg_rate = ISNULL(AVG(delivery_rate), 0.0)FROM    dbo.MSdistribution_historyWHERE   agent_id = @agent_idEND--
    -- get the count of undelivered commands-- PAL check done inside--
                DECLARE @countab TABLE ( pendingcmdcount INT )INSERT  INTO @countab( pendingcmdcount)EXEC @retcode = sys.sp_MSget_repl_commands @agent_id = @agent_id,@last_xact_seqno = @xact_seqno, @get_count = 2,@compatibility_level = 9000000IF ( @retcode != 0OR @@error != 0)--return 1CONTINUE;--
    -- compute the time to process-- return the resultset--
                INSERT  INTO #tmpPendingResult( publisher ,publisher_db ,publication ,subscriber ,subscriber_db ,subscription_type ,pendingcmdcount ,estimatedprocesstime)SELECT  @publisher ,@publisher_db ,@publication ,@subscriber ,@subscriber_db ,@subscription_type ,pendingcmdcount ,CASE WHEN ( @avg_rate != 0.0 )THEN CAST(( CAST(pendingcmdcount AS FLOAT)/ @avg_rate ) AS INT)ELSE pendingcmdcountENDFROM    @countab--
    -- all done--
    --CONTINUE;FETCH NEXT FROM MyCursor
INTO @publisher, @publisher_db, @publication, @subscriber, @subscriber_db,@subscription_type;ENDCLOSE MyCursorDEALLOCATE MyCursorSELECT  *FROM    #tmpPendingResultEND
GO
--=========================================================
--测试
EXEC dbo.sp_replmonitorsubscriptionpendingcmds_EX 

上面相对使用起来更方便些。哈哈

--============================================================================================

来个妹子给大家降降温

转载于:https://www.cnblogs.com/TeyGao/p/3795452.html

Replication--查看未分发命令和预估所需时间相关推荐

  1. mysql 未找到命令_MySQL主从复制配置说明,一文教你搞懂数据库主从复制

    一,MySQL主从配置原理 1. mysql支持的复制格式 基于语句复制(STATEMENT) (优点)基于statement复制的优点很明显,简单的记录执行语句同步到从库执行同样的语句,占用磁盘空间 ...

  2. 在Mac终端下使用conda命令提示未找到命令conda

    问题 Mac版Anaconda安装完之后,在终端中输入:conda --version,查看anaconda版本,提示:zsh: command not found: conda,即未找到命令cond ...

  3. 报错:“-bash: git: 未找到命令”

    报错:"-bash: git: 未找到命令" 解决方法: 安装git命令即可解决问题,Linux百科网是以CentOS 7 64位系统为例,在安装git命令之前需要先启用EPEL存 ...

  4. linux cat 文本颜色,linux文本文件查看、展示命令 :cat head tail grep more less nl

    linux文本文件查看.显示命令 :cat head tail grep more less nl linux文本文件查看.显示命令 :cat head tail  grep  more less n ...

  5. 查看硬件配置的Linux命令,LINUX 查看硬件配置命令的教程

    你还在为不知道linux 查看硬件配置命令的教程而烦恼么?接下来是小编为大家收集的linux 查看硬件配置命令的教程教程,希望能帮到大家. linux 查看硬件配置命令的教程 系统 # uname - ...

  6. virtualenv: 未找到命令

    centos安装virtualven后, pip list可以看到,但使用命令virtualven时会提示"bash:virtualven:未找到命令..." 解决办法: vi / ...

  7. 查看欧拉系统服务器ip,euler os 查看center进程命令

    euler os 查看center进程命令 内容精选 换一换 如果日志目录下没有生成日志文件,您需要检查Host侧对应进程是否正常运行.如果Host侧进程不存在,请参考启动日志进程启动进程.执行如下命 ...

  8. Linux常用的查看设备的命令

    Linux常用的查看设备的命令 linux查看设备命令 系统 # uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本 # cat / ...

  9. linux查看网络流量 命令,linux查看流量命令

    Linux系统下想要查看网络流量,那我们该使用那个命令呢?下面由学习啦小编为大家整理了linux查看网络流量的命令的相关知识,希望对大家有帮助. linux查看网络流量命令大全 linux查看网络流量 ...

最新文章

  1. A100 GPU硬件架构
  2. img标签 文件不存在_HTML常用标签
  3. sass的继承,混合宏,占位符的用法总结
  4. ckeditor默认字体设置
  5. 前瞻:Spring 6.0将停止支持Freemarker和JSP
  6. python入门基础代码图-Python入门基础学习一
  7. JVM 垃圾回收算法 -可达性分析算法!!!高频面试!!!
  8. 进程、线程和协程之间的区别和联系
  9. [汇编语言]实验五:编写,调试具有多个段的程序
  10. MySQL优化调优有没有做过_MySQL 调优/优化的 100 个建议
  11. mysql已死 subsys被锁_centos6.5安装MYSQL“mysqld已死,但是subsys被锁”的解决方案
  12. 失眠患者应该边工作边调理,还是辞职回家调理?
  13. 朴素贝叶斯分类算法(Naive Bayesian classification)
  14. LaTeX 有哪些「新手须知」的内容?
  15. 信号与系统Matlab实验1
  16. Python爬虫 9-Scrapy框架初探
  17. Struggling
  18. cdd 变分 图像修复 matlab,图像修复中的TV模型
  19. 什么是预言机(oracle)
  20. 单目视觉技术、双目视觉技术、多目视觉技术

热门文章

  1. 记录一次uni-app页面跳转无效 来回跳转问题
  2. [react] react声明组件有哪几种方法,各有什么不同?
  3. [react] 写出React动态改变class切换组件样式
  4. Leetcode刷题(5)最长公共前缀
  5. [html] 你知道什么是粘性布局吗?
  6. 前端学习(2888):如何短时间内实现v-for 模板编译1
  7. 前端学习(2802):完成资讯页面详情
  8. 实例50:python
  9. 怎样下载安装python_Windows系统上如何安装Python和pip
  10. 安装python要注意什么_安装python注意事项