在transactional replication troubleshooting的过程中,经常会遇到下面的场景:

客户在发布端执行了一个几百万行的更新,结果导致性能下降。 客户很想知道目前distribution agent的进度,完成的百分比,决定是等下去还是跳过这个过程。如果已经完成了90%,那么贸然停止就非常可惜了,并且rollback的操作也是要很长时间的。

下面介绍如何查看进度。

如果distribution agent已经启用了verbose log,可以通过verbose log来查看进度. Command id代表已经执行过的数量;transaction seqno表示正在进行的事务的xact_seqno。 然后在distribution数据库执行select count(*) From distribution..msrepl_commands with(nolock) where xact_seqno=@xact_seqno.

对比结果就可以知道进度了。

如果没有启用verbose log,就比较麻烦了,下面是具体的步骤。

  1. 找到相应的distribution agent 名称和publisher_database_id

    select *From distribution..msdistribution_agents

  2. 通过名称就可以找到distribution agent进行的process id. 在distributor上执行下面的语句。

    select hostprocess from sys.sysprocesses where program_name=@mergeAgentName

  3. 同一个distribution agent进程的process id是相同的,所以可以通过这个process id(对应trace里的client process id),使用sql server trace得到distribution agent正在subscriber端执行的语句.
  4. 假设我们得到了下面这个语句exec [dbo].[sp_MSupd_dbota] default,511,4,0x02
  5. 根据这个存储过程,我们可以得到相应的aritlce_id。
    1. 在subscription database 执行sp_helptext,得到表的名称
    2. 在distribution数据库查询得出article_id. select article_id from msarticles where destination_object=@tablename
  6. 在subscriber上执行下面的语句,得到subscription数据库当前当xact_seqno. (请将第一步得到的distribution name带入@distribution_agent)

    select transaction_timestamp,* From MSreplication_subscriptions where distribution_agent=@distribution_agent

  7. 接下来就可找到distribution agent当前正在执行的xact_seqno了. 将第一步得到的publisher_database_id,第5步得到的article_id和上一步得到的xact_seqno带入下面的查询

    select xact_seqno,count(*) as number From distribution..msrepl_commands with(nolock)

    where publisher_database_id=@publisher_database_id and article_id=@article_id

    xact_seqno>@xact_seqno group by xact_seqno order by xact_seqno

  8. 顺序靠前,并且number较大的就是正在执行的事务了。 您可能会问,为什么不是第六步得到的xact_seqno的下一个呢(select min(xact_seqno)From distribution..msrepl_commands with(nolock)where publisher_database_id=@publisher_database_id and xact_seqno>@xact_seqno).

    因为distribution 并不是每一个事务都单独提交的,而是根据CommitBatchSize 和CommitBatchThreshold来提交的,这样可以提高性能。 具体请参见http://www.kendalvandyke.com/2008/11/how-commitbatchsize-and.html

  9. 在distribution数据执行sp_browsereplcmds @xact_seqno, @xact_seqno

  10. 用第四步得到的语句去查找,这样就可以知道当前执行到了什么位置

如何查看distirbution agent的执行进度的更多相关文章

  1. 【MS SQL】查看任务执行进度

    原文:[MS SQL]查看任务执行进度 备份或还原数据库时,我一般是用MS SQL工具向导来进行,由于工具向导没有显示任务执行过程的状态, 如果数据库比较大执行时间较长的话,对任务啥时候执行完成比较迷 ...

  2. IOS下载查看PDF文件(有下载进度)

    IOS(object-c) 下载查看 PDF 其实还是蛮容易操作的.在下载前,首先要把 IOS 可以保存文件的目录给过一遍: IOS 文件保存目录 IOS 可以自定义写入的文件目录,是很有限的,只能是 ...

  3. 通过DeveloperApi获取spark程序执行进度及异常

    在应用spark时,经常要获取任务的执行进度,可以参照jobProgressListener的设计来完成该功能. 以下代码仅供参考,欢迎交流. 效果显示: 代码: package org.apache ...

  4. pv命令监控Linux命令的执行进度

    pv命令监控Linux命令的执行进度 http://www.techweb.com.cn/network/system/2015-12-14/2241124.shtml yum install -y ...

  5. Linux查看非root流程执行

    Linux查看非root流程执行 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps -U root -u root -N PID TTY TIME CMD ...

  6. jQuery执行进度提示窗口的实现(progressbar)

    使用jQuery原生插件,先看效果: 主要是progressbar的更新进度以及“请稍等”后省略号.倒计时关闭的效果 如果执行单个任务的时间较长,会导致浏览器假死,一定要使用异步,代码结构要稍作调整. ...

  7. 【原创】大叔经验分享(19)spark on yarn提交任务之后执行进度总是10%

    spark 2.1.1 系统中希望监控spark on yarn任务的执行进度,但是监控过程发现提交任务之后执行进度总是10%,直到执行成功或者失败,进度会突然变为100%,很神奇, 下面看spark ...

  8. oracle中查看sql语句的执行计划

    1.在pl/sql中打开cmd命令容器 2.在cmd命令窗口中输入:explain plan for select * from t; 3.查看sql语句的执行计划:select * from tab ...

  9. 查看带有A-Time的执行计划

    先执行 SQL> alter session set statistics_level=all; 会话已更改. 再执行SQL语句: SQL> select count(*) from tb ...

随机推荐

  1. JAVA实现多线程入门

    package com.thread;/** * 1:程序员可以在程序中执行多个线程,每一个线程完成一个功能,并于其他线程并发执行,这种 * 机制被称为多线程 * 2:实现线程的两种方法是,分别是继承 ...

  2. IoC实践--用Unity实现MVC5.0的IoC控制反转方法

    在MVC中,控制器依赖于模型对数据进行处理,也可以说执行业务逻辑.我们可以使用依赖注入(DI)在控制层分离模型层,这边要用到Repository模式,在领域驱动设计(DDD)中,Repository翻 ...

  3. LoadRunner 如何将英文的字符串转换成UTF-8格式的字符串?

    7.48  如何手动转换字符串编码 1.问题提出 如何将英文的字符串转换成UTF-8格式的字符串? 2.问题解答 可以使用lr_convert_string_encoding函数将字符串从一种编码手动 ...

  4. AD8275 Driver Amplifiers For Analog-To-Digital Converters

    Driver Amplifiers For Analog-To-Digital Converters What amplifiers are used to drive analog-to-digit ...

  5. 【Android开发坑系列】之Fragment

    这个东西有顾名思义是碎片,和之前的Activity对应. 坑1:一般情况都会想当然的以为进程被杀掉之后,Fragment也会被回收 其实,Fragment有自己的生命周期,有自己的管理器(Fragme ...

  6. oratop 各个指标项说明

    Section 1- oratop and database/instance specifics spid       :oratop's server SPID connected to inst ...

  7. Hadoop学习篇1 快速入门

    Hadoop是Apache Lucene创始人Doug Cutting创建的,Hadoop起源于Apache Nutch,一个开源的网络搜索引擎.最先引起注意是2003年google的一篇论文,该论文 ...

  8. ubuntu11.10搭建eclipse C++开发环境[zhuan]

    1.最重要的东西,C++必要工具,安装的是GCC工具链,Make等一系列开发工具: sudo apt-get install build-essential 2. 安装Eclipse sudo apt ...

  9. Objective-c中定义成员变量

    ios定义成员变量的方法: 如果只是内部访问,完全可以直接用_xxx(下划线),无需自己定义,编译器会自动生成 如果需要外部访问这个变量,可以用 @property xxx ; @synthesize ...

  10. VS常用的配置和插件