LogMiner是集成在Oracle8i开始提供的用于日志分析工具,它包括DBMS_LOGMNR和DBMS_LOGMNR_D两个PACKAGE,通过该工具可以分析重做日志和归档日志中的所有事务变化,并能准确地确定各种DML和DDL操作的具体时间和SCN值。对重做日志和归档日志进行分析的目的是为了恢复由于执行了误操作而丢失的数据。
使用LogMiner可实现:①确定数据逻辑损坏的时间。例如,用户执行了DROP TABLE和TRUNCATE TABLE命令等误操作后,使用LogMiner可以准确定位执行这些误操作的具体时间。注意:Oracle8i只能还原DML操作,不能还原DDL操作;Oracle9i可以还原DDL以及DML操作。②跟踪用户执行的事务变化操作。使用LogMiner不仅可以跟踪用户所执行的各种DML操作和DDL操作,而且还可以取得数据变化。③跟踪表的DML操作,使用LogMiner可以跟踪在表上所发生的所有事务变化。
下面以Oracle10G for Windows 2003/NT为例说明如何使用LogMiner对重做日志和归档日志进行分析。本文进行的所有操作均在该环境下验证通过.
一、前提条件
必须是归档模式
SQL> archive log list
数据库日志模式存档模式
自动存档启用
存档终点c:\archived
最早的联机日志序列14
下一个存档日志序列16
当前日志序列16
二、生成归档日志
下面以分析TEST表的DDL和DML操作为例,介绍使用LogMiner分析重做日志和归档日志的全过程。我们首先执行以下语句在表TEST上执行DDL以及DML操作,并生成归档日志:
SQL> alter system switch logfile;
系统已更改。
SQL> create table test(id int);
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into test values(1);
已创建1行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> update test set id=100;
已更新1行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> delete from test;
已删除1行。
SQL> alter system switch logfile;
系统已更改。
三、参数配置
在日志分析过程会使用到数据字典,一般是先设置UTL_FILE_DIR参数删除数据字典文件,日后进行日志分析,当然在oracle10G中可使用在线数据字典,不需要设置UTL_FILE_DIR参数。
字典文件用于存放表及对象ID号之间的对应关系。当使用字典文件时,它会在表名和对象ID号之间建立一一对应的关系。因此需要注意,如果用户建立了新表之后,并且将来可能会对该表进行日志分析,那么就需要重新建立字典文件,以将其对象名及对象ID号存放到字典文件中。
修改参数文件
添加参数:UTL_FILE_DIR=C:\ logmnr目录logmnr必须事先手工建立,该目录用于存放产生的字典文件,目录名称可以自定
SQL> alter system set UTL_FILE_DIR='c:\logmnr' scope=spfile;
系统已更改。
重启数据库
重启之后参数设置才能生效。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup
ORACLE例程已经启动。
Total System Global Area167772160 bytes
Fixed Size1247900 bytes
Variable Size83887460 bytes
Database Buffers79691776 bytes
Redo Buffers2945024 bytes
数据库装载完毕。
数据库已经打开。
四、建立字典文件
在ORACLE 10G中可以使用在线数据字典。
SQL> begin
2dbms_logmnr_d.build(
3dictionary_filename=>'dict.ora',
4dictionary_location=>'c:\logmnr');
5end;
6/
PL/SQL过程已成功完成。
注意:参数dictionary_filename用以指定字典文件的文件名;参数dictionary_location用于指定存放字典文件所在的目录,该目录必须与初始化参数UTL_FILE_DIR的值一致。如果指定的字典文件名dict.ora已经存在,则应在执行此操作前将其彻底删除(从垃圾箱中删除),否则执行该过程将失败。
五、建立日志分析列表
查看重做日志文件
在对表TEST操作过程中,产生了4个重做日志文件。可通过时间查找重做日志文件。
SQL> select name,first_time,next_time from v$archived_log where first_time>to_da
te('2011-03-07 14:30:00','yyyy-mm-dd hh24:mi:ss');
NAMEFIRST_TIMENEXT_TIME
---------------------------------------- ------------------- -------------------
C:\ARCHIVED\ARC00012_0741453732.0012011-03-07 14:39:16 2011-03-07 14:39:45
C:\ARCHIVED\ARC00013_0741453732.0012011-03-07 14:39:45 2011-03-07 14:40:20
C:\ARCHIVED\ARC00014_0741453732.0012011-03-07 14:40:20 2011-03-07 14:41:10
C:\ARCHIVED\ARC00015_0741453732.0012011-03-07 14:41:10 2011-03-07 14:41:26
填加要分析的重做日志文件
SQL> begin
2dbms_logmnr.add_logfile(
3options=>dbms_logmnr.new,
4logfilename=>'c:\archived\ARC00012_0741453732.001');
5end ;
6/
PL/SQL过程已成功完成。
SQL>begin
2dbms_logmnr.add_logfile(
3options=>dbms_logmnr.addfile,
4logfilename=>'c:\archived\ARC00013_0741453732.001');
5end;
6/
PL/SQL过程已成功完成。
另外两个文件以此方法添加,但是options参数的值必须是dbms_logmnr.addfile,使用dbms_logmnr.new,则会覆盖之前添加的日志文件,视图v$logmnr_logs只能查看最后一次添加的日志文件。
添加完成后可以通过动态性能视图v$logmnr_logs查看日志分析列表中有哪些待分析的日志文件。
SQL> select filename from v$logmnr_logs;
FILENAME
------------------------------------------------------------------------------
c:\archived\ARC00012_0741453732.001
c:\archived\ARC00013_0741453732.001
c:\archived\ARC00014_0741453732.001
c:\archived\ARC00015_0741453732.001
如果有很多的日志文件需要分析,可把每次分析的结果存储到物理表中,分批次进行分析。
六、启动LogMiner执行分析
分析重做日志和归档日志
三种分析方法
1、直接分析
SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'c:\logmnr\dict.ora');
PL/SQL过程已成功完成。
2、提取特定时间的日志,也可以是SCN.
SQL>begin
dbms_logmnr.start_logmnr(
dictfilename=>'c:\logmnr\dict.ora',
starttime=>to_date('2011-03-07 14:39:16','yyyy-mm-dd hh24:mi:ss'),
endtime=>to_date('2011-03-07 14:41:10','yyyy-mm-dd hh24:mi:ss'));
end;
/
PL/SQL过程已成功完成。
3、使用在线数据字典:
SQL>exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
PL/SQL过程已成功完成。
查看日志分析结果
SQL> select scn,operation,sql_redo,sql_undo from v$logmnr_contents WHEREseg_na
me='TEST';
SCN OPERATIO SQL_REDOSQL_UNDO
---------- -------- ------------------------------ --------------------
1378844 DDLcreate table test(id int);
1378862 INSERTinsert into "SYS"."TEST"("ID") delete from "SYS"."T
values ('1');EST" where "ID" = '1
' and ROWID = 'AAAMs
cAABAAAO7iAAA';
1378906 UPDATEupdate "SYS"."TEST" set "ID" = update "SYS"."TEST"
'100' where "ID" = '1' and RO set "ID" = '1' where
WID = 'AAAMscAABAAAO7iAAA';"ID" = '100' and RO
WID = 'AAAMscAABAAAO
7iAAA';
通过结果得到对表TEST所做DDL和DML操作的准确时间,以及数据的变化情况,对数据库的恢复和审计等提供准确、有效的参考信息。
注意:v$logmnr_contents内容保存了日志的内容,只在当前会话有效,如果想长期保存分析,可以在当前会话用create table tablename as select * from v$logmnr_contents语句来持久保存。
七、结束分析,释放PGA内存资源
SQL> exec dbms_logmnr.end_logmnr;
PL/SQL过程已成功完成。