我了解的数据库事务复制

简介:

事务复制

事务复制的基本机制,在联机文档上也有介绍。

基本原理


 

如图,主要依靠2个代理,1.日志读取代理(log reader agent),2.分发代理(distribution agent)

其中log reader agent,负责从发布数据库上读取日志并且写入到分发数据库(distribution)中。然后distribution agent负责从distribution读取数据并且写入到订阅中。

Log Reader Agent


profiler,使用tsql模板即可。在已经有复制环境的状态下,对发布项目执行:

BEGIN TRAN

go

INSERT INTO dbo.rename_sc DEFAULT VALUES

GO 10

COMMIT

最主要的部分:

如图,Log Reader Agent使用会话55去发布库的日志上读取事务,如果发现有需要分发的,那么会调用sp_MSadd_replcmds,这个存储过程会把抓到的指令存放到dbo.MSrepl_commandsMSrepl_transactions2个表中。然后就会使用过程sp_repldone标记事务已经被复制。

 

SELECT spid,program_name FROM sys.sysprocesses WHERE spid IN( 57,55)

 

sql server中查询sys.sysprocesses 2spid 会发现program_name='Repl-LogReader-0-p1-9

也就是log reader agentsql server 上有2个会话一个负责读,一个负责写。这样Log Reader Agent的一次读取完成。

Distribution Agent


Log Reader Agent写入完之后就是有Distribution Agent 把事务应用到订阅库。

获取事务

在存储过程sys.sp_MSget_repl_commands对表dbo.MSrepl_commands读取,之后就是在订阅服务器上面运行sp_MSins命令。

仔细观察其实不难发现msrepl_command表中存的是明码,通过和sp_browsereplcmds对比就能发现,那么也就是说其实在插入MSrepl_commands的时候就已经知道了。

但是这里有个问题Agent是怎么知道要调用这个存储过程的。

 

 

 在这里会注意到有2个不同的会话在处理,一个负责读,一个负责写入,其中65负责从分发库中读取,51负责应用到订阅库

SELECT spid,program_name FROM sys.sysprocesses WHERE spid IN( 65 ,51)

修改订阅

最后会修改订阅服务器中的MSreplication_subscriptions中的一些字段,其中最终要的是timestamp,这个字段表示现在订阅已经应用到了那个事务。奇特的事情又出现,会发现有2update语句。不知道是不是为了版本兼容。

UPDATE  MSreplication_subscriptions

SET     transaction_timestamp = CAST(@P1 AS BINARY(15))

        + CAST(SUBSTRING(transaction_timestamp, 16, 1) AS BINARY(1)) ,

        "time" = @P2

WHERE   UPPER(publisher) = UPPER(@P3)

        AND publisher_db = @P4

        AND publication = @P5

        AND subscription_type = 1

        AND( SUBSTRING(transaction_timestamp, 16, 1) = 0

              OR DATALENGTH(transaction_timestamp) < 16

            )

 

UPDATE  MSreplication_subscriptions

SET     transaction_timestamp = CAST(@P1 AS BINARY(15))

        + CAST(CASE DATALENGTH(transaction_timestamp)

                 WHEN 16

                 THEN ISNULL(SUBSTRING(transaction_timestamp, 16, 1), 0)

                 ELSE 0

               END AS BINARY(1)) ,

        "time" = @P2

WHERE   UPPER(publisher) = UPPER(@P3)

        AND publisher_db = @P4

        AND publication = @P5

        AND subscription_type = 1

Distribution Agent完成一次分发。




    本文转自 Fanr_Zh 博客园博客,原文链接:http://www.cnblogs.com/Amaranthus/p/4271522.html,如需转载请自行联系原作者




相关文章
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
135 5
|
3月前
|
中间件 关系型数据库 Go
Go语言数据库编程:数据迁移与事务控制
本文介绍了《Go语言实战指南》中关于数据库编程的核心内容,涵盖使用 GORM 进行数据迁移与事务控制。主要内容包括:AutoMigrate 方法自动创建或更新表结构;事务控制的自动与手动实现方式;事务隔离级别的设置;以及在 Gin 框架中统一管理事务的实践建议。适合开发阶段的数据库结构管理和事务性操作需求。
|
11月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
6月前
|
SQL 数据库 索引
【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
152 0
|
9月前
|
SQL 存储 Java
数据库———事务及bug的解决
事务的一些概念,并发事务以及并发事务引起的bug,脏读,不可重复读,幻读,数据库中的隔离级别,事务的简单应用
|
存储 SQL 关系型数据库
数据库事务:确保数据完整性的关键20
【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。
292 70
|
11月前
|
数据库
什么是数据库的事务隔离级别,有什么作用
【10月更文挑战第21】什么是数据库的事务隔离级别,有什么作用
165 3
|
11月前
|
存储 关系型数据库 数据挖掘
什么是数据库的事务隔离级别
【10月更文挑战第21】什么是数据库的事务隔离级别
254 1
|
11月前
|
存储 数据库 数据库管理
数据库事务安全性控制如何实现呢
【10月更文挑战第15天】数据库事务安全性控制如何实现呢

热门文章

最新文章