ora-01033引起的血案

今天真是倒黴的一天,一大早5:35客戶打過來電話,說是系統沒法登錄,5:35上班?我昨晚2:30才睡的覺,不曉得這麼早上班是否是先煮飯,悲催!!數據庫

聯機看PL/SQL報01033錯誤,shutdown以後startup發現ora-00314 ora-00312oracle

聯機日誌分爲當前聯機日誌和非當前聯機日誌,非當前聯機日誌的損壞是比較簡單的,通常經過clear命令就能夠解決問題。

損壞非當前聯機日誌:
一、啓動數據庫,遇到ORA-00312 or ORA-00313錯誤,如:
ORA-00313: open failed for members of log group of thread 1
ORA-00312: online log thread 1: '/opt/oracle/db04/oradata/ORCL/redo03.log'
從這裏咱們知道日誌組1的數據文件損壞或丟失了
從報警文件能夠看到更詳細的信息
二、查看V$log視圖:
SQL>; select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS

---------- ---------- --- ----------------

                 54 YES INACTIVE

                 55 NO  CURRENT

            53 YES INACTIVE


能夠知道,該組是非當前狀態,並且已經歸檔。
三、用CLEAR命令重建該日誌文件
SQL>;alter database clear logfile group 3;
若是是該日誌組尚未歸檔,則須要用
SQL>;alter database clear unarchived logfile group 3;
四、打開數據庫,從新備份數據庫
SQL>;alter database open;
說明:
1)、若是損壞的是非當前的聯機日誌文件,通常只須要clear就能夠重建該日誌文件,可是若是該數據庫處於歸檔狀態但該日誌尚未歸檔,就

須要強行clear。
2)、建議clear,特別是強行clear後做一次數據庫的全備份。
3)、此方法適用於歸檔與非歸檔數據庫。

損壞當前聯機日誌:

歸檔模式下當前日誌的損壞有兩種狀況,
1、是數據庫是正常關閉,日誌文件中沒有未決的事務須要實例恢復,當前日誌組的損壞就能夠直接用alter database clear unarchived

logfile group n來重建。
2、是日誌組中有活動的事務,數據庫須要媒體恢復,日誌組須要用來同步,有兩種補救辦法
A. 最好的辦法就是經過不徹底恢復,能夠保證數據庫的一致性,可是這種辦法要求在歸檔方式下,而且有可用的備份
B. 經過強制性恢復,可是可能致使數據庫不一致。
下面分別用來講明這兩種恢復方法
5.1.2.1 經過備份來恢復
一、打開數據庫,會遇到一個相似的錯誤
ORA-00313: open failed for members of log group of thread 1
ORA-00312: online log thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系統找不到指定的文件

二、查看V$log,發現是當前日誌
SQL>; select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
NO CURRENT
2

 
YES INACTIVE
YES INACTIVE

三、發現clear不成功
SQL>; alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log needed for crash recovery of thread 1
ORA-00312: online log thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'

四、拷貝有效的數據庫的全備份,並不徹底恢復數據庫
能夠採用獲取最近的SCN的辦法用until scn恢復或用until cnacel恢復
recover database until cancel
先選擇auto,儘可能恢復能夠利用的歸檔日誌,而後從新
recover database until cancel
此次輸入cancel,完成不徹底恢復,也就是說恢復兩次。
如:
SQL>; recover database until cancel;
Auto
……
SQL>; recover database until cancel;
Cancel;
五、利用alter database open resetlogs打開數據庫
說明:
一、這種辦法恢復的數據庫是一致的不徹底恢復,會丟失當前聯機日誌中的事務數據
二、這種方法適合於歸檔數據庫而且有可用的數據庫全備份。
三、恢復成功以後,記得再作一次數據庫的全備份。
四、建議聯機日誌文件必定要實現鏡相在不一樣的磁盤上,避免這種狀況的發生,由於任何數據的丟失對於生產來講都是不允許的。

若是沒有備份,進行強制性恢復
一、打開數據庫,會遇到一個相似的錯誤
ORA-00313: open failed for members of log group of thread 1
ORA-00312: online log thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系統找不到指定的文件

二、查看V$log,發現是當前日誌
SQL>; select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
NO CURRENT
YES INACTIVE
YES INACTIVE

三、發現clear不成功
SQL>; alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log needed for crash recovery of thread 1
ORA-00312: online log thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'

四、把數據庫down掉
SQL>;shutdown immediate

五、在init<sid>;.ora中加入以下參數
_allow_resetlogs_corruption=TRUE

六、從新啓動數據庫,利用until cancel恢復
SQL>;recover database until cancel;
Cancel
若是出錯,再也不理會,發出
SQL>;alter database open resetlogs;

七、數據庫被打開後,立刻執行一個full export

八、shutdown數據庫,去掉_all_resetlogs_corrupt參數

九、重建庫

十、import並完成恢復

十一、建議執行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;
說明:
一、該恢復方法是沒有辦法以後的恢復方法,通常狀況下建議不要採用,由於該方法可能致使數據庫的不一致
二、該方法也丟失數據,可是丟失的數據沒有上一種方法的數據多,主要是未寫入數據文件的已提交或未提交數據。
三、建議成功後嚴格執行以上的7到11步,完成數據庫的檢查與分析
四、所有完成後作一次數據庫的全備份
五、建議聯機日誌文件必定要實現鏡相在不一樣的磁盤上,避免這種狀況的發生,由於任何數據的丟失對於生產來講都是不允許的。
用startup force試試!
 ide

allow_resetlogs_corruption=TRUE
這個我用過,數據庫能夠起來,可是數據是否是完整,還不必定,但數據庫能夠起來
須要從新啓動一個log
SQL>;RECOVER DATABASE UNTILE CANCEL;
數據庫會本身找一些它所須要的文件來進行數據庫恢復;
SQL>;ALTER DATABASE OPEN RESETLOGS;
不知道你作沒有作歸檔,若是作了,那麼這個RECOVER仍是比較有效的
沒作的話估計不行
 日誌

相關文章
相關標籤/搜索