ORACLE 常見故障恢複
一.非歸檔模式的數據庫,丢失數據文件
故障現象 丢失某個數據庫文件,造成了數據庫無法啟動,同時數據庫處于非歸檔模式,也沒有冷備份,啟動時的錯誤信息如下: ORA-01157: cannot identify/lock data file 3 - see DBWR trace file ORA-01110: data file 3: 'D:\ORACLE\ORADATA\TEST\USERS01.DBF' 解決方法 将數據庫啟動到mount狀态下: sqlplus “/ as sysdba” startup mount 從數據庫中删除該數據文件 alter database datafile ‘xx’ offline drop; 打開數據庫 alter database open; 備注: 該方法可正常打開數據庫,但該datafile中的數據将丢失 如果誤删除了system表空間的datafile,則該方法不奏效 如果該表空間還包含其它數據文件,用EXP把數據備份出來,然後删除表空間,重建表空間,将數據導入。如果不包含其它數據文件,則直接删除表空間就可以了。
二.歸檔模式數據庫丢失某數據文件,無備份,但有該數據文件創建以來的歸檔日志
故障現象 歸檔模式的數據庫,丢失了某個數據庫文件,造成了數據庫無法啟動,同時沒有數據庫的全備份,但有該數據文件創建以來的歸檔日志,數據庫無法啟動: ORA-01157: cannot identify/lock data file 3 - see DBWR trace file ORA-01110: data file 3: 'D:\ORACLE\ORADATA\TEST\USERS01.DBF 解決方法 啟動數據庫到mount狀态 startup mount 手工創建丢失的數據文件 alter database create datafile ‘oldfname’ as ‘newfname’size xxx reuse; 利用歸檔日志對數據文件進行恢複 recover datafile ‘newfname’;或者 recover datafile n; 打開數據庫 alter database open; 備注: 該方法可正常打開數據庫,而且不會丢失數據 該方法有兩個前提 丢失的數據文件不能是系統文件 不能丢失或損壞控制文件
三.非current和active的redo log損壞
故障現象 誤删除了redo log,或者redo log被損壞,數據庫能mount,不能open: ORA-00313: open failed for members of log group 3 of thread 1 ORA-00312: online log 3 thread 1: '/oracle11g/oradata/ora11g/redo03.log' 解決方法 查詢v$log視圖,确認損壞的redo log group是非current和active SQL>select group#,thread#,sequence#, archived,status from v$log; GROUP# THREAD# SEQUENCE# ARCHIVED STATUS ------ ------- ---------- -------- -------- 1 1 103 YES INACTIVE 2 1 104 NO CURRENT 3 1 102 YES INACTIVE 如果該日志已經歸檔,用下面的命令清除日志内容 Alter database clear logfile group 3; 如果該日志沒有歸檔,用下面的命令清除日志内容 Alter database clear unarchived logfile group 3; 打開數據庫 Alter database open; 盡快做一個數據庫全備份
四.current或active的redo log損壞
故障現象 誤删除了redo log,或者redo log被損壞,數據庫不能打開: ORA-00313: open failed for members of log group 2 of thread 1 ORA-00312: online log 2 thread 1: '/oracle11g/oradata/ora11g/redo02.log' 解決方法 查詢v$log視圖,确認損壞的redo log group是current或active SQL>select group#,thread#,sequence#, archived,status from v$log; GROUP# THREAD# SEQUENCE# ARCHIVED STATUS ------ ------- ---------- -------- -------- 1 1 2 YES INACTIVE 2 1 4 NO CURRENT 3 1 3 YES INACTIVE 情況1:當前日志文件還存在,隻是邏輯損壞,并且當前日志沒有未決事務需要實例恢複 alter database clear unarchived logfile group 2; --不會報錯 recover database until cancel; alter database open resetlogs; 一般情況下,該方法不奏效,如果clear報錯,則用其它方法. 情況2:當前日志完全損壞,且有未決事務,數據庫有備份 alter database clear unarchived logfile group 2; --會報錯 ERROR at line 1: ORA-01624: log 1 needed for crash recovery of thread 1 restore database; recover database until cancel; --選擇auto recover database until cancel; alter datbase open resetlogs; 盡快做一個數據庫全備份 情況3:當前日志完全損壞,且有未決事務,數據庫無備份 shutdown immediate; _allow_resetlogs_corruption=true; startup mount pfile=‘xxx’; recover database until cancel; alter datbase open resetlogs; shutdown immediate _allow_resetlogs_corruption=true; Startup 盡快做一個數據庫全備份
五.臨時表空間的數據文件損壞
故障現象 臨時表空間的數據文件發生損壞,系統出現故障,如何恢複 解決方法 在10g及以上版本數據庫,啟動數據庫時,如果發現臨時數據文件損壞,會自動創建,如果在數據庫運行過程中,可以手工重建: create temporary tablespace temp1 tempfile ‘xx’ size xx’; alter database default temporary tablespace temp1;--系統默認臨時表空間的重建需要執行這一步,否則不需要 drop tablespace temp; alter tablespace temp1 rename to temp; 在10g以前版本數據庫,可以在數據庫打開後或運行過程中,手工重建就可以了 alter database datafile ‘xxx’ offline drop;--如果數據庫打不開,就執行這個步驟 create temporary tablespace temp1 tempfile ‘xx’ size xx’; alter database default temporary tablespace temp1;--系統默認臨時表空間的重建需要執行這一步 ,否則不需要,9i以前版本也不需要。 drop tablespace temp; alter tablespace temp1 rename to temp;
六.UNDO數據文件損壞,數據庫無法啟動
故障現象 Undo數據文件發生了丢失或損壞,數據庫啟動報錯: ORA-01157: cannot identify/lock data file 2 - see DBWR trace file ORA-01110: data file 2: '/oracle11g/oradata/ora11g/undotbs01.dbf' 解決方法 如果數據庫有備份,則利用備份進行恢複 如果數據庫沒有備份,則利用重建undo表空間的方式進行恢複 startup mount alter database datafile n offline drop;(删除損壞的undo文件) alter database open; create undo tablespace xxx …; (創建一個新的undo表空間) alter system set undo_tablespace=xxx;(指向新的undo表空間) drop tablespace yyy including contents;(删除原來的undo表空間)
七.控制文件損壞
故障現象 控制文件發生了損壞,數據庫已經無法啟動,報錯信息如下: ORA-00202: controlfile: 'D:\Oracle\oradata\chen\control01.ctl' ORA-27041: unable to open file OSD-04002: unable to open file 解決方法 情況一:控制文件有鏡像,且鏡像控制文件沒有被損壞 關閉數據庫 将沒有損壞的控制文件覆蓋掉損壞的控制文件,或者修改參數文件的control_files參數,去掉損壞的控制文件 重新啟動數據庫
情況二:控制文件無鏡像,或者鏡像的所有控制文件都損壞了 恢複控制文件 restore controlfile from ‘<your controlfile backupset>’ 如果控制文件有snapshot,将snapshot控制文件替換掉原損壞控制文件 如果做過alter database backup controlfile to trace的控制文件腳本備份,可以用trace文件中的重建腳本來創建控制文件, 如果沒有備份,也沒有trace備份,隻能手工編寫腳本創建控制文件,前提是你對數據庫文件結構非常清楚 恢複和打開數據庫 如果是用create controlfile …noresetlogs 方式重建的控制文件 recover database; alter database open; alter tablespace temp add tempfile ‘xx’ size xx reuse ; --對所有臨時表空間做此操作 如果是用create controlfile …resetlogs方式重建的控制文件,或者通過備份或快照恢複的控制文件 recover database using backup controlfile; alter database open resetlogs; alter tablespace temp add tempfile ‘xx’ size xx reuse ; --對所有臨時表空間做此操作 |
- 上一篇:emqtt常見故障診斷及解決方案 2019/12/11
- 下一篇:redis常見問題解決方案 2019/12/11