Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2638766
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(389)

分类: Oracle

2013-08-16 22:10:16

                                                                                  同步oracle表到Timesten表的基本原理

        在创建timesten(简称TT)到oracle的同步基础架构时,先需要创建cacheadm和ttuser的用户和表空间并进行相应的授权。假设在oracle中存在一个表t1(a integer primary key)
在tt中创建cache groups的时候,需要连接到oracle中,然后会在T1上创建一个tt_nn__t的DML触发器,并且创建 一个名为tt_nn__l的日志表,这些表对像所有者都是
cacheadm,log表的两个很重要的字段logseq(有索引)和基表的主键(如t1.a),如果是第一次创建cache group时,还会创建tt_nn_agent_status等其他的表

        对于每次在基表T1上执行DML时,触发器会往日志表里insert记录的主键和增加logseq(所以基表必需要有主键)。可能在一个刷新周期内会对同一行有多次update,
不过这都不是问题,对timesten的insert只要一次就可以了。

  TT的cache agent会启动几个thread来处理从oracle中刷新的数据.如下
[timesten@master1 ~]$ ttstatus | grep Cache
Cache Agent     30451   0x0000000010191340  Handler                           4
Cache Agent     30451   0x00000000102df130  Timer                            26
Cache Agent     30451   0x0000000010392ae0  LogSpaceMon(1098361152)          53
Cache Agent     30451   0x00000000106f7060  Marker(1103808832)               57
Cache Agent     30451   0x000000001095f0e0  BMReporter(1099450688)           58
Cache Agent     30451   0x00002aac8826edf0  Refresher(S,30000)               55
Cache Agent     30451   0x00002aac88393f80  Refresher(S,3000)                56

      时钟发生器timer根据定义的interval通知其他thread什么时候开始执行。marker线程,识别log表中的新加行,与tt_nn_agent_status连接,哪些行需要被处理,如之前提到的
在一个间隔期内多次更新,最后到TT中需要一次更新.Refresher线程对log表和基表做一个merge into操作,根据是更新还是insert,在tt中的相应表
进行操作,所以这也是为什么cacheadm用户必须要有对tt中的基表有dml权限.BMReporter主要是更新tt_nn_agent_status,每一个DSN的cache group都
在此表中有一行,用来表示已经更新到哪一个seq了。LogSpaceMon识别了哪些行已经被处理,然后删除日志表中对应的行.


       在这里最重要的一个操作就是Refresher线程对log表和基表做一个merge into操作,所以基表要有主键(如果表很大,索引坏了,可能引发很严重的性能问题)。如果日志表非常大,也会有
性能问题(日志表对应基表的字段没有索引).这种情况一般是日志表没有及时被清理所造成,更进一步的原因是对应多个DSN,有些DSN的cacheagent停止了或是直接就删除了DSN,而没有先删除cachegroup,都会使日志表记录累积起来从而影响性能.有时候一些cachegroup的刷新时间太短了,一个刷新操作没有完成另一个刷新操作就开始了,从而占用很多CPU资源.可以通过ttautorefreshstatsget来查看刷新间隔和每次刷新所需要的时间.


        对于性能优化主要考虑:尽量保持基表在内存中,可以使用表的cache属性或是放到keep池里;对于触发器,如有必要可以使用dbms_shared_pool.pin;对于很大的基表可以考虑使用分区或是并行执行来提高效率.


        一般的监控操作,可以使用tttracemon 的autorefresh组件来进行跟踪。

         还有一些其他的同步方法,比如Goldengate。

阅读(8311) | 评论(0) | 转发(0) |
0

上一篇:1z052-04

下一篇:1z052-05

给主人留下些什么吧!~~