




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


logmnr可以挖在线日志的,都不需要拷贝到其他地方,add的时候直接写在线日志的路径,我怀疑是你在操作系统拷贝文件的时候,文件还没有刷新。
可以在commit后,尝试checkpoint和switch logfile一下。
另外,多查下v$logmnr_contents视图,看里面的数据,最大SCN到哪里了,对比下是否和操作时间一直。
另外logmnr不需要附加日志。
评论
有用 0
我这边试了,scn和timestamp 是更新到最新的,checkpoint或切日志 依然无法挖掘到所需数据。
评论
有用 0
这个是我使用的相关命令,这次是直接加载在线的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
墨值悬赏

