Oracle高可用之Logmnr如果有一个DDL操作,你想知道是由哪个用户发出来的。那么,只要还有这个时间的归档日志存在,就可以利用Logmnr来分析归档日志。
利用Logmnr可以做如下事情:查明数据库的变更记录,或者是进行变化分析,如有用户怀疑自己的应用有问题,产生了大量的失误,可以用Logmnr来分析这些事务,看看到底发生了些什么事情。
侦察并更正用户的误操作,如有的用户一不小心误删除了某个表,但是并不承认,这个时候就可利用Logmnr来分析是谁执行的DML或者是DDL操作。
DDL分析从Oracle 9i开始被支持。
找回失去的数据,当不能使用Flashback或使用Flashback受限的时候,我们可以考虑利用Logmnr来找回数据,这个时候,只需要有归档日志即可。
两种分析方式:在线分析:在Oracle 9i之后,就可以利用数据库的数据字典在线分析,直接在数据库中分析归档、联机日志而不需要设置参数并重新启动数据库了。
离线分析:可以直接提取到重做日志流中,它在日志流中提供了操作当时的数据字典快照,这样就可以实现离线分析。但是,数据库并不会把Catalog信息写到每个联机日志中。在实际使用中,可以通过如下的语句来查询哪些归档日志写有数据字典的快照信息:
select name from v$archived_log where directory_begin=’YES’;
select name from v$archived_log where directory_end=’YES’;
因为这里仅仅是一个当时的快照信息,所以,如果我们要分析哪个时段的归档日志,就选择离这个分析的归档日志最近的、包含DICTIONARY_BEGIN=’YES’的一个日志,与包含dictionary_end=’YES’的一个日志一起添加到分析的日志中,这样就可以脱离原来的数据库来分析归档日志了。
注意:
LogMiner分析出来的是元数据(操作、对象等),如update table set a=a+10;实际影响了1000条数据,那么Logmnr则返回1000条undo(redo)语句。
Logmnr包含的内容与数据字典
LogMiner包含两个PL/SQL包和几个视图。
dbms_logmnr_d包:用于提取字典信息到外部平面文件或者是联机日志中去。
dbms_logmnr包:主要包含三个过程。
add_logfile:用来添加/删除用于分析的日志文件;
start_logmnr:用来开启日志分析,而且,在9i/10g中,可以开启很多不同的分析选项,如只分析提交信息COMMITED_DATA_ONLY等;
end_logmnr:用来终止分析会话,它将回收LogMiner所占用的内存。
如果普通用户想使用以上的包,必须先在sys中授权才能使用:
grant execute on dbms_logmnr to piner;
在使用的时候最好也带上前缀sys。
与LogMiner相关的数据字典如下:
v$logmnr_dictionary:LogMiner可能使用的数据字典信息,因logmnr可以有多个字典文件,该视图用于显示这方面的信息。
v$logmnr_parameters :当前LogMiner所设定的参数信息。
v$logmnr_logs:当前用于分析的日志列表。
v$logmnr_contents:日志分析结果。
这些字典是session相关的,也就是说,你的分析结果在别的会话中是查询不到的,因为它本身是个临时表。如果想保存分析结果,就可以采用create as table tmp_table as select * from v$logmnr_content的方式转储v$logmnr_contents的内容。
Logmnr的分析过程
alter system archive log current;
create table test (a int);
insert into test values (1);
insert into test values (2);
insert into test values (3);
commit;
delete from test;
commit;
alter system archive log current;
找出刚才两次切换之间包含这些操作的归档日志。
在线分析过程:添加日志:
exec sys.dbms_logmnr.add_logfile(LogFileName=>’/archive_log/archive/1_9.arc’,-
options=>dbms_logmnr.new);
分析日志:
exec sys.dbms_logmnr.start_logmnr(options => sys.dbms_logmnr.dict_from_online_catalog);
如果还有更多日志:
exec sys.dbms_logmnr.add_logfile (LogFileName=>’/archive_log/archive/1_10.arc’);
查看分析结果:
select t.SCN ,t.TIMESTAMP,t.SEG_OWNER,t.OPERATION,
t.SQL_REDO,t.SQL_UNDO
from v$logmnr_contents t where t.seg_name=’TEST’;
结束分析,清空内存:
exec sys.dbms_logmnr.end_logmnr;
默认情况,Oracle 10gv$logmnr_contents临时表空间使用的是SYSAUX表空间。
可以通过以下语句更改logmnr的特定表空间,防止sysaux表空间出现不够。
exec sys.dbms_logmnr_d.set_tablespace(‘USERS’);
exec dbms_logmnr.start_logmnr(options =>’dbms_logmnr.dict_from_onlinr_catalog + -
dbms_logmnr.commited_data_only’);
这里设置了commited_data_only,表示我们只提取已经提交的事务,而不是提取那么没有提交的事务。
alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’
exec dbms_logmnr.start_logmnr(dictfilename=>’/oracle/database/dictionary.ora’, -
starttime =>’2007-04-11 08:30:00’,-
endtime=>’ 2007-04-11 08:45:00’);
表示只分析2007-04-11 08:30:00到2007-04-11 08:45:00这个时间段的日志信息。
Logmnr的限制 (10gR2中的限制):BFILE datatype
Simple and nested abstract datatypes (ADTs)
Collections (nested tables and VARRAYs)
Object refs
XMLTYPE datatype
Tables using table compression
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23135684/viewspace-630421/
,如需转载,请注明出处,否则将追究法律责任。