错误发生如下:
SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR
(OPTIONS=>SYS.dbms_logmnr.dict_from_redo_l
ogs+sys.dbms_logmnr.committed_data_only+sys.dbms_logmnr.ddl_dict_tracking);
BEGIN SYS.DBMS_LOGMNR.START_LOGMNR
(OPTIONS=>SYS.dbms_logmnr.dict_from_redo_logs+
sys.dbms_logmnr.committed_data_only+sys.dbms_logmnr.ddl_dict_tracking); END;
*
第 1 行出现错误:
ORA-01291: 缺失日志文件
ORA-06512: 在 "SYS.DBMS_LOGMNR", line 58
ORA-06512: 在 line 1
SQL> select filename from v$logmnr_logs;
FILENAME
----------------------------------------------------------------------------
----
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00227_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00228_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00229_0699741520.001
Missing log file(s) for thread 1, sequence(s) 230 to 252
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\REDO02.RDO
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\REDO03.RDO
已选择6行。
SQL> begin
2 for x in (select * from v$archived_log where sequence# between 230 and 250)loop
3 sys.dbms_logmnr.add_logfile(logfilename=>x.name,options=>sys.dbms_logmnr.a
ddfile);
4 end loop;
5 end;
6 /
PL/SQL 过程已成功完成。
SQL> select filename from v$logmnr_logs;
FILENAME
----------------------------------------------------------------------------
----
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00227_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00228_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00229_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00230_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00231_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00232_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00233_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00234_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00235_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00236_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00237_0699741520.001
FILENAME
----------------------------------------------------------------------------
----
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00238_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00239_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00240_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00241_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00242_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00243_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00244_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00245_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00246_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00247_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00248_0699741520.001
FILENAME
----------------------------------------------------------------------------
----
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00249_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00250_0699741520.001
Missing log file(s) for thread 1, sequence(s) 251 to 252
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\REDO02.RDO
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\REDO03.RDO
已选择27行。
SQL> begin
2 for x in (select * from v$archived_log where sequence# between 251 and
252
) loop
3 sys.dbms_logmnr.add_logfile
(logfilename=>x.name,options=>sys.dbms_logmnr.a
ddfile);
4 end loop;
5 end;
6 /
PL/SQL 过程已成功完成。
SQL> select filename from v$logmnr_logs;
FILENAME
----------------------------------------------------------------------------
----
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00227_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00228_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00229_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00230_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00231_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00232_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00233_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00234_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00235_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00236_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00237_0699741520.001
FILENAME
----------------------------------------------------------------------------
----
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00238_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00239_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00240_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00241_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00242_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00243_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00244_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00245_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00246_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00247_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00248_0699741520.001
FILENAME
----------------------------------------------------------------------------
----
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00249_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00250_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00251_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\ARCHIVE\ARC00252_0699741520.001
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\REDO02.RDO
C:\ORACLE\PRODUCT\10.2.0\ORADATA\YSPENG\REDO03.RDO
已选择28行。
SQL> exec sys.dbms_logmnr.start_logmnr
(options=>sys.dbms_logmnr.dict_from_redo_logs+sys.dbms_logmnr.committed_data_only+sys.dbms_logmnr.ddl_dict_tracking);
PL/SQL 过程已成功完成。
SQL> insert into tomshan select * from v$logmnr_contents where
seg_name='MYTEST'
;
insert into tomshan select * from v$logmnr_contents where seg_name='MYTEST'
*
第 1 行出现错误:
ORA-00600: 内部错误代码, 参数: [krvxbpns01], [], [], [], [], [], [], []
google一下,查到这是Oracle 10G的BUG
metalink描述如下:
Logminer ad-hoc can hang or fail with an ORA-600 when mining logs
from a RAC database that has thread enable and disables or if there are
missing sequences from the log list.
初步判断是由于日志不连续造成的。
通过查询v$logmnr_logs可以看到 我的日志文件列表里面有2个在线日志文件 redo02.rdo redo03.rdo 这2个日志文件对应的序列号分别为253和254 。问题就是出现在这2个日志文件上,由于我想省事,后面2个没使用对应的归档文件,而直接使用的在线日志。START_LOGMNR的时候没什么问题。但INSERT得时候出问题了。由于INSERT将会产生REDO数据,而我的REDO文件设置的比较小,导致日志文件切换了好几次,因此现在的REDO02.RDO和REDO03.RDO对应的序列号应该不在是253和254了,经我检查现在2个日志文件的序列号分别为:256和257
SQL> SELECT GROUP#,SEQUENCE#,STATUS FROM V$LOG;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 255 INACTIVE
2 256 ACTIVE
3 257 CURRENT
我们知道v$LOGMNR_CONTENTS表 只有我们在请求(SELECT)的时候才会填充,LogMiner会分析日志列表,并将满足需要的结果返回给我们。每请求一次v$LOGMNR_CONTENTS,LogMiner就会分析一次。因此,当我们insert into tomshan select * from v$logmnr_contents的时候,LogMiner会按照日志文件的序列号依次分析每个日志文件,并将结果插入到tomshan这个表中。而在插入表的过程中将会生成很多REDO数据,并发生日志切换,从而现在的redo02.rdo,redo03.rdo里面的数据已经被覆盖了。而现在的LogMiner日志列表中的redo02.rdo、redo03.rdo对应的序列号为256、257,从而出现日志文件的断点。
知道了导致问题的原因,问题就好解决了。
删除日志列表中日志为redo02.rdo、redo03.rdo的文件:
SQL> EXEC SYS.DBMS_LOGMNR.REMOVE_LOGFILE(LogFileName=>'C:\ORACLE\PRODUCT\10.2.0\
ORADATA\YSPENG\REDO02.RDO');
PL/SQL 过程已成功完成。
SQL> EXEC SYS.DBMS_LOGMNR.REMOVE_LOGFILE(LogFileName=>'C:\ORACLE\PRODUCT\10.2.0\
ORADATA\YSPENG\REDO03.RDO');
PL/SQL 过程已成功完成。
重新添加日志序列号为253和254的归档文件:
SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE(LogFileName=>'C:\ORACLE\PRODUCT\10.2.0\ORA
DATA\YSPENG\ARCHIVE\ARC00253_0699741520.001',OPTIONS=>SYS.DBMS_LOGMNR.ADDFILE);
PL/SQL 过程已成功完成。
SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE(LogFileName=>'C:\ORACLE\PRODUCT\10.2.0\ORA
DATA\YSPENG\ARCHIVE\ARC00254_0699741520.001',OPTIONS=>SYS.DBMS_LOGMNR.ADDFILE);
PL/SQL 过程已成功完成。
开始日志分析:
SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS=>SYS.DBMS_LOGMNR.DICT_FROM_REDO_L
OGS+SYS.DBMS_LOGMNR.COMMITTED_DATA_ONLY+SYS.DBMS_LOGMNR.DDL_DICT_TRACKING);
PL/SQL 过程已成功完成。
SQL> INSERT INTO TOMSHAN SELECT * FROM V$LOGMNR_CONTENTS WHERE SEG_NAME ='MYTEST';
PL/SQL 过程已成功完成。