如何在数据库同步中将数据库日志线×××易转化为并发载入数据库日志的记载是按照SCN号顺序记录的,虽然有时也有并发交易出现,导致日志中有SCN号交替出现的交易,但是对于已经发生的交易存在下面三个规律:
1、先提交的交易获得的SCN号较小
2、每个交易中的SCN号一致,这是区分交易的主键
3、SCN号是连续的,不存在SCN号在日志中不出现的情况
基于上面SCN号的规律,在数据库同步应用中我们抽取日志时为了提升抽取效率,我们采用了连续读入的方式,对于SCN号采用动态排序的方式。即取数据库日志的时候我们顺序读取SCN号,不过在没有得到提交SCN标志时,我们只是在内存按照链表进行记录,只有当读入提交标志的时候才更新链表,之后把链表中BEGIN和END之间的SQL语句写入文件,再把该链表元素删除,这样的话内存会动态增加/减少,对于大交易(每笔交易100万SQL语句以上)系统占用内存会很多,所以建议这部分交易最好是夜间进行,这就是许多金融、证券行业运行的批处理交易。
那么当我们向文件写入的时候就会出现大交易还没进行完,小的交易已经处理了很多笔的情况,我们取SCN号就会出现小交易的序号在前边,最后写的大交易在后面的情况,如何解决这样的问题,让分析组件能及时获得下一个SCN的位置呢?这就需要一个索引文件进行记录,类似文件分配表的ALLOC文件,内容很简单,包含三个元素:SCN号、文件名称、偏移量。这三个内容就能够为同步程序带来继初始化以来的所有交易SCN号的文件位置对应关系,并且利用固定长度我们可以把所有SCN号情况记录下来。因为分析组件必须按照SCN号顺序进行,除非该SCN号是DBA操作的DCL,其他情况必须严格顺序执行,否则就会出现同一张表顺序不同SQL语句执行导致数据错误的情况。
通过上面的转换,我们已经把主数据库的日志文件进行了顺序分析,并取得了两个文件,一个交易文件,一个是对应的SCN索引文件。下面分析组件就可以根据SCN号的顺序来产生装载文件,如果是顺序装载则直接按照SCN号顺序,发送SQL语句到备库执行即可。
但是如何作到并行装载的目标呢,这就要用到网格装载技术。即创建多个表装载队列,每个队列是按照SCN号顺序在该表执行的顺序,这样每个表装载进程就可以按照自身的同步内容独立执行,即使有大交易执行,只要没有和其他交易有相关的表操作,其他表的交易均可以提前于大交易执行到备库,这样就可以达到并行装载的目的。虽然可以提高效率,但是又带来了如何保证交易提交的原子性,这就必须引入网格断点技术,详见《如何保证目的端交易提交的原子性》
如何在同步过程中将数据库日志线×××易转化为并发载入
原创
©著作权归作者所有:来自51CTO博客作者woxintech的原创作品,请联系作者获取转载授权,否则将追究法律责任
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
sql server 数据库日志还原
角色是一个权限的集合,只要将用户加入到角色成员(给用户分配一个角色),就可以给这个用户分配这个角色所具有的全部权限。角色的出现极大的简化了权限的管理。
服务器角色 数据库角色 用户定义数据库角色 架构 -
数据库同步过程中如何解决大字段的同步
本文从技术角度分析了ORACLE数据库大对象类型的种类和各自特点,以及如何在数据库同步项目中考虑大对象字段的同步
数据库复制 数据库同步 数据库备份 数据库热备 沃信科技