事务复制5: Transaction and Command
在事务复制中distribution数据库使用 dbo.MSrepl_transactions 和 dbo.MSrepl_commands 这两个表转存发布服务器产生的的Transaction和Command。每个command只能更新(update,insert或delete)一条记录。在Publisher中,一个Trasaction能够更新Table的一条或多条记录,因此一个Transaction对应一个或多个command,只有当command全部执行成功,transaction才执行成功。
一, 事务和命令的存储
事务和命令被读取后,转存到分发数据库中,在分发数据库中做暂时的存储。
1,转存事务
在表MSrepl_transactions中存储事务,字段xact_seqno 表示事务的序号,数据类型是 varbinary(16) ,值是递增的。
默认情况下,在Publisher数据库中提交的一个事务,只有一个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的中语句,返回可读的文本。
- 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高,使用以下脚本查看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 的清理
当Transaction 和 Command 已经被推送到Subscriber上之后,distribution 中的暂存的Transaction 和 Command 应该被purge,不然会导致distribution 过大,影响后续数据的推送。事务复制使用一个Agent自动清理Transaction和Command。
参考文档:
sp_browsereplcmds (Transact-SQL)
Determine Transactional Replication workload to help resolve data latency
事务复制5: Transaction and Command的更多相关文章
- Replication:事务复制 Transaction and Command
事务复制使用 dbo.msrepl_transactions 和 dbo.MSrepl_commands 存储用于数据同步的Transaction和Command.在replication中,每个co ...
- SQL Server ->> 高可用与灾难恢复(HADR)技术之 -- Transaction Replication(事务复制)
复制类型: 1)事务型复制:通过复制事务日志到订阅点重做的方式,属于增量型复制: 2)合并型复制:通过触发器和元数据表追踪表数据改变,同样属于增量型复制: 3)快照型复制:通过创建数据库快照,并把快照 ...
- Replication的犄角旮旯(四)--关于事务复制的监控
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- Replication:事务复制 Subscriber的主键列是只读的
在使用Transactional Replication时,Subscriber 被认为是“Read-Only”的 , All data at the Subscriber is “read-only ...
- 一个事务复制的bug--更新丢失
有两种情况会造成更新丢失,第一种是不正确的设置,例如外键或触发器的“Not For Replication” (NFR)属性没有开启.详情请参考http://blogs.msdn.com/b/apgc ...
- 第五篇 Replication:事务复制-How it works
本篇文章是SQL Server Replication系列的第五篇,详细内容请参考原文. 这一系列包含SQL Server事务复制和合并复制的详细内容,从理解基本术语和设置复制的方法,到描述它是如何工 ...
- 【译】第五篇 Replication:事务复制-How it works
本篇文章是SQL Server Replication系列的第五篇,详细内容请参考原文. 这一系列包含SQL Server事务复制和合并复制的详细内容,从理解基本术语和设置复制的方法,到描述它是如何工 ...
- Spring.NET的中间数据层(Middle Tier Data Access)——事务管理(Transaction management)
简介 Spring.NET为事务管理提供了一个持久化抽象(consistent abstraction ),其优点如下: 为不同事务API,例如ADO.NET,Enterprise Services, ...
- SQL Server提高事务复制效率优化(一)总体概述
随着公司业务的发展,数据量增长迅速,在解决Scale Out的同时,还要考虑到主从的复制延迟问题,尽量降到1s以内满足线上业务,如果不调整,SQL Server默认的配置可能平均要3s左右.生产的 ...
随机推荐
- iOS Swift 数组 交换元素的两种方法
swap(&arr[fromIndexPath.row], &arr[to.row]) (arr[fromIndexPath.row],arr[to.row]) = (arr[to.r ...
- HDU5937 Equation(DFS + 剪枝)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5937 Description Little Ruins is a studious boy, ...
- java基础-泛型3
浏览以下内容前,请点击并阅读 声明 8 类型擦除 为实现泛型,java编译器进行如下操作进行类型擦除: 如果类型参数有限制则替换为限制的类型,如果没有则替换为Object类,变成普通的类,接口和方法. ...
- Theano 学习笔记(一)
Theano 学习笔记(一) theano 为什么要定义共享变量? 定义共享变量的原因在于GPU的使用,如果不定义共享的话,那么当GPU调用这些变量时,遇到一次就要调用一次,这样就会花费大量时间在数据 ...
- 头显HTC Vive北美直降100美元,中国区降价活动今日公布
如果你现在想要购买一台VR头显,591ARVR资讯网www.591arvr.com的小编提醒大家可以等一等,在即将到来的年末促销中各种VR设备都将迎来大力度降价.目前北美市场的HTC Vive已经直降 ...
- HDU5618 & CDQ分治
Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...
- winfrom组件圆角
精简后,就其实一点,只要有paint事件的组件,都可画圆角,没有的外面套一个panel就行了. using System; using System.Collections.Generic; usin ...
- 通读SDWebImage②--视图分类
本文目录 UIView+WebCacheOperation UIImageView+WebCache.UIImageView+HighlightedWebCache.MKAnnotationView+ ...
- 新入门node.js必须要知道的概念
一.对于一个刚入门node.js的朋友来说,一定要了解一些基础概念: 今年我正式进入社会后,发现自己所知道的IT方面的知识,真的只是牛毛,原来人外有人,山外有山,还需要继续努力.下面是一些我的自学习心 ...
- ZOJ1913 Euclid's Game (第一道简单的博弈题)
题目描述: Euclid's Game Time Limit: 2 Seconds Memory Limit: 65536 KB Two players, Stan and Ollie, p ...