事务复制使用 dbo.msrepl_transactions 和 dbo.MSrepl_commands 存储用于数据同步的Transaction和Command。在replication中,每个command只能更新(update,insert或delete)一条record;而在Publisher中,一个Trasaction能够更新Table Article的一条或多条Record,因此一个Transaction对应一个或多个command,只有当command全部执行成功,transaction才执行成功。

一, 事务和命令的存储

1,存储事务

在MSrepl_transactions中存储事务,字段xact_seqno 表示事务的序号,数据类型是 varbinary(16) ,值是递增的。

默认情况下,在Publisher database中提交的一个事务,只有一个xact_seqno,其值是10Bytes,只有当该事务中的所有commands都执行成功,该事务才算执行成功。如果事务被拆分成多个子事务,每个子事务都会有一个xact_seqno,由原有的xact_seqno加上子事务序号构成。

例如,事务:0x000B782E000057080006 被拆分成三个子事务,其子事务的序号是:

  • 0x000B782E000057080006,占用10B
  • 0x000B782E000057080006000000000001,占用16B
  • 0x000B782E000057080006000000000002,占用16B

由于xact_seqno的数据类型是varbinary(16),子事务序号:0x000B782E000057080006 和 0x000B782E000057080006000000000000 在逻辑上相同,表示第一个子事务,因此,在dbo.MSdistribution_history记录的xact_seqno都是 16Bytes的。

2,存储命令

在MSrepl_commands中存储命令,字段xact_seqno 表示命令关联的事务;在一个事务中,可能关联多个Command,字段 command_id 表示在事务中每个Command的ID值;字段 command 存储SQL Server的command,数据类型是varbinary(1024);如果一个Command 不能存储在一个Command entry中,那么事务复制将其拆分成多个entry。如图,Command_ID依次增加,字段partial_command字段是1,hashkey的值都是3,表示这四个command是一个Command拆分的。

二,查看 msrepl_commands 中的SQL语句

使用 sp_browsereplcmds 能够解析comman的中语句,返回可读的文本。

sp_browsereplcmds Returns a result set in a readable version of the replicated commands stored in the distribution database。

sys.sp_browsereplcmds [ [ @xact_seqno_start = ] 'xact_seqno_start' ][ , [ @xact_seqno_end = ] 'xact_seqno_end' ] [ , [ @originator_id = ] 'originator_id' ][ , [ @publisher_database_id = ] 'publisher_database_id' ][ , [ @article_id = ] 'article_id' ][ , [ @command_id= ] command_id ][ , [ @agent_id = ] agent_id ][ , [ @compatibility_level = ] compatibility_level ]

如果只是粗略地查看Transaction中的 command,可以使用如下脚本,得出的文本大概是:{CALL [sp_MSdel_dboDimUser] (?,?)},实际上,这是在Subscriber DB中执行的SP,用于删除 dbo.DimUser表中的一条数据行。

SELECT CAST(SUBSTRING(command, 7, 8000) AS NVARCHAR(MAX)),
FROM dbo.msrepl_commands
WHERE xact_seqno = 0x0008E9340005C068003E;

三,Latency 问题一般是由于一个Transaction内包含的Command太多,导致Transaction从Publisher推送到distribution,再从distribution 推送到subscriber 的latency高。

Latency problems are often caused when series of transactions are trying to move a large batch of commands from the Publisher to the Distributor to the Subscribers.

使用以下脚本查看Command的数量

select t.publisher_database_id, t.xact_seqno, min(t.entry_time) as EntryTime, count(c.command_id) as CommandCount
FROM dbo.MSrepl_commands c with (nolock)
inner JOIN  dbo.msrepl_transactions t with (nolock)on t.publisher_database_id = c.publisher_database_id and t.xact_seqno = c.xact_seqno
where c.publisher_database_id=2
GROUP BY t.publisher_database_id, t.xact_seqno
order by CommandCount desc

四,Transaction 和 Command 的cleanup

当Transaction 和 Command 已经被推送到Subscriber上之后,distribution 中的暂存的Transaction 和 Command 应该被purge,不然会导致distribution 过大,影响后续数据的推送。Replication 使用“Distribution clean up: distribution” Removes replicated transactions from the distribution database.

