分享

如何在同步过程中将数据库日志线性交易转化为并发载入

 woxintech 2012-06-07
如何在数据库同步中将数据库日志线性交易转化为并发载入数据库日志的记载是按照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号顺序在该表执行的顺序,这样每个表装载进程就可以按照自身的同步内容独立执行,即使有大交易执行,只要没有和其他交易有相关的表操作,其他表的交易均可以提前于大交易执行到备库,这样就可以达到并行装载的目的。虽然可以提高效率,但是又带来了如何保证交易提交的原子性,这就必须引入网格断点技术,详见《如何保证目的端交易提交的原子性》

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多