Oracle LogMiner的使用实例代码
|
LogMiner介绍 LogMiner是用于Oracle日志挖掘的利器。 百科解释:LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重做日志文件(归档日志文件)中的具体内容,LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图组成,它作为Oracle数据库的一部分来发布,是oracle公司提供的一个完全免费的工具。 本文主要演示LogMiner的使用,直观展示LogMiner的作用。 环境:Oracle 11.2.0.4 RAC1.查询当前日志组 使用sys用户查询Oracle数据库的当前日志组: select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME 1 1 29 52428800 512 2 YES INACTIVE 1547838 25-JUN-17 1547840 25-JUN-17 这里当前日志(current)是: thread 1 sequence 30 thread 2 sequence 25 2.业务用户插入操作 模拟业务用户jingyu插入T2表数据: select count(1) from t2;
COUNT(1)0 SQL> insert into t2 select rownum,rownum,dbms_random.string('b',50) from dual connect by level <= 100000 order by dbms_random.random; 100000 rows created. SQL> COUNT(1)100000 3.归档日志切换 为了区分每个日志的不同操作,这里对数据库进行手工归档切换,模拟现实中实际的归档切换。 alter system archive log current;
System altered. SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME 1 1 31 52428800 512 2 NO CURRENT 1572517 27-JUN-17 2.8147E+14 4.业务用户插入操作 模拟业务用户jingyu删除T2表部分数据: SQL> delete from t2 where id < 10000;
9999 rows deleted. SQL> commit; Commit complete. SQL> select count(1) from t2; COUNT(1)90001 5.归档日志切换 为了区分每个日志的不同操作,这里对数据库进行手工归档切换,模拟现实中实际的归档切换。 alter system archive log current;
System altered. SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME 1 1 31 52428800 512 2 YES ACTIVE 1572517 27-JUN-17 1574293 27-JUN-17 6.业务用户更新操作 模拟业务用户jingyu更新T2表部分数据: update T2 SET contents = 'xxx' where id > 99998;
2 rows updated. SQL> commit; Commit complete. 7.归档日志切换 为了区分每个日志的不同操作,这里对数据库进行手工归档切换,模拟现实中实际的归档切换。 alter system archive log current;
System altered. SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME 1 1 33 52428800 512 2 NO CURRENT 1575480 27-JUN-17 2.8147E+14 8.确认需要分析的日志 确认之后需要使用LogMiner分析的日志: thread# 1 sequence# 31 thread# 2 sequence# 26 这部分日志肯定是有记录删除操作 thread# 1 sequence# 32 9.备份归档日志 将相关的归档都copy备份出来: backup as copy archivelog sequence 30 thread 1; backup as copy archivelog sequence 31 thread 1; backup as copy archivelog sequence 32 thread 1; backup as copy archivelog sequence 25 thread 2; backup as copy archivelog sequence 26 thread 2; backup as copy archivelog sequence 27 thread 2; release channel dev1; 备份出来的归档日志文件如下: 10.使用LogMiner分析 使用LogMiner分析归档日志: dbms_logmnr.dict_from_online_catalog);
end;
/
--应该有删除操作的日志 --应该有更新操作的日志 查询v$logmnr_contents select username,sql_redo from v$logmnr_contents where sql_redo like 'insert%JINGYU%'; 实验发现,以username为条件无法查询到相关记录,最终确认username都是unknown而不是真正执行语句的业务用户jingyu。 而挖掘出的日志sql_redo这个字段是完整的SQL,可以采用like的方式查询,比如我分析更新操作的日志,就可以得到下面这样的结果: PL/SQL procedure successfully completed. SQL> select count(1) from v$logmnr_contents; COUNT(1)388 SQL> select username,sql_redo from v$logmnr_contents where username='JINGYU'; no rows selected SQL> select username,sql_redo from v$logmnr_contents where sql_redo like '%JINGYU%'; USERNAME SCN TIMESTAMP SQL_REDOUNKNOWN 1575420 27-JUN-17 UNKNOWN 1575420 27-JUN-17 SQL> 至此,LogMiner基本的操作实验已完成。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
