论文部分内容阅读
摘要:基于日志分析的数据还原操作的设计增加了一种关于Oracle分布式数据库的同步方法,在不增加前台应用程序的前提下,通过对数据库进行日志分析,使分数据库与主节点数据库达到同步的效果。本文通过对LogMiner工具的详细介绍,并结合實际对Oracle数据库归档日志文件进行分析和还原DML语句的设计后,最终达到分布式数据库进行同步的效果。
关键词:Oracle;日志分析;LogMiner;数据还原
中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)03-10626-03
1 引言
在Oracle8i版本以后增加了一个新的工具,即LogMiner。该工具是为了解决通过分析重做日志和归档日志的所有事务变化,并且能够准确获得各种DML、DDL操作的数据变化提交时间、元操作语句以及SCN值。笔者在分布式数据库环境中,在分接点使用LogMiner的强大分析功能对数据操作进行还原,然后形成文件后进行传输到主接点库,执行后做到数据库的良好同步。
2 设计思想和关键技术
主要利用LogMiner的强大的分析功能,还原出元操作,进而做还原或者重做操作的语句集,依次用来达到分布式数据库同步和误操作的恢复的作用。其关键技术是如何确定分析日志的范围,如何还原出元操作的重做语句以及回滚语句,如何做到分析后的元语句转换成可以在数据库上进行操作的语句等等。
通过LogMiner分析oracle日志主要分析两类日志:归档日志和重做日志,由于重做日志为实施联机状态,故本文假设在使用LogMiner进行分析的时候先进行强制归档,然后通过分析归档日志来还原元操作。
3 Oracle日志的介绍及分析
Oracle数据库主要由控制文件、数据文件、重做日志文件、参数文件、归档文件、口令文件组成,其中重做日志文件和归档文件记录所有数据库操作,保证数据库的完整性和安全性。Oracle数据库所使用的一组重做日志中至少需要包含两个重做日志文件组。只有当某个事务所产生的重做记录全部被写入重做日志文件之后,Oracle才认为这个事务已经成功提交.重做记录也可能会在事务提交之前就写入重做日志文件。由于重做日志是循环使用的,所以当重做日志组在写满的时候,数据库在归档模式下会将重做日志的内容写入归档日志文件,即归档文件是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
在重做日志文件没有写满的时候也可以将内容通过强制归档的方式写入归档日志文件,所以对归档日志的分析是本文的重点。下面这些图示为显示SQL语句如果在数据库上执行并被写入重做日志文件和归档日志文件。
图1主要表示SQL的DML语句如何被服务进程所执行,调用数据文件、控制文件、重做日志文件中的信息,在SGA中数据缓冲区、重做日志缓冲区中处理。
图1
图2主要表示在处理过SQL的DML操作后,有LGWR进程(重做写进程)将操作日志写入日志组,有ARCH进程(归档进程)将日志组中的信息写入归档日志文件中。
图2
4 LogMiner工具的介绍及使用
Oracle LogMiner是Oracle公司在产品8i、9i、10g中均提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重作日志文件(归档日志文件)中的具体内容,特别是,该工具可以分析出所有对于数据库操作的DML、DDL语句,还可分析得到一些必要的回滚、重做SQL语句。该工具特别适用于调试、审计或者回退某个特定的事务。
4.1 LogMiner工具的安装
在Oracle8i上要安装LogMiner工具,必须首先要运行下面两个脚本:
(1)$oracle_home/rdbms/admin/dmslm.sql
(2)$oracle_home/rdbms/admin/dbmslmd.sql
在Oracle9i以及10g上已经不再需要这样创建了,因为LogMiner已经创建好了。
4.2 LogMiner分析的过程
LogMiner分析日志文件主要分类2类:分析重做日志文件、分析归档日志文件,由于原理及方法基本相同,本文主要通过分析归档日志文件来介绍分析过程。应用LogMiner分析重做日志文件的操作如下:
(1)创建外部数据字典文件;
(2)产生数据库操作;
(3)为分析指定日志文件;
(4)分析日志文件内容;
(5)关闭LogMiner。
4.2.1 创建外部数据字典文件
使用LogMiner时,需要建立数据字典,用于将对象ID号和数据类型转变成对象名和外部数据格式。如果不使用LogMiner字典,则无法读懂LogMiner分析的结果,如下图:
为了避免生成不可读取的DML和DDL格式,当使用LogMiner分析重做日志和归档日志时,需要使用LogMiner字典将对象ID号转变为对象名。在数据库实例ywsb下创建数据字典的过程如下:
(1)设置字典文件的目录
需要设置初始化参数UTL_FILE_DIR。通过设置此参数,可以指定Oracle要访问的I/O目录,在Initywsb.ora中增加如下设置:
UTL_FILE_DIR=/oradata/ywsb/LogMiner
(2)重启数据库
由于这个新参数不是动态数据库参数,故需要重新启动数据库才能使设置生效。
CMD>sqlplus /nolog
SQL>connect sys/manager@ywsb as sysdba
SQL>shutdown immediate
SQL>startup pfile=%oracle_home%\database\initywsb.ora
(3)创建字典文件
创建字典文件方法如下:
SQL>EXECUTE Dbms_logmnr_d.build(-
Dictionary_filename => ‘dictionary.ora’,Dictionary_location => ‘/oradata/ywsb/LogMiner’,Dbms_logmnr_d.store_in_flat_file);
其中Dictionary_filename是指定字典文件名;Dictionary_location是指定字典文件所在的目录,此目录要与UTL_FILE_DIR参数设置匹配;Dbms_logmnr_d.store_in_flat_file是表示要创建字典文件,为默认值。此过程执行后,字典生成在D:\oracle\oradata\ywsb\LogMiner目录下的dictionary.ora里。
4.2.2 为分析指定日志文件
由于本文主要侧重对归档日志文件的分析,故在分析之前需要对数据库进行强制归档,即将数据库进行强制日志切换:alter system switch logfile;下面解决如何确定分析日志范围的问题。由于只需要分析归档日志文件,我们可以建立一个表单独对应日志文件名以及是否已经分析过的标志,依此来判断那些归档日志文件已经进行过分析,我们只需要对未分析过的日志文件调用LogMiner,来还原数据操作即可。通过查
询V$ARCHIVED_LOG表中提取出所有归档日志文件,由于提取的是一批日志文件,则可以通过cursor,将日志文件名存入游标中。
cursor c_listlog is
select name from V$ARCHIVED_LOG;
打开cursor c_listlog,将提取的列表fetch到变量中;
fetch c_listlog into ls_loglistname
然后查询这些日志列表是否已经存在于ARCHIVED_LOG表(新建立表,主要为了存放处理日志文件的列表),将这些未分析过的日志文件逐条插入进ARCHIVED_LOG表,然后进行逐条的提取,提取出将要分析的文件名,进行分析。
其中,ARCHIVED_LOG表中提取数据后包含如下类似据:
LogMiner分析日志主要使用Dbms_logmnr. add_logfile将日志文件加入到分析队列:
dbms_logmnr.add_logfile(options=>dbms_logmnr.new,logfilename=> ls_loglistname);其中第一个参数dbms_logmnr.new,是用来创建将要分析的文件新列表的。第二个参数是新增加的日志文件,经过dbms_logmnr.add_logfile处理后,从V$ARCHIVED_LOG中提取出将要从日志文件提取的DDL和DML操作的起始时间、结束时间、起始SCN和结束SCN。
Select low_time,high_time,low_scn, next_scn into ld_starttime,ld_endtime,ll_startscn,
ll_endscn from v$logmnr_logs;
然后执行Dbms_logmnr.start_logmnr开始分析日志文件,这时候需要传入从V$ARCHIVED_LOG中提取出来的参数。方法如下:
dbms_logmnr.start_logmnr(dictfilename=>'d:\oracle\ywsb\logm
nr\dictionary.ora ',starttime => ld_ starttime, endTime=>ld_ endtim
e,startscn=>ll_ startscn,endscn=>ll_ endscn);
分析后的,可以通過V$logmnr.contents查询重做日志的内容即可。V$logmnr_contents视图中包含以下列:
5 建立重做语句文件
由于在logmnr_contents表中,主要存在如下列对我们有用:
此时,将元操作已经完全提取到logmnr_contents表中,对sql_redo进行分类转换,主要分类原则是根据操作类型,insert、update 、delete的不同进行转换,转换时要选择恰当的转换条件,保证原有数据操作的原汁原味。将转换过后的sql_redo写入到外部的文件中以备执行。转换方法如下:
(1)insert语句可以直接使用;
(2)update语句需要做一些更改,既where条件需要作进一步确定,其主要是依靠所在表的主键信息以及日志分析结果的rowid信息取出主健值替换原来的where条件,提取rowid的方法为:select substr(ls_sql,-20,18) into ls_rowid from dual;分析主键值的方法为从rowid确定为对那个表操作,然后在元数据库表中查询到此表的主键值及rowid对应的主键条数,对应为1条的情况下,继续提取出对应的主键名和主键值,这时候就确定update语句的where条件。
(3)delete语句的处理方法为只需要将sql_redo语句中的rowid信息删除即可。根据如上转换方法后,即可将数据库上的所有的某时间段的所有的元操作进行还原,并且将还原出来的DML语句写入到文件中,可以将此文件传输到分布式数据库主节点库后进行执行后使得在主节点数据库上包含有各个分数据库的所有的操作。
6 总结
这种基于日志分析的数据还原操作的设计增加了一种基于ORACLE分布式数据库的同步方法,在不增加前台应用程序的前提下,通过对数据库进行日志分析,使分数据库与主节点数据库达到同步的效果,比较适用于非实时性业务的同步。在笔者单位使用这种设计方法运行有半年,已经取得了良好的效果。即节省了资金也达到了预期目的。
参考文献:
[1]王海亮,王海凤,等.精通Oracle10g备份与恢复[M].中国水利水电出版社,82-90,295-307.
[2]Lanes L.Morris-Murphy.Oracle9i 数据库管理员Ⅱ:备份/恢复与网络管理[M].清华大学出版社,100-123.
[3]陈雪,浅谈Oracle9i如何管理控制文件和日志文件[J].(福建工程学院计算机系 350014)科技交流,2006年05期,科技篇.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:Oracle;日志分析;LogMiner;数据还原
中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)03-10626-03
1 引言
在Oracle8i版本以后增加了一个新的工具,即LogMiner。该工具是为了解决通过分析重做日志和归档日志的所有事务变化,并且能够准确获得各种DML、DDL操作的数据变化提交时间、元操作语句以及SCN值。笔者在分布式数据库环境中,在分接点使用LogMiner的强大分析功能对数据操作进行还原,然后形成文件后进行传输到主接点库,执行后做到数据库的良好同步。
2 设计思想和关键技术
主要利用LogMiner的强大的分析功能,还原出元操作,进而做还原或者重做操作的语句集,依次用来达到分布式数据库同步和误操作的恢复的作用。其关键技术是如何确定分析日志的范围,如何还原出元操作的重做语句以及回滚语句,如何做到分析后的元语句转换成可以在数据库上进行操作的语句等等。
通过LogMiner分析oracle日志主要分析两类日志:归档日志和重做日志,由于重做日志为实施联机状态,故本文假设在使用LogMiner进行分析的时候先进行强制归档,然后通过分析归档日志来还原元操作。
3 Oracle日志的介绍及分析
Oracle数据库主要由控制文件、数据文件、重做日志文件、参数文件、归档文件、口令文件组成,其中重做日志文件和归档文件记录所有数据库操作,保证数据库的完整性和安全性。Oracle数据库所使用的一组重做日志中至少需要包含两个重做日志文件组。只有当某个事务所产生的重做记录全部被写入重做日志文件之后,Oracle才认为这个事务已经成功提交.重做记录也可能会在事务提交之前就写入重做日志文件。由于重做日志是循环使用的,所以当重做日志组在写满的时候,数据库在归档模式下会将重做日志的内容写入归档日志文件,即归档文件是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
在重做日志文件没有写满的时候也可以将内容通过强制归档的方式写入归档日志文件,所以对归档日志的分析是本文的重点。下面这些图示为显示SQL语句如果在数据库上执行并被写入重做日志文件和归档日志文件。
图1主要表示SQL的DML语句如何被服务进程所执行,调用数据文件、控制文件、重做日志文件中的信息,在SGA中数据缓冲区、重做日志缓冲区中处理。
图1
图2主要表示在处理过SQL的DML操作后,有LGWR进程(重做写进程)将操作日志写入日志组,有ARCH进程(归档进程)将日志组中的信息写入归档日志文件中。
图2
4 LogMiner工具的介绍及使用
Oracle LogMiner是Oracle公司在产品8i、9i、10g中均提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重作日志文件(归档日志文件)中的具体内容,特别是,该工具可以分析出所有对于数据库操作的DML、DDL语句,还可分析得到一些必要的回滚、重做SQL语句。该工具特别适用于调试、审计或者回退某个特定的事务。
4.1 LogMiner工具的安装
在Oracle8i上要安装LogMiner工具,必须首先要运行下面两个脚本:
(1)$oracle_home/rdbms/admin/dmslm.sql
(2)$oracle_home/rdbms/admin/dbmslmd.sql
在Oracle9i以及10g上已经不再需要这样创建了,因为LogMiner已经创建好了。
4.2 LogMiner分析的过程
LogMiner分析日志文件主要分类2类:分析重做日志文件、分析归档日志文件,由于原理及方法基本相同,本文主要通过分析归档日志文件来介绍分析过程。应用LogMiner分析重做日志文件的操作如下:
(1)创建外部数据字典文件;
(2)产生数据库操作;
(3)为分析指定日志文件;
(4)分析日志文件内容;
(5)关闭LogMiner。
4.2.1 创建外部数据字典文件
使用LogMiner时,需要建立数据字典,用于将对象ID号和数据类型转变成对象名和外部数据格式。如果不使用LogMiner字典,则无法读懂LogMiner分析的结果,如下图:
为了避免生成不可读取的DML和DDL格式,当使用LogMiner分析重做日志和归档日志时,需要使用LogMiner字典将对象ID号转变为对象名。在数据库实例ywsb下创建数据字典的过程如下:
(1)设置字典文件的目录
需要设置初始化参数UTL_FILE_DIR。通过设置此参数,可以指定Oracle要访问的I/O目录,在Initywsb.ora中增加如下设置:
UTL_FILE_DIR=/oradata/ywsb/LogMiner
(2)重启数据库
由于这个新参数不是动态数据库参数,故需要重新启动数据库才能使设置生效。
CMD>sqlplus /nolog
SQL>connect sys/manager@ywsb as sysdba
SQL>shutdown immediate
SQL>startup pfile=%oracle_home%\database\initywsb.ora
(3)创建字典文件
创建字典文件方法如下:
SQL>EXECUTE Dbms_logmnr_d.build(-
Dictionary_filename => ‘dictionary.ora’,Dictionary_location => ‘/oradata/ywsb/LogMiner’,Dbms_logmnr_d.store_in_flat_file);
其中Dictionary_filename是指定字典文件名;Dictionary_location是指定字典文件所在的目录,此目录要与UTL_FILE_DIR参数设置匹配;Dbms_logmnr_d.store_in_flat_file是表示要创建字典文件,为默认值。此过程执行后,字典生成在D:\oracle\oradata\ywsb\LogMiner目录下的dictionary.ora里。
4.2.2 为分析指定日志文件
由于本文主要侧重对归档日志文件的分析,故在分析之前需要对数据库进行强制归档,即将数据库进行强制日志切换:alter system switch logfile;下面解决如何确定分析日志范围的问题。由于只需要分析归档日志文件,我们可以建立一个表单独对应日志文件名以及是否已经分析过的标志,依此来判断那些归档日志文件已经进行过分析,我们只需要对未分析过的日志文件调用LogMiner,来还原数据操作即可。通过查
询V$ARCHIVED_LOG表中提取出所有归档日志文件,由于提取的是一批日志文件,则可以通过cursor,将日志文件名存入游标中。
cursor c_listlog is
select name from V$ARCHIVED_LOG;
打开cursor c_listlog,将提取的列表fetch到变量中;
fetch c_listlog into ls_loglistname
然后查询这些日志列表是否已经存在于ARCHIVED_LOG表(新建立表,主要为了存放处理日志文件的列表),将这些未分析过的日志文件逐条插入进ARCHIVED_LOG表,然后进行逐条的提取,提取出将要分析的文件名,进行分析。
其中,ARCHIVED_LOG表中提取数据后包含如下类似据:
LogMiner分析日志主要使用Dbms_logmnr. add_logfile将日志文件加入到分析队列:
dbms_logmnr.add_logfile(options=>dbms_logmnr.new,logfilename=> ls_loglistname);其中第一个参数dbms_logmnr.new,是用来创建将要分析的文件新列表的。第二个参数是新增加的日志文件,经过dbms_logmnr.add_logfile处理后,从V$ARCHIVED_LOG中提取出将要从日志文件提取的DDL和DML操作的起始时间、结束时间、起始SCN和结束SCN。
Select low_time,high_time,low_scn, next_scn into ld_starttime,ld_endtime,ll_startscn,
ll_endscn from v$logmnr_logs;
然后执行Dbms_logmnr.start_logmnr开始分析日志文件,这时候需要传入从V$ARCHIVED_LOG中提取出来的参数。方法如下:
dbms_logmnr.start_logmnr(dictfilename=>'d:\oracle\ywsb\logm
nr\dictionary.ora ',starttime => ld_ starttime, endTime=>ld_ endtim
e,startscn=>ll_ startscn,endscn=>ll_ endscn);
分析后的,可以通過V$logmnr.contents查询重做日志的内容即可。V$logmnr_contents视图中包含以下列:
5 建立重做语句文件
由于在logmnr_contents表中,主要存在如下列对我们有用:
此时,将元操作已经完全提取到logmnr_contents表中,对sql_redo进行分类转换,主要分类原则是根据操作类型,insert、update 、delete的不同进行转换,转换时要选择恰当的转换条件,保证原有数据操作的原汁原味。将转换过后的sql_redo写入到外部的文件中以备执行。转换方法如下:
(1)insert语句可以直接使用;
(2)update语句需要做一些更改,既where条件需要作进一步确定,其主要是依靠所在表的主键信息以及日志分析结果的rowid信息取出主健值替换原来的where条件,提取rowid的方法为:select substr(ls_sql,-20,18) into ls_rowid from dual;分析主键值的方法为从rowid确定为对那个表操作,然后在元数据库表中查询到此表的主键值及rowid对应的主键条数,对应为1条的情况下,继续提取出对应的主键名和主键值,这时候就确定update语句的where条件。
(3)delete语句的处理方法为只需要将sql_redo语句中的rowid信息删除即可。根据如上转换方法后,即可将数据库上的所有的某时间段的所有的元操作进行还原,并且将还原出来的DML语句写入到文件中,可以将此文件传输到分布式数据库主节点库后进行执行后使得在主节点数据库上包含有各个分数据库的所有的操作。
6 总结
这种基于日志分析的数据还原操作的设计增加了一种基于ORACLE分布式数据库的同步方法,在不增加前台应用程序的前提下,通过对数据库进行日志分析,使分数据库与主节点数据库达到同步的效果,比较适用于非实时性业务的同步。在笔者单位使用这种设计方法运行有半年,已经取得了良好的效果。即节省了资金也达到了预期目的。
参考文献:
[1]王海亮,王海凤,等.精通Oracle10g备份与恢复[M].中国水利水电出版社,82-90,295-307.
[2]Lanes L.Morris-Murphy.Oracle9i 数据库管理员Ⅱ:备份/恢复与网络管理[M].清华大学出版社,100-123.
[3]陈雪,浅谈Oracle9i如何管理控制文件和日志文件[J].(福建工程学院计算机系 350014)科技交流,2006年05期,科技篇.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。