聯機日誌檔案丟失解決方法

wzhalal發表於2013-06-28

非歸檔模式的當前聯機日誌檔案的丟失。

    由於丟失的當前的聯機日誌檔案,所以可能會丟失部分資料,破壞資料庫的完整性,而且普通的重建
日誌檔案的方式是不可行的,這個時候我們需要藉助隱含引數_ALLOW_READ_ONLY_CORRUPTION或者
_ALLOW_RESETLOGS_CORRUPTION開啟資料庫。開啟完資料庫後立即用EXP/EXPDP匯出資料,然後重建資料庫。如果有備份,我們可以考慮藉助備份恢復,但是由於資料庫處於非歸檔模式,即使是備份也是資料庫某
一個時間點的快照,所以會丟失從備份時間點到現在的資料。當然用隱含引數開啟資料庫,會破壞資料庫的完整性。
SQL> SELECT NAME,OPEN_MODE,LOG_MODE FROM V$DATABASE;
NAME      OPEN_MODE  LOG_MODE
--------- ---------- ------------
TOMSYAN   READ WRITE NOARCHIVELOG
SQL> SELECT GROUP#,SEQUENCE#,STATUS FROM V$LOG;
    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1        106 INACTIVE
         2        104 INACTIVE
         3        107 CURRENT
SQL> SELECT MEMBER FROM V$LOGFILE WHERE GROUP#=3;
MEMBER
--------------------------------------------------------------------------------
C:\ORACLE\PRODUCT\10.2.0\ORADATA\TOMSYAN\REDO03.LOG
SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> HOST DEL C:\ORACLE\PRODUCT\10.2.0\ORADATA\TOMSYAN\REDO03.LOG
SQL> STARTUP
ORACLE 例程已經啟動。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             239078276 bytes
Database Buffers          364904448 bytes
Redo Buffers                7135232 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 3 (用於執行緒 1) 的成員
ORA-00312: 聯機日誌 3 執行緒 1:
'C:\ORACLE\PRODUCT\10.2.0\ORADATA\TOMSYAN\REDO03.LOG'

SQL> SELECT GROUP#,SEQUENCE#,STATUS FROM V$LOG;
    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         1        106 INACTIVE
         3        107 CURRENT
         2        104 INACTIVE
SQL> ALTER DATABASE CLEAR LOGFILE GROUP 3;
ALTER DATABASE CLEAR LOGFILE GROUP 3
*
第 1 行出現錯誤:
ORA-00313: 無法開啟日誌組 3 (用於執行緒 1) 的成員
ORA-00312: 聯機日誌 3 執行緒 1:
'C:\ORACLE\PRODUCT\10.2.0\ORADATA\TOMSYAN\REDO03.LOG'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。
 
即使日誌檔案存在,如果日誌檔案損壞,重建當前的日誌檔案也不可行。

利用隱含引數_ALLOW_READ_ONLY_CORRUPTION開啟資料庫

SQL> ALTER SYSTEM SET "_ALLOW_READ_ONLY_CORRUPTION"=TRUE SCOPE=SPFILE;
系統已更改。
SQL> SHUTDOWN IMMEDIATE;
ORA-01109: 資料庫未開啟

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> STARTUP MOUNT
ORACLE 例程已經啟動。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             239078276 bytes
Database Buffers          364904448 bytes
Redo Buffers                7135232 bytes
資料庫裝載完畢。
SQL> ALTER DATABASE OPEN READ ONLY;
資料庫已更改。
SQL> SELECT NAME,OPEN_MODE,LOG_MODE FROM V$DATABASE;
NAME      OPEN_MODE  LOG_MODE
--------- ---------- ------------
TOMSYAN   READ ONLY  NOARCHIVELOG
 
這種以只讀方法開啟的資料庫,並不會重建當前的日誌檔案,優點不會對當前的資料檔案造成破壞。

趕緊匯出資料庫吧。
 
利用隱含引數_ALLOW_RESETLOGS_CORRUPTION開啟資料庫
SQL> ALTER SYSTEM RESET "_ALLOW_READ_ONLY_CORRUPTION" SCOPE=SPFILE SID='*';
系統已更改。
SQL> ALTER SYSTEM SET "_ALLOW_RESETLOGS_CORRUPTION"=TRUE SCOPE=SPFILE;
系統已更改。

SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> STARTUP MOUNT
ORACLE 例程已經啟動。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             239078276 bytes
Database Buffers          364904448 bytes
Redo Buffers                7135232 bytes
資料庫裝載完畢。
下面需要做一次 media recover 不要OPEN 或者直接OPEN RESETLOGS方式開啟資料庫。
SQL> RECOVER DATABASE UNTIL CANCEL;
完成介質恢復。
SQL> ALTER DATABASE OPEN RESETLOGS;
資料庫已更改。
 
如果 OPEN 方式開啟資料庫 會有下面的錯誤
SQL> ALTER DATABASE OPEN ;
ALTER DATABASE OPEN
*
第 1 行出現錯誤:
ORA-03113: 通訊通道的檔案結束
如果 OPEN RESETLOGS 方式開啟資料庫 會有下面的錯誤
SQL> ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE OPEN RESETLOGS
*
第 1 行出現錯誤:
ORA-01139: RESETLOGS 選項僅在不完全資料庫恢復後有效。
   通過這種方法開啟資料庫,Oracle會重建日誌檔案。
通過隱含引數開啟資料庫,Oracle會跳過資料庫的一致性檢查,對資料庫造成一定的負面影響。這個時候
我們應該立即匯出資料,重建個空資料庫,然後再匯入,以防資料庫以後遇到麻煩。

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

相關文章