oracle 挖掘日志,ORACLE日志挖掘器(LogMiner)

ORACLE日志挖掘器(LogMiner)

ORACLE日志挖掘器(LogMiner)

--日志挖掘器(LogMiner)

日志挖掘器的3个主要组成部分:v$logmnr_contents视图、pl/sql 的 的dbms_logmnr 、dbms_logmnr_d

v$logmnr_contents视图是 LogMiner 挖掘日志的接口,每当该视图被访问时,重做日志就会被读取,即挖掘日志实际上就是对

该视图的查询操作,前提是必须启动日志挖掘会话。

该视图包含的其中重要的字段有:

1、sql_redo、2、sql_undo、3、xid、4、operation、5、seg_owner、6、seg_name、7、row_id、8、username

9、os_username、10、machine_name、11、session_info、12、info、13、scn、14、timestamp

LogMiner的基本元素: 源数据库、挖掘数据库(可以是源库也可以是其他库)、LogMiner字典、重做日志

挖掘数据库指 启动挖掘会话的数据库,如果挖掘库与源库不是同一个数据库,那么其硬件平台和字符集必须与源库一致

或字符集必须是源库的超集 即源库的字符集是 挖掘库的一个子集。挖掘库的版本还必须大于等于源库的版本。

LogMiner字典 是指 将重做记录中的ORACLE内部对象翻译为可读信息的转换字典。在重做记录中被更改的对象被记载为编号形式,

变更的数据被记载为ORACLE数据类型的编码形式。如无LogMiner字典的帮助,编号形式以 十进制数字显示,编码形式以十六

进制显示。

重做日志 指 由源库产生的 归档日志或在线日志。

LogMiner 字典的位置有两种: 源库日志字典、源库在线数据字典、将字典载入一个文本文件。它们不能同时使用。

源库日志字典是指 调用 dbms_logmnr_d.build 存储过程 将 LogMiner 字典提取至源库的重做日志里。

sql>begin  dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs) end;

查看v$archived_log视图 可以确定 LogMiner 字典在哪些日志中。

select sequence#,name ,dictionary_begin,dictionary_end

from v$archied_log  where dictionary_begin='YES' or dictionary_end='YES';

如果一个归档日志文件中无法容纳LogMiner字典,Oracle会采用多个连续的归档日志作为LogMiner字典的载体。

日志字典的好处:1、不要求挖掘库和源库是同一个库、2、DDL命令可以更新字典,这样挖掘出来的信息能够完全体现

DDL命令操作的结果。

源库在线数据字典:直接在启动挖掘会话时通过  start_logmnr 存储过程的 options 参数指定即可。

源库数据字典好处:挖掘库与源库为同库;DDL命令无法更新字典;

字典载入文本文件:首先将 utl_file_dir 初始化参数指定一个路径;然后重启实例;最后调用 dbms_logmnr_d.build存储过程

时为 options 参数指定 store_in_flat_file常量。

alter system set utl_file_dir='path' scope=spfile;

startup force;

begin dbms_logmnr_d.build(dictionary_filename=>'name',

dictionary_location=>'path',

options=>dbms_logmnr_d.store_in_flat_file); end;

注册重做日志

分为:手动注册、自动注册

手动注册:即手动注册需要重做日志使用 dbms_logmnr.add_logfile 存储过程。可以注册多个源库日志,并且日志不一定需要

按照序号依次添加,日志序列号也不必是连续的。

begin

dbms_logmnr.add_logfile(logfilename=>'path',

options=>dbms_logmnr.addfile);

end;

挖掘库与源库为同库:

begin

for rec in (select name from v$archied_log where resetlogs_change#=(select resetlogs_change# from v$database) and name is not null)

loop

DBMS_LOGMNR.ADD_LOGFILE(logfilename=rec.name,options=>dbms_logmnr.addfile);

end loop;

end;

注册之后 查看已经成功注册的日志 v$logmnr_logs

select * from v$logmnr_logs order by 1,2,3;

自动注册:

自动注册不需要调用 dbms_logmnr.add_logifle 存储过程。而在在通过调用 dbms_logmnr.start_logmnr 启用挖掘会话时 对 options 参数

传入  contrinuous_mine 常量声明。没有了手动注册过程中的所谓 ”注册日志“的操作。

自动注册的限制:

挖掘库与源库必须为同一个库

启动挖掘会话时必须指定搜索日志的时间窗口,该窗口可以是由SCN  或 时间戳表示

控制文件内必须具有所需日志的记录,即搜索日志的范围不能超过 v$archived_log视图所显示的归档日志及 v$logfile视图性能显示

的直线日志。

启动挖掘会话

dbms_logmnr.start_logmnr 存储过程是启动挖掘会话的入口,成功调用该存储过程必须符合两个条件中的一个至少:

1、在会话中曾经使用 dbms_logmnr.add_logfile 存储过程手动注册过至少一个重做日志。

2、在调用 DBMS_LOGMNR.START_LOGMNR 存储过程时 使用  continuous_mine 选项。

源库与挖掘库同库,并以在线数据字典作为 LogMiner 字段启动挖掘会话。

begin

dbms_logmnr.add_logfile(logfilename=>reclog.name,options=>dbms_logmnr.addfile);

end;

begin

DBMS_LOGMNR.START_LOGMNR(options=>dbms_logmnr.dict_from _online_catalog);

end;

源库与挖掘库同库,并利用控制文件自动向 LogMiner 注册 SCN 范围  0001018   到 0000200 之间的重做日志;

begin

dbms_logmnr.start_logmnr(startscn=>00001018,

endscn=>0000200,

options=>dbms_logmnr.dict_from_online_catalog+ dbms_logmnr.continuous.mine);

end;

源库与挖掘库同库,以在线数据字典作为 LogMiner 字典启动挖掘会话,并利用控制文件自动向 LogMiner 注册时间为

2012年01月03日 10:03 到 2012年01月03日 10:10 之间重做日志:

begin

dbms_logmnr.start_logmnr(starttime=>to_date('2012-10-03 10:03:00','YYYY-MM-DD HH24:MI:SS'),

endtime=>to_date('2012-01-03 10:10:00','YYYY-MM-DD HH24:MI:SS'),

options=>dbms_logmnr.dict_from_online_catalog + dbms_logmnr.continuous_mine);

end;

以日志字典作为 LogMiner 字典启动挖掘会话,并在之前成功注册了重做日志。即

begin

DBMS_LOGMNR.ADD_LOGFILE(logfilename=>reclog.name,options=>dbms_logmnr.addfile);

end;

begin

dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_redo_logs);

