`

oracle 数据库双向复制(解析redolog实现)

阅读更多

      纵观当前的数据复制产品,为shareplex为最牛,它自己捕捉了oracle redo log的文件内容的变化,然后将数据的变化传输于对方,通过tcp/ip协议和socket技术,仅仅依赖于数据库的redo log文件,不通过数据库本身,节省了数据库的资源.

      由于我们无法监视redo log文件的变化,所以我们无法获得redo log的内容,而且redo log文件内容加密,我们无法解密,所以我的想法是通过logminer来解析oracle的redo log,利用logminer的优点是:
1.我们可以传入当前的redo log解析,准实时的获得DML语句.
2.我们再解析redo log的时候可以加上时间和SCN的约束,使logminer的解析加快.
3.获得SQL语句,使放在SGA区的,随着下一次的解析或者程序的退出,动态表的数据也会丢失,也就是基于session级,因此不必害怕数据的不正确.
缺点:
1.logminer安装包仅仅再oracle8i以后才有,所以以前的,必须手动copy安装.
2.获得sql的时间是准实时的,速度比shareplex较慢.
3.依赖于数据库,需要对数据库的初始话参数修改.
既然说道了logminer,我就列出其安装过程:
要安装LogMiner工具,必须首先要运行下面这样两个脚本,
l $ORACLE_HOME/rdbms/admin/dbmslm.sql
2 $ORACLE_HOME/rdbms/admin/dbmslmd.sql.
创建数据字典的目的就是让LogMiner引用涉及到内部数据字典中的部分时为他们实际的名字,而不是系统内部的16进制。数据字典文件是一个文本文件, 使用包DBMS_LOGMNR_D来创建。如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,这时就需要重新创建该字典文件。另外一种 情况是在分析另外一个数据库文件的重作日志时,也必须要重新生成一遍被分析数据库的数据字典文件。
  首先在init.ora初始化参数文件中,指定数据字典文件的位置,也就是添加一个参数UTL_FILE_DIR,该参数值为服务器中放置数据字典文件的目录。如:
  UTL_FILE_DIR = (e:\Oracle\logs)

   重新启动数据库,使新加的参数生效,然后创建数据字典文件:
  SQL> CONNECT SYS
  SQL> EXECUTE dbms_logmnr_d.build(
  dictionary_filename => ' v816dict.ora',
  dictionary_location => 'e:\oracle\logs');
2、创建要分析的日志文件列表
  >  Oracle的重作日志分为两种,在线(online)和离线(offline)归档日志文件,下面就分别来讨论这两种不同日志文件的列表创建。
  (1)分析在线重作日志文件
  A. 创建列表
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' e:\Oracle\oradata\sxf\redo01.log',
  Options=>dbms_logmnr.new);
  B. 添加其他日志文件到列表
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' e:\Oracle\oradata\sxf\redo02.log',
  Options=>dbms_logmnr.addfile);(2)分析离线日志文件
  A.创建列表
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' E:\Oracle\oradata\sxf\archive\ARCARC09108.001',
  Options=>dbms_logmnr.new);
  B.添加另外的日志文件到列表
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' E:\Oracle\oradata\sxf\archive\ARCARC09109.001',
  Options=>dbms_logmnr.addfile);关于这个日志文件列表中需要分析日志文件的个数完全由你自己决定,但这里建议最好是每次只添加一个需要分析的日志文件,在对该文件分析完毕后,再添加另外的文件。
  和添加日志分析列表相对应,使用过程 'dbms_logmnr.removefile' 也可以从列表中移去一个日志文件。下面的例子移去上面添加的日志文件e:\Oracle\oradata\sxf\redo02.log。
  SQL> EXECUTE dbms_logmnr.add_logfile(
  LogFileName=>' e:\Oracle\oradata\sxf\redo02.log',
  Options=>dbms_logmnr. REMOVEFILE);
  创建了要分析的日志文件列表,下面就可以对其进行分析了。
3、使用LogMiner进行日志分析
  (1)无限制条件
  SQL> EXECUTE dbms_logmnr.start_logmnr(
  DictFileName=>' e:\oracle\logs\ v816dict.ora ');
  (2)有限制条件
  通过对过程DBMS_ LOGMNR.START_LOGMNR中几个不同参数的设置(参数含义见表1),可以缩小要分析日志文件的范围。通过设置起始时间和终止时间参数我们可 以限制只分析某一时间范围的日志。如下面的例子,我们仅仅分析2001年9月18日的日志,:
  SQL> EXECUTE dbms_logmnr.start_logmnr(
  DictFileName => ' e:\oracle\logs\ v816dict.ora ',
  StartTime => to_date('2001-9-18 00:00:00','YYYY-MM-DD HH24:MI:SS')
  EndTime => to_date(''2001-9-18 23:59:59','YYYY-MM-DD HH24:MI:SS '));
  也可以通过设置起始SCN和截至SCN来限制要分析日志的范围:
  SQL> EXECUTE dbms_logmnr.start_logmnr(
  DictFileName => ' e:\oracle\logs\ v816dict.ora ',
  StartScn => 20,
  EndScn => 50);
4、观察分析结果(v$logmnr_conte
nts)
  到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。
  SELECT sql_redo FROM v$logmnr_contents;
  如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户DB_ZGXT对表SB_DJJL所作的一切工作。
  SQL> SELECT sql_redo FROM v$logmnr_contents WHERE username='DB_ZGXT' AND tablename='SB_DJJL';

安装完logminer,我们就可以获得变化的DML SQL语句,那么我们就可以通过occi或者proc去获得变化的sql语句,通过unix c解析config的文件,congfig文件中记载了表名和数据库的源端和目标端信息以及解析的其他条件.
使用occi或proc的目的是加快速度,利用unxi c解析配置文件也是提高速度.
到此为止,一个数据复制的工具产生.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics