平台:redhat linux as5,oracle10g,logminer
1、简单介绍:
logminer是oracle提供的一个package。它主要用于分析log file文件(包括online redo log file,archived log file),将log file中的信息转存到v$logmnr_contents中,从而获取对oracle数据库操作的历史信息。使用logminers可以分析特定时间段数据库数据作了些什么变更,执行了哪些语句.
本文首先介绍了redolog与archive log 及它们之间的关系,然后使用logminer分析保存在redolog或archivelog中的SQL语句
2.Redolog与archived log
redo log file是LGWR进程从Oracle实例中的redo log buffer写入的,用户对数据库的操用先写到redolog然后才写到实体文件,所以通过查看redolog就能知道用户都做了些什么操作,默认oracle有三组redolog循环使用。也就是说一个redo log file(group) 写满后,才写下一个,当然也可以手动切换。当第三个也写满后再回头写第一个。
查看当前redolog状态
SQL> select group#,members,status from v$log;
GROUP# MEMBERS
STATUS
---------- ---------- ----------------
1 1
ACTIVE
2 1
CURRENT
3 1
INACTIVE
|
手工切换
SQL> alter system switch logfile;
SQL> select group#,members,status from v$log;
GROUP# MEMBERS
STATUS
---------- ---------- ----------------
1 1
INACTIVE
2 1
ACTIVE
3 1
CURRENT
|
现在使用第三组
archive log是当数据库运行在归档模式下时,一个redo log file(group)写满后,由ARCn进程将重做日志的内容备份到归档日志文件下,然后这个redo log file(group)才能被下一次使用。上面提到redolog三组循环使用,所以它的大小可以确定,而归档日志是redolog的CP,它的大小不断的增长,所以我们要定期把归档日志取出来,以免硬盘被占满。
查看当前的归档状态
SQL> archive log list
Database log mode Archive Mode
Automatic archival
Enabled
Archive destination
/u01/oradata/denver/archive
Oldest online log sequence
16
Next log sequence to archive
18
Current log sequence
18
SQL> ! ls /u01/oradata/denver/archive
1_10.dbf 1_12.dbf 1_14.dbf 1_16.dbf 1_1.dbf 1_3.dbf 1_5.dbf 1_7.dbf 1_9.dbf
1_11.dbf 1_13.dbf 1_15.dbf 1_17.dbf 1_2.dbf 1_4.dbf 1_6.dbf 1_8.dbf
|
现在为归档模式,当前日志序列为18,到归档日录下可看到有17个归档文件,当第18个归档后,系统会自动建第18个归档文件,
如下,手工切换redolog,从而触发arch进程
SQL> alter system switch logfile;
System altered.
SQL> archive log list
Database log mode Archive Mode
Automatic archival
Enabled
Archive destination
/u01/oradata/denver/archive
Oldest online log sequence
17
Next log sequence to archive
19
Current log sequence
19
SQL> ! ls /u01/oradata/denver/archive
1_10.dbf 1_12.dbf 1_14.dbf 1_16.dbf 1_18.dbf 1_2.dbf 1_4.dbf 1_6.dbf 1_8.dbf
1_11.dbf 1_13.dbf 1_15.dbf 1_17.dbf 1_1.dbf 1_3.dbf 1_5.dbf 1_7.dbf 1_9.dbf
|
3.使用logminer
下面以”y”用户对表”t”执行update操作为例,查看如何使用logminer分析DML操作
原理:当用户对表操作后,操作过程先记录在当前使用的redolog中,通过分析当前redolog可以查看用户都作了什么操作,或操作完成后手动切换redolog,此时redolog复制到archivelog中,通过分析archivelog也可以查到用户所做的操作
本文介绍从archivelog中查看用户做过的操作
表如下所示
SQL> select * from t;
I V
---------- ---------
----------------
-
1 2
3 4
15 10
|
1.在系统上建一个目录utlfile
[oracle@oracle ~]$ pwd
/home/oracle
[oracle@oracle ~]$ mkdir utlfile
|
2.设置utl_file_dir参数
SQL> alter system set utl_file_dir='/home/oracle/utlfile' scope=spfile;
SQL> shutdown immediate
SQL> startup
|
3.生成数据字典,
如果oracle没装logminers,先安装
SQL> @$ORACLE_HOME/rdbms/admin/dbmslm.sql
Package created.
Grant succeeded.
SQL> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql
Package created.
|
生成数据字典
SQL> execute dbms_logmnr_d.build('dirt.ora','/home/oracle/utlfile',dbms_logmnr_d.store_in_flat_file)
PL/SQL procedure successfully completed.
|
4.对表进行update(其它操作也可以)
SQL> update t set i=100 where v=2;
SQL> update t set v=0 where i=15;
SQL> commit;
SQL> select * from t;
I V
---------- ----------
100 2
3 4
15 0
|
5.将要分析的日志文件加入要分析的log list中
现在切换logfile然后我们分析最近生成的archivelog
SQL> alter system switch logfile;
SQL> ! ls /u01/oradata/denver/archive
1_10.dbf 1_13.dbf 1_16.dbf 1_19.dbf 1_3.dbf 1_6.dbf 1_9.dbf
1_11.dbf 1_14.dbf 1_17.dbf 1_1.dbf 1_4.dbf 1_7.dbf
1_12.dbf 1_15.dbf 1_18.dbf 1_2.dbf 1_5.dbf 1_8.dbf
|
将1_19.dbf加入到log list
SQL> execute dbms_logmnr.add_logfile('/u01/oradata/denver/archive/1_19.dbf',dbms_logmnr.new);
PL/SQL procedure successfully completed.
#
如果要添加更多的日志
execute dbms_logmnr.add_logfile('/u01/oradata/denver/archive/1_19.dbf',dbms_logmnr.
addfile
);
#
查看添加的日志
SQL> select * from v$logmnr_logs;
|
6.执行分析:
SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/utlfile/dirt.ora')
PL/SQL procedure successfully completed.
|
7.查询
SQL> col seg_name format a10
SQL> col sql_redo format a55
SQL> select seg_name,sql_redo,timestamp from v$logmnr_contents where seg_name='T';
SEG_NAME SQL_REDO TIMESTAMP
---------- ------------------------------------------------------- ---------
-----------------------------------------------
T update "SYS"."T" set "I" = '100' where "I" = '1' and RO 05-MAY-09
WID = 'AAAHwwAABAAALmaAAA';
T update "SYS"."T" set "V" = '0' where "V" = '10' and ROW 05-MAY-09
ID = 'AAAHwwAABAAALmaAAC';
|
可见对表T的操作被找出来了,如果是用户误操作就可以根据查出来的语名反推出去了
8. 关闭
当查找完成后应当把v$logmnr_contents关闭,否定它一直保存在内存中,浪费资源
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL procedure successfully completed.
|
本文转自 vfast_chenxy 51CTO博客,原文链接:http://blog.51cto.com/chenxy/170340,如需转载请自行联系原作者