事务复制5: Transaction and Command

简介:

事务复制使用 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

 

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





本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/5098809.html,如需转载请自行联系原作者
目录
相关文章
|
C语言
Verilog中generate的用法
Verilog中generate的用法
3676 1
|
Kubernetes API Docker
Kubernetes (k8s 1.23) 安装与卸载
Kubernetes (k8s 1.23) 安装与卸载
328 1
|
10月前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
162 3
linux系统服务!!!
|
分布式计算 DataWorks 调度
DataWorks操作报错合集之DataWorks配置参数在开发环境进行调度,参数解析不出来,收到了 "Table does not exist" 的错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
216 0
|
存储 机器学习/深度学习 人工智能
Prompt、RAG、微调还是重新训练?如何选择正确的生成式AI的使用方法
生成式人工智能正在快速发展,许多人正在尝试使用这项技术来解决他们的业务问题。一般情况下有4种常见的使用方法:
553 0
|
Java 数据库
数据库|使用DTO进行查询时错误注意
数据库|使用DTO进行查询时错误注意
262 0
|
2天前
|
人工智能 运维 安全
|
4天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
380 124
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
7天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
649 107