使用logminer分析oracle日志

使用logminer分析oracle日志

平台: 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.Redologarchived 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.
 

你可能感兴趣的:(oracle,archivelog,redolog,LOGMINER,chenxy)