日期:2014-05-16  浏览次数:20621 次

oracle 日志挖掘 logminer
导读:
一、先听段故事吧~
二,logminer的基本方法
三、实际中有可能用到的例子


一、先听段故事吧~
p109

oracle重做日志文件包含了对用户数据和数据库的数据字典所做的所有改变。
1,日志挖掘的意义:
·准确定位错误发生的时间点,然后采取相应的补救措施

·还原表,将表恢复到先前一个状态,然后用已存档的日志文件向前回滚

·性能协调和容量规划

·事后审核



2,注意事项:
·重做日志文件必须和运行logminer的数据库有相同的字符集

·logminer 必须运行在生成正在分析的重做日志文件的硬件平台上

·数据库必须运行在archvielog模式

·不能在共享服务器环境中做logminer操作



3,logminer的局限
不支持以下内容

·数据类型LONG和LOB

·简单的和嵌套的数据提取类型(ADTs)

·集合(嵌套表和varrays)

·对象Refs

·索引结构的表(IOTs)



4,如何安装DBMS_LOGMNR_D过程?
10G中创建DBMS_LOGMNR_D过程的sql

SQL> START /opt/oracle/product/10.2.0/db_1/rdbms/admin/dbmslmd.sql



二,logminer的基本方法
步骤1,获取数据字典的平面文件(意思就是把数据字典内容映射到一个文本文件里面!)
alter system set utl_file_dir=’/mc/oracle/logmnr’ scope=spfile   <==设置utl_file_dir;这个需要重启oracle

shutdown immediate;

startup

sqlplus ‘/as sysdba’

execute dbms_logmnr_d.build('dictionary.ora','/mc/oracle/logmnr',options => dbms_logmnr_d.store_in_flat_file);

host

oracle@mmloyal [/mc/oracle/logmnr]# ll -h

total 27M

-rw-r--r-- 1 oracle dba 27M Apr  7 00:40 dictionary.ora   <==这就是数据字典的平面文件!



步骤2,指定要分析的重做日志文件
sys@MC> execute dbms_logmnr.add_logfile( logfilename =>'/opt/oracle/flash_recovery_area/MC/archivelog/2010_04_07/o1_mf_1_523_5vrgkmnd_.arc',options => dbms_logmnr.new);



PL/SQL procedure successfully completed.



步骤3,查看将要分析那个日志
select * from v$logmnr_logs;



步骤4,移走不想挖掘的日志文件
sys@MC> execute dbms_logmnr.add_logfile( logfilename =>'/opt/oracle/flash_recovery_area/MC/archivelog/2010_04_07/o1_mf_1_522_5vrgf9dm_.arc',options => dbms_logmnr.removefile);



PL/SQL procedure successfully completed.



步骤5,启动logminer

这里要制定刚才创建的数据库字典文件,要不然分析重做日志后将以16进制显示数据对象,到时候你就傻眼了~
注意:若没有制定平面文件字典名称,那么指定dict_from_redo_logs或者dict_from_online_catalog

sys@MC> execute dbms_logmnr.add_logfile( logfilename =>'/opt/oracle/flash_recovery_area/MC/archivelog/2010_04_07/o1_mf_1_523_5vrgkmnd_.arc',options => dbms_logmnr.new);



PL/SQL procedure successfully completed.



sys@MC> exec dbms_logmnr.start_logmnr(dictfilename =>'/mc/oracle/logmnr/dictionary.ora');  <==这里要知道字典文件


PL/SQL procedure successfully completed.



Tips:只挖掘那些提交成功的sql(options选项)
exec dbms_logmnr.start_logmnr(dictfilename =>'/mc/oracle/logmnr/dictionary.ora',options => dbms_logmnr.committed_data_only);      <==这里的options还有好多选项,用的时候再谷歌一下,这会就不废话了。



Tips:挖掘某时间范围内的数据
exec dbms_logmnr.start_logmnr(

dictfilename => ‘/mc/oracle/logmnr/dictionary.ora’,

starttime => to_date(’02-Apr-2010 09:30:00’,’DD-MON-YYYY HH:MI:SS’),

endtime => to_date(’02-Apr-2010 19:30:00’,’DD-MON-YYYY HH:MI:SS’));



Tips:挖掘某个SCN范围内的日志
exec dbms_logmnr.start_logmnr(

dictfilename => ‘/mc/oracle/logmnr/dictionary.ora’,

startscn => 19009,

endscn => 2220390);



步骤6,查看日志挖掘的结果
select * from v$logmnr_contents          <==结果按scn号排列



Tips: 使用logminer执行对象级的恢复操作
column sql_redo format a4000

column sql_undo format a4000

select sql_redo,sql_undo from v$logmnr_contents where rownum<3

说明:
sql_redo 列记录的sql代表原来的操作
sql_undo列记录的sql代表要撤销上面操作的方法(这些sql都是logmnr构建的!)


步骤7,结束logminer会话
sys@MC> exec dbms_