end;

以日志字典 作为 LogMiner 字典启动挖掘会话,并利用控制文件自动向 LogMiner 注册 SCN 为 000010234 到 000020000

之间的重做日志,挖金库与源库为同一个库。

begin

dbms_logmnr.start_logmnr(startscn=>000010234,

endscn=>000020000,

options=>dbms_logmnr.dic_from_redo_logs+ DBMS_LOGMNR.CONTINUOUS_MINE.mine);

end;

以日志字典作为 LogMiner 字典启动挖掘会话,并利用控制文件自动向 LogMiner 注册时间范围在 2012年01月03日 10:03 到

2012年01月03日 10:10 之间重做日志。挖掘库与源库为同一个库

begin

dbms_logmnr.start_logmnr(starttime=>to_date('2012-01-03 10:03:00','YYYY-MM-DD HH24:MI:SS'),

endtime=>to_date('2012-01-03 10:10:00','YYYY-MM-DD HH24:MI:SS'),

options=>dbms_logmnr.dict_from_redo_logs+DBMS_LOGMNR.continuous_mine);

end;

options 参数的值决定了挖掘会话的属性及在挖掘时 V$LOGMNR_CONTENTS 视图的行为特征,该参数中传入的常量是NUMBER类型

,其值为 2的幂。

select text from dba_source where owner='SYS' and name='DBMS_LOGMNR' AND TYPE='PACKAGE' START WITH TEXT

LIKE 'COMMITTED_DATA_ONLY%CONSTANT%';

LogMiner 挖掘

挖掘会话被成功打开后,就可以在同一个会话中查询 v$logmnr_contents 视图了。

比如:

select '('||rownum||')'as SQL#,SQL_REDO,SQL_UNDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER='TEST_USER'

AND SEG_NAME='TT';

利用 column_present 函数和 redo_value 字段挖掘感兴趣的字段的变更

column_present 函数可以用来判断特定的字段是否被变更(变更则为1,否则为0)

select '('||rownum||')' as SQL#,sql_redo,sql_undo from v$logmnr_contents where seg_owner='test_user' and seg_name='tt'

and DBMS_LOGMNR.COLUMN_PRESENT(redo_value,'test_user.tt.city')=1;----  这里的 =1 表示对特定的字段感兴趣。

利用 mine_value 函数和 redo_value 和 undo_value 字段更能正规显示 新 值 和 旧 值

select '('||rownum||')' as SQL#,sql_redo,sql_undo from v$logmnr_contents where seg_owner='test_user' and seg_name='tt'

and DBMS_LOGMNR.COLUMN_PRESENT(redo_value,'test_user.tt.city')=1  and

dbms_logmnr.mine_value(redo_value,'test_user.tt.city') / dbms_logmnr.mine_value(undo_value,'test_user.tt.city') >1.1;

关闭挖掘会话

可以显示或隐式的方式结束。

显示则是调用 dbms_logmnr.end_lognr 存储过程。

隐式方式则是 调用 dbms_logmnr.add_logfile 存储过程时对 options 参数传入 dbms_logmnr.new 常量

begin

DBMS_LOGMNR.ADD_LOGFILE(logfilename=>'log_path',

options=>dbms_logmnr.new);

----即使用隐式方式时还将logfilename 参数指定的日志更换为注册的日志。

end;

http://www.htsjk.com/oracle/21272.html

www.htsjk.Com

true

http://www.htsjk.com/oracle/21272.html

NewsArticle

ORACLE日志挖掘器(LogMiner) ORACLE日志挖掘器(LogMiner) --日志挖掘器(LogMiner) 日志挖掘器的3个主要组成部分:v$logmnr_contents视图、pl/sql 的 的dbms_logmnr 、dbms_logmnr_d v$logmnr_contents视图是 LogMiner 挖...

本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.

同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。

相关文章

暂无相关文章

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值