LOGMINER當前日誌出現ORA-310和ORA-334錯誤

yangtingkun發表於2011-09-29

測試LOGMINER的時候出現了ORA-310ORA-334錯誤。

 

 

測試程式碼如下:

SQL> SELECT GROUP# FROM V$LOG WHERE STATUS = 'CURRENT';

GROUP#
----------
         2

SQL> SELECT MEMBER FROM V$LOGFILE WHERE GROUP# = 2;

MEMBER
--------------------------------------------------------------------
/oracle/oradata/orcl/redo02.log

SQL> EXEC DBMS_LOGMNR.ADD_LOGFILE('/oracle/oradata/orcl/redo02.log', DBMS_LOGMNR.NEW)

PL/SQL procedure successfully completed.

SQL> EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)

PL/SQL procedure successfully completed.

SQL> CREATE TABLE T_BAK_LOGMNR AS SELECT * FROM V$LOGMNR_CONTENTS;
CREATE TABLE T_BAK_LOGMNR AS SELECT * FROM V$LOGMNR_CONTENTS
*
ERROR at line 1:
ORA-00310: archived log contains sequence 98; sequence 95 required
ORA-00334: archived log: '/oracle/oradata/orcl/redo02.log'

SQL> ALTER SYSTEM SWITCH LOGFILE;

System altered.

SQL> EXEC DBMS_LOGMNR.END_LOGMNR

PL/SQL procedure successfully completed.

SQL> EXEC DBMS_LOGMNR.ADD_LOGFILE('/oracle/oradata/orcl/redo02.log', DBMS_LOGMNR.NEW)

PL/SQL procedure successfully completed.

SQL> EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)

PL/SQL procedure successfully completed.

SQL> CREATE TABLE T_BAK_LOGMNR AS SELECT * FROM V$LOGMNR_CONTENTS;
CREATE TABLE T_BAK_LOGMNR AS SELECT * FROM V$LOGMNR_CONTENTS
*
ERROR at line 1:
ORA-00310: archived log contains sequence 101; sequence 98 required
ORA-00334: archived log: '/oracle/oradata/orcl/redo02.log'

SQL> EXEC DBMS_LOGMNR.END_LOGMNR

PL/SQL procedure successfully completed.

SQL> SELECT GROUP# FROM V$LOG WHERE STATUS = 'CURRENT';

GROUP#
----------
         2

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

Session altered.

SQL> SELECT GROUP#, SEQUENCE#, STATUS, FIRST_TIME, NEXT_TIME FROM V$LOG;

GROUP# SEQUENCE#  STATUS           FIRST_TIME          NEXT_TIME
---------- ---------- ---------------- ------------------- -------------------
         1 100        INACTIVE         2011-09-29 17:03:26 2011-09-29 17:03:51
         2 101        CURRENT          2011-09-29 17:03:51
         3 99         INACTIVE         2011-09-29 17:02:52 2011-09-29 17:03:26

第一次出現這個錯誤的時候,很快意識到自己犯了一個低階的錯誤,對當前日誌進行了LOGMINER,導致錯誤的產生。

但是SWITCH LOGFILE之後,問題居然仍然會出現。檢查當前的日誌,發現當前日誌居然又會到了GROUP 2,說明第二次進行LOGMINER的時候同樣是當前日誌。

仔細整理了一下思路,發現問題的原因。第一次導致錯誤的時候只是認為是由於LOGMINER當前日誌所致,並沒有仔細研究錯誤資訊。由於採用CREATE TABLE AS SELECT * FROM V$LOGMNR_CONTENTS的方法,且檢視中查詢的是當前日誌中的資訊,就會導致CREATE TABLE產生的日誌出現在V$LOGMNR_CONTENTS檢視中,而檢視中的記錄使得CREATE TABLE產生更多的內容,並最終導致了一個死迴圈。

當聯機日誌寫滿後,Oracle自動切換,但是LOGMINER並沒有結束,而是繼續抽取新的日誌,知道三個日誌都被寫滿,這是Oracle要切換的時候發現第一個日誌仍然被使用,於是出現了ORA-310ORA-334的錯誤。而第二次開始前的切換,恰好使得聯機日誌切回第二個日誌,於是錯誤完全的重演了一次。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-708529/,如需轉載,請註明出處,否則將追究法律責任。

相關文章