Oracle中如何使用Logmnr提取日志数据

分类:编程技术 时间:2024-02-20 15:58 浏览:0 评论:0
0
本文将详细讲解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提取日志数据》的文章就分享到这里。希望以上内容能够对大家有所帮助,让大家能够学到更多的知识。 ,如果你认为文章不错,请转发出去,让更多的人看到。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > Oracle中如何使用Logmnr提取日志数据

用户评论