暂无图片
分享
哦超
2019-01-11
logmnr无法从日志中检索到想找的的dml语句!!

图片1.png

图片2.png

图片3.png

图片4.png

图片5.png


上面几张图是通过test用户使用toad连到数据库做的一些操作,最下面是sys用户通过sqlplus连到数据库进行日志挖掘。(中间我把4个redolog拷贝到了对应/tmp路径下) 问题:不管我加不加这个scn范围 都无法搜寻到上图对test的的操作! 上图是开启附加日志后的操作,我觉得开不开启附加日志都应该能搜寻的到吧? (不晓得是否开启正确,附最后一个截图),难道不能挖掘在线日志么?

        

图片6.png

图片7.png


收藏
分享
10条回答
默认
最新
章芋文

logmnr可以挖在线日志的,都不需要拷贝到其他地方,add的时候直接写在线日志的路径,我怀疑是你在操作系统拷贝文件的时候,文件还没有刷新。

可以在commit后,尝试checkpoint和switch logfile一下。

另外,多查下v$logmnr_contents视图,看里面的数据,最大SCN到哪里了,对比下是否和操作时间一直。

另外logmnr不需要附加日志。

暂无图片 评论
暂无图片 有用 0
哦超
上传附件:8.png
暂无图片 评论
暂无图片 有用 0
墨天轮

image.png

我这边试了,scn和timestamp  是更新到最新的,checkpoint或切日志 依然无法挖掘到所需数据。

暂无图片 评论
暂无图片 有用 0
哦超

10.png

这个是我使用的相关命令,这次是直接加载在线的redo 做挖掘 依然无法获取所需测试数据! 另外请教下,一次加载所有的redo文件后,别的连接所做的操作都会刷到redo里,我这边刷新查询此视图v$logmnr_contents就可以了吧? (只要不归档走 就应该能刷到数据 而无需重新加载redo)

暂无图片 评论
暂无图片 有用 0
章芋文

设置utl_file_dir参数重启

SQL> !mkdir -p /oracle/logmnr 
SQL> alter system set utl_file_dir='/oracle/logmnr' scope=spfile;
System altered.
SQL> startup force

创建测试账号和表并做相关DML

SQL> create user steven identified by oracle;
User created.
SQL> grant dba to steven;
Grant succeeded.
SQL> conn steven/oracle;
Connected.
SQL>  create table test  (id number,serial# number);
Table created.
SQL> select CURRENT_SCN from v$database;
         CURRENT_SCN
--------------------
             2425305
SQL> insert into test values(1,2);
1 row created.
SQL> insert into test values(3,4);
1 row created.
SQL> update test set id=100 where id=1;
1 row updated.
SQL> delete from test where id=3;
1 row deleted.
SQL> select * from test;
        ID    SERIAL#
---------- ----------
       100          2
SQL> commit;
Commit complete.
SQL> select CURRENT_SCN from v$database;
         CURRENT_SCN
--------------------
             2425339
SQL> alter system checkpoint;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------
/oracle/oradata/ora11g/redo03.log
/oracle/oradata/ora11g/redo02.log
/oracle/oradata/ora11g/redo01.log

创建字典并添加redo

SQL> exec dbms_logmnr_d.build('dictionary.ora','/oracle/logmnr');
PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.add_logfile(LogFileName=>'/oracle/oradata/ora11g/redo01.log',Options=>dbms_logmnr.new);
PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.add_logfile(LogFileName=>'/oracle/oradata/ora11g/redo02.log',Options=>dbms_logmnr.addfile);
PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.add_logfile(LogFileName=>'/oracle/oradata/ora11g/redo03.log',Options=>dbms_logmnr.addfile);
PL/SQL procedure successfully completed.

开始挖掘

SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/oracle/logmnr/dictionary.ora');
PL/SQL procedure successfully completed.

查看数据

SQL> select count(*) from  v$logmnr_contents;
  COUNT(*)
----------
       984
SQL> select OPERATION,SQL_REDO,SQL_UNDO from v$logmnr_contents where TABLE_NAME='TEST';
OPERATION
--------------------------------
SQL_REDO
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_UNDO
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DDL
 create table test  (id number,serial# number);
INSERT
insert into "STEVEN"."TEST"("ID","SERIAL#") values ('1','2');
delete from "STEVEN"."TEST" where "ID" = '1' and "SERIAL#" = '2' and ROWID = 'AAAWrLAAEAAAACvAAA';
INSERT
insert into "STEVEN"."TEST"("ID","SERIAL#") values ('3','4');
delete from "STEVEN"."TEST" where "ID" = '3' and "SERIAL#" = '4' and ROWID = 'AAAWrLAAEAAAACvAAB';
UNSUPPORTED
Unsupported
Unsupported
UNSUPPORTED
Unsupported
Unsupported
DELETE
delete from "STEVEN"."TEST" where "ID" = '3' and "SERIAL#" = '4' and ROWID = 'AAAWrLAAEAAAACvAAB';
insert into "STEVEN"."TEST"("ID","SERIAL#") values ('3','4');
6 rows selected.


暂无图片 评论
暂无图片 有用 0
章芋文

可以这么理解,但是要清空重新挖掘分析才是最新的数据,一旦加载到v$logmnr_contents就不会变了。参考我刚才在测试环境做的示例。

暂无图片 评论
暂无图片 有用 0
哦超

十分感谢!  我的问题出在: 我以为create directory后可以忽略UTL_FILE_DIR 这个参数,我这个环境它俩路径不同导致无法挖掘,调整一致后可以了。不过发现有些语句搜寻不到(也许是不会看),例如 你发的那个测试操作里的 update 是不是没搜寻不到呢??

暂无图片 评论
暂无图片 有用 0
章芋文

如果不加附加日志,有的操作可能挖掘不出来,加了附加就可以了

SQL> alter database add supplemental log data;

Database altered.


SQL> r
  1* select OPERATION,SQL_UNDO  from v$logmnr_contents where TABLE_NAME='TEST'
DDL
DDL
INSERT               delete from "STEVEN"."TEST" where "ID" = '1' and "SERIAL#" = '2' and ROWID = 'AAAWrQAAEAAAACvAAA';
INSERT               delete from "STEVEN"."TEST" where "ID" = '3' and "SERIAL#" = '4' and ROWID = 'AAAWrQAAEAAAACvAAB';
UPDATE               update "STEVEN"."TEST" set "ID" = '1' where "ID" = '100' and ROWID = 'AAAWrQAAEAAAACvAAA';
DELETE               insert into "STEVEN"."TEST"("ID","SERIAL#") values ('3','4');


暂无图片 评论
暂无图片 有用 0
哦超

感谢耐心解答~        

暂无图片 评论
暂无图片 有用 0
章芋文
问题已关闭
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
附件列表
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