ITPub博客

首页 > Linux操作系统 > Linux操作系统 > LogMiner介绍

LogMiner介绍

原创 Linux操作系统 作者:kewin 时间:2008-06-24 00:00:00 0 删除 编辑

---通过SQL的界面来查询redo日志的工具。

用途:
1) 用户在误删除数据后,可以通过LogMiner来恢复;虽然也可以通过RMAN来恢复,但需要有之前的备份,要先转出再query,会比较麻烦;LogMiner比较简单;
2) 可以进行后审计功能,LOG 日志中包含跟踪任何DML和DDL的的全部信息,可以知道执行的顺序和有谁来执行;


LOGMINER通过固定视图 V$LOGMNR_CONTENTS来提供REDO LOG的信息; V$LOGMNR_CONTENTS 每个字段的信息可以参考
《Database Administrator Guide》。
几个组件:
Redo Logs
在使用LogMiner时,需要指定想要分析日志的名称; 可以通过dbms_logmnr.add_logfile来添加;
需要注意的几点:
1) 重做日志必须是8.0或者以上版本Oracle数据库,在版本9.0.1引入的几个特性只能运用在9i或者之上版本的数据库产生的redo log。
2) 在版本9.2引入了对LOB和LONG数据类型的支持,但只支持9.2或以后的版本的数据库产生的REDO LOG。
3) redo log的字符集必须和LOGMINER运行所在的数据库的字符集兼容;
4) 一般,分析REDO LOG需要的数据字典来自于产生REDO LOG的同一个数据库。
5) LogMiner必须运行在和产生REDO LOG的硬件平台要相同,但不要求运行在同一个系统;
6) 运行LogMiner时要指定正确的REDO LOG ;如果省略包含一些你需要的数据的REDO LOG,那在查询v$logmnr_contents会无法得到正确的结果;
Dictionary Options
LogMiner需要数据字典才能完整的翻译REDO LOG的内容;LOGMINER使用字典来转换内部对象标识符和数据类型为对象名称和数据格式;没有数据字典,LogMiner返回内部的对象ID和用16进制表示数据。
举个例子,返回的不是如下SQL 语句:
INSERT INTO emp(name, salary) VALUES ('John Doe', 50000);
而是:
insert into Object#2581(col#1, col#2) values (hextoraw('4a6f686e20446f65'),hextoraw('c306'));"
字典的信息可以来自普通文件和REDO LOG和在线目录(就是当前数据字典)。
可以通过EXTRACT把字典信息转出到一个普通文件和REDO LOG文件。
转出(Extract)字典文件的必须有相同的字符集和通过产生REDO LOG的数据库创建;但字典Extract后,可以在其他数据库上个挖掘redolog的,而不需要连接到原数据库;
而且转出(Extract)字典文件可以避免当前的数据字典只包含最新的表格定义时出现的问题;比如,你在搜索过去某个时间被删除的表格,然而当前的字典文件没有任何的关于该删除TABLE的信息。
Extract到普通文件:
1) 在init.ora中设定参数:
UTL_FILE_DIR = /oracle/database
2) 重启服务器:
startup pfile=/oracle/data/init.ora
3) Extract 字典信息:
EXECUTE DBMS_LOGMNR_D.BUILD(’dictionary.ora’, -
’/oracle/database/’, -
OPTIONS => DBMS_LOGMNR_D.STORE_IN_FLAT_FILE);

Extract到Redo log,直接执行如下SQL:
EXECUTE DBMS_LOGMNR_D.BUILD ( -
OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

使用当前目录作为字典的选项,会有限制。就是不能配合 DDL_DICT_TRACKING使用。
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

一般的操作步骤:
1) 添加 redo log文件
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => 'log1orc1.ora', -
OPTIONS => DBMS_LOGMNR.NEW);
如果文件不止一个,那添加其他的文件:
EXECUTE DBMS_LOGMNR.ADD_LOGFILE( -
LOGFILENAME => 'log2orc1.ora', -
OPTIONS => DBMS_LOGMNR.ADDFILE);

如果有很多的REDO LOG需要添加到LOGMINER,那可以通过以下SQL的输出来得到想要的结果:
select 'exec dbms_logmnr.add_logfile(logfilename=>''' || name ||'''); '
from v$archived_log
where recid > 106;

2) 开始LogMiner:
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => -
DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
如果要加上时间界限:
EXECUTE DBMS_LOGMNR.START_LOGMNR( -
OPTIONS =>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG, -
STARTTIME => TO_DATE('01-Jan-2008 08:30:00', 'DD-MON-YYYY HH:MI:SS'), -
ENDTIME => TO_DATE('01-Jan-2008 08:45:00', 'DD-MON-YYYY HH:MI:SS'));

3) 查询v$logmnr_contenst以获得想要的内容:

SELECT SQL_REDO, SQL_UNDO FROM V$LOGMNR_CONTENTS
WHERE USERNAME = 'joedevo' AND SEG_NAME = 'salary';

select sql_undo, sql_redo , operation
from v$logmnr_contents
where username='KONG' and operation ='DDL'


建议:
使用非SYSTEM TABLESPACE来存放LogMiner的信息:
EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE(’logmnrts$’);

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/40239/viewspace-547137/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 收到了OCP 证书
请登录后发表评论 登录
全部评论

注册时间:2008-03-10

  • 博文量
    125
  • 访问量
    578370