参考文档:

sp_browsereplcmds (Transact-SQL)

Determine Transactional Replication workload to help resolve data latency

作者:悦光阴
出处:http://www.cnblogs.com/ljhdo/
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。

分类: Replication
本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/5098809.html,如需转载请自行联系原作者

事务复制5: Transaction and Command相关推荐

  1. sql数据库 订阅发布_如何使用中央发布者和多个订阅者数据库设置自定义SQL Server事务复制

    sql数据库 订阅发布 In this article, you'll learn how to setup a simple, custom distributed database replica ...

  2. Linux上SQL Server事务复制

    In this article, we will talk about how to send the SQL Server Transactional Replication on Linux En ...

  3. Replication的犄角旮旯(四)--关于事务复制的监控

    原文:Replication的犄角旮旯(四)--关于事务复制的监控 <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Rep ...

  4. 使用SQL Server事务复制将SQL Server数据库迁移到Azure SQL数据库

    In this guide, we'll discuss more about migrating a SQL Server database to Azure SQL Database using ...

  5. sql server 快照_SQL Server复制:配置快照和事务复制

    sql server 快照 In this article of the series on SQL Server replication, we will explore ways to confi ...

  6. 一个事务复制的bug--更新丢失

    有两种情况会造成更新丢失,第一种是不正确的设置,例如外键或触发器的"Not For Replication" (NFR)属性没有开启.详情请参考http://blogs.msdn. ...

  7. WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

    今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...

  8. 如何处理SQL Server事务复制中的大事务操作

    如何处理SQL Server事务复制中的大事务操作 事务复制的工作机制 事务复制是由 SQL Server 快照代理.日志读取器代理和分发代理实现的.快照代理准备快照文件(其中包含了已发布表和数据库对 ...

  9. 快照复制,事务复制,合并复制的区别

    简单来说: 1.快照复制和事务复制是单向的(2005及以后的版本中加入了订阅端可更新的事务复制). 2.合并复制是双向的. -------------------------------------- ...

最新文章

  1. html动态生成榜单信息,排行榜.html
  2. 计算机网络第七章:网络安全
  3. 下一代防火墙信息收集(概念篇)
  4. Virtualization基础
  5. 如何在云服务器上安装vim(bash: vim :command not found)
  6. boost::safe_numerics模块实现数组索引值可以超出数组边界的测试程序
  7. apache php mysql 开发_Wndows下Apache+php+Mysql环境的搭建及其涉及的知识(转)
  8. python教程自带数据库_python教程自带数据库 | Python学哪个数据库
  9. 上交大计算机复试机师难不难,本科复旦,考研上海交大复试第一,我感觉难度并不大...
  10. hive函数大全:11大类、109个函数
  11. c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...
  12. 解决硬盘文件目录损坏且无法读取
  13. 山东女子学院计算机专业分数线,山东女子学院2020年山东省本科专业录取分数统计(含位次)...
  14. pandas提取某两列的值_Pandas进阶修炼120题第五期
  15. SQL数据库附加数据及查询方法
  16. 2021年中职“网络安全“江西省赛题—B-8:Web渗透测试
  17. w7计算机显卡,win7系统怎么更新电脑显卡驱动
  18. TCP: too many of orphaned sockets报错解决
  19. python对文件进行tar和gz格式的压缩和解压缩(亲测,可用)
  20. ErrMsg:server is DOWN now, please try again later!

热门文章

  1. 一场改变你投资生涯的讨论:职业德州扑克手看交易
  2. node服务的监控预警系统架构 1
  3. MySQL 存储引擎和锁
  4. 利用反射打印对象一般成员属性值
  5. Redis性能问题排查解决手册(七)
  6. promiseKit 解析 iOS
  7. dsp 正弦波信号发生器matlab程序,基于Matlab/DSP Builder多波形信号发生器的设计
  8. Setting下的自定义控件LinearColorBar
  9. Drawable和Bitmap的区别
  10. Python 网站应用从开发到部署