Oracle中如何使用Logmnr提取日志数据
日志中,DBA事后需要审计或查询误操作的原因,甚至检索误操作的数据。这时候闪回可能帮不了你了,因为可能已经过去很长一段时间了。是的,这可能是一个DDL操作,你想知道是哪个用户发出的。那么只要有这个时间点的归档日志,就可以使用Logmnr来分析归档日志。
1.使用logmnr,你可以做以下事情
(1)找出数据库的变化记录,或者进行变化分析。如果一些用户怀疑自己的应用程序有问题,导致出现大量错误,可以使用logmnr来分析这些事务,看看发生了什么。
(2)检测并纠正用户误操作。如果用户不小心建了一张表但不承认,logmnr可以用来分析谁执行了DML。或者DDL操作。
(3)找回丢失的数据。当无法使用闪回或者闪回的使用受到限制时,我们可以考虑使用logmnr来检索数据。这时候只要有归档日志就可以了。
注意:logminer分析的元数据,比如update table set a=a+10,实际上影响了1000条数据,那么logmnr怎么会返回1000条undo语句呢。
2. logmnr中包含的内容和数据字典
logminer包含两个PL/SQL包和几个视图
dbms_logmnr_d包:用于将字典信息提取到外部平面文件或在线日志。
dbms_logmnr包:包含三个进程。
(1)add_logfile:用于添加和删除日志文件进行分析
(2)start_logmnr:用于启用日志分析,可以启用多种不同的分析选项,例如只分析提交的信息commited_data_onl
(3)end_logmnr:用于开启日志分析,可以开启很多不同的分析选项,比如只分析提交的信息commited_data_only等。
如果普通用户想要使用上面的包,必须先在sys中进行授权才可以使用,如:
grantexecute on dbms_logmnr to piner;
然后在使用的时候,最好带前缀 sys。如sys.dbms_logmnr。
与logminer相关的字典如下:
v$logmnr_dirctionary:logminer可能用到的数据字典信息,因为logmnr可以有多个字典文件,这个视图用来显示这方面的信息。
v$logmnr_parameters:logminer当前设置的参数信息。
v$logmnr_logs:当前用于分析的日志列表。
v$logmnr_contents:日志分析结果。
3. Logmnr分析流程
(1)切换日志并建表,并进行插入、删除数据操作系统蒸发散。
更改系统归档日志当前;
创建表 test(a int);
插入测试值(1);
插入测试值(2);
插入测试值(3);
从测试中删除;
提交;
alter system archive log current;
(2)然后在刚才的两个交换机之间找到包含这些操作的归档日志。
切换后的归档日志如下:/home/oracle/product/flash_recovery_area/ORCL/archivelog/2012_09_22/o1_mf_1_54_8
5tondqb_.arc
然后分析这个在线过程。
1)添加日志并分析日志
exec sys.dbms_logmnr.add_logfile(logfilename=>'/home/oracle/product/flash_recovery_area/ORCL/archivelog/2012_09_22/o1_mf_1_54_85tondqb_.arc ',options=>sys.dbms_logmnr.new);
exec sys.dbms_logmnr.start_logmnr(options=> sys.dbms_logmnr.dict_from_online_catalog);
一般情况下,如果还有其他日志,您也可以按如下方式添加:
exec sys.dbms_logmnr.add_logfile(logfilename='/home/oracle/productt/flash_recovery_area /ORCL/archivelog/2012_09_22/o1_mf_1_54_85tondqb_.arc');
(3) 现在可以查看分析结果
select t.scn,t.timestamp,t .seg_owner、t.operation、t.sql_undo、t.sql_undo 来自 v$logmnr_contents t,其中 t.seg_name='TEST';
选择 t.scn、t.timestamp、t.seg_owner、t。操作,t .sql_undo from v$logmnr_contents t where t.seg_name='TEST';
SCN TIMESTAMP SEG_OWNER OPERATION SQL_UNDO
-------- ---- --- ---- ---------- ---------- ----------------------- --- ---------------------------------------------------------- --- ----
1367841 2012/9/22 1 CAIWENCAN DDL
1367848 2012/9/22 1 CAIWENCAN INSERT 从 "CAIWENCAN"."TEST" 删除 其中 " A" = '1' and ROWID = 'AAAM4wAEAAAAG+AAA';
1367848 2012/9/22 1 CAIWENCAN INSERT 从 "CAIWENCAN"."TEST" 中删除,其中 "A" = '2' 和 ROWID = 'AAAM4wAEAAAAG+AAB';
1367848 2012/9/22 1 CAIWENCAN INSERT 从 "CAIWENCAN"."TEST" 中删除,其中 "A" = '3' 且 ROWID = 'AAAM4wAEAAAAAG+AAC';< /p>
1367859 2012/9/22 1 菜文灿删除插入“CAIWENCAN”.“TEST”(“A”)值('1');
1367859 2012/9/22 1 CAIWENCAN 删除插入“CAIWENCAN”."TEST"( "A")values('2');
1367859 2012 /9/22 1 CAIWENCAN DELETE 插入到 "CAIWENCAN"."TEST"("A")values('3' );
其中,SEG_OWNER为操作符,operation为操作方法,sql_undo为操作语句。
这里的v$logmnr_contents视图信息是会话级别的。如果需要保留信息,需要创建临时存储
create table logmnr_contents as select * from v$logmnr_contents;
(4)分析完成后,会话可以清除内存信息。
exec sys.dbms_logmnr.end_logmnr;
(5)如果要恢复,可以编写pl/sql进行回滚恢复。
声明
mysql varchar2(4000);
num number :=0;
开始
from c_tmp in(从logmnr_contents中选择sql_undo,其中操作='DELETE')循环
mysql:=replace(c_tmp.sql,':','');
立即执行mysql;
num:=num+1;
if mod(num,1000)=0 则
提交;
结束 if;
结束循环;
提交;
异常
当其他人那么
....异常处理
end;
(6)如果要更改logmnr的具体表空间,
这里是将空间更改为用户空间。
exec sys.dbms_logmnr_d.set_tablespace('users');
v$logmnr_dirctionary:logminer可能用到的数据字典信息,因为logmnr可以有多个字典文件,这个视图用来显示此信息。
v$logmnr_parameters:logminer当前设置的参数信息。
v$logmnr_logs:当前用于分析的日志列表。
v$logmnr_contents:日志分析结果。
这篇关于《Oracle中如何使用Logmnr提取日志数据》的文章就分享到这里。希望以上内容能够对大家有所帮助,让大家能够学到更多的知识。 ,如果你认为文章不错,请转发出去,让更多的人看到。
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > Oracle中如何使用Logmnr提取日志数据