轉載:http://blog.itpub.net/24500180/viewspace-777261/
1 非當前redo 文件損壞
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 4 52428800 512 1 YES INACTIVE 1198503 20-NOV-13 1219428 21-NOV-13
2 1 5 52428800 512 1 NO CURRENT 1219428 21-NOV-13 2.8147E+14
3 1 3 52428800 512 1 YES INACTIVE 1197847 20-NOV-13 1198503 20-NOV-13
SQL> select member from v$logfile;
MEMBER
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/dong/redo03.log
/u01/app/oracle/oradata/dong/redo02.log
/u01/app/oracle/oradata/dong/redo01.log
刪除redo03文件。
SQL> !rm -rf /u01/app/oracle/oradata/dong/redo03.log
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 2092498944 bytes
Fixed Size 1337604 bytes
Variable Size 268437244 bytes
Database Buffers 1811939328 bytes
Redo Buffers 10784768 bytes
Database mounted.
ORA-03113: end-of-file on communication channel
Process ID: 2941
Session ID: 125 Serial number: 5
[root@baobao trace]# tail -20 alert_dong.log
ARC1 started with pid=21, OS id=2954
Errors in file /u01/app/oracle/diag/rdbms/dong/dong/trace/dong_lgwr_2894.trc:
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/dong/redo03.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Errors in file /u01/app/oracle/diag/rdbms/dong/dong/trace/dong_lgwr_2894.trc:
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/dong/redo03.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Errors in file /u01/app/oracle/diag/rdbms/dong/dong/trace/dong_ora_2941.trc:
ORA-00313: open failed for members of log group 1 of thread
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/dong/redo03.log'
USER (ospid: 2941): terminating the instance due to error 313
Thu Nov 21 15:34:16 2013
ARC2 started with pid=22, OS id=2957
Instance terminated by USER, pid = 2941
SQL> select * from v$log;----可以再次確定redo03文件不是當前日誌,且已經歸檔
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 4 52428800 512 1 YES INACTIVE 1198503 20-NOV-13 1219428 21-NOV-13
3 1 3 52428800 512 1 YES INACTIVE 1197847 20-NOV-13 1198503 20-NOV-13
2 1 5 52428800 512 1 NO CURRENT 1219428 21-NOV-13 2.8147E+14
解決辦法爲clear logfile
SQL>alter database clear logfile group 3;
SQL>alter database open;
但如果redo03還沒歸檔的話,那就需要加unarchived了,
SQL>alter database clear unarchived logfile group 3;
Database altered.
2 當前redo 文件損壞
如果db是正常關閉的,那就可以確定提交的事務都安全了,那就用unarchived clear的方式將redo給clear即可。但如果db正在運行或者數據庫崩了,那就基本肯定會丟數據了。
構造當前redo被刪除的場景:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 4 52428800 512 1 YES INACTIVE 1198503 20-NOV-13 1219428 21-NOV-13
2 1 5 52428800 512 1 NO CURRENT 1219428 21-NOV-13 2.8147E+14
3 1 0 52428800 512 1 YES UNUSED 1197847 20-NOV-13 1198503 20-NOV-13
SQL> !rm -rf /u01/app/oracle/oradata/dong/redo02.log
SQL> create table ttt as select * from dba_objects;
Table created.
SQL> insert into ttt select * from ttt;
71893 rows created.
SQL> /
143786 rows created.
SQL> /
287572 rows created.
SQL> /
開另一個終端試試查詢,還是可以查的:
SQL> select count(*) from ttt where rownum=1;
COUNT(*)
----------
1
SQL> select count(*) from t1;
COUNT(*)
----------
71892
看下警告日誌:
Thu Nov 21 16:01:28 2013
Thread 1 advanced to log sequence 6 (LGWR switch)
Current log# 3 seq# 6 mem# 0: /u01/app/oracle/oradata/dong/redo03.log
Thu Nov 21 16:01:28 2013
Errors in file /u01/app/oracle/diag/rdbms/dong/dong/trace/dong_arc0_3170.trc:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/dong/redo02.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Errors in file /u01/app/oracle/diag/rdbms/dong/dong/trace/dong_arc0_3170.trc:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/dong/redo02.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
ARCH: Archival stopped, error occurred. Will continue retrying
故障解決:
對於當前redo的故障,基本就是丟失這個redo的數據了,閒雜主要就是用備份將數據庫恢復到最近的狀態,肯定是不完全恢復了。要不就是強制將db拉起來。
用備份恢復,這裏就不寫了,基本就是restore,recover until cancel的。現在做一下強制拉起來的情況:
SQL> alter database clear unarchived logfile group 1;--嘗試clear,失敗
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of instance dong (thread 1)
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/dong/redo01.log'
SQL> shutdown abort
ORACLE instance shut down.
通過修改隱含參數來啓動:
將*._allow_resetlogs_corruption=TRUE加入到參數文件。
[oracle@baobao dbs]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Thu Nov 21 16:47:57 2013
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup mount pfile='$ORACLE_HOME/dbs/initdong.ora';
ORACLE instance started.
Total System Global Area 2092498944 bytes
Fixed Size 1337604 bytes
Variable Size 268437244 bytes
Database Buffers 1811939328 bytes
Redo Buffers 10784768 bytes
Database mounted.
SQL> alter database open resetlogs;--這裏一定要用resetlogs呀,因爲你要是不用的話,就是代表要用redo進行實例恢復了,那肯定會和剛纔一樣報錯了。
alter database open resetlogs
*
ERROR at line 1:
ORA-01139: RESETLOGS option only valid after an incomplete database recovery
SQL> recover database until cancel;--這裏我們弄一個假的恢復騙過oracle,因爲resetlogs要求一定是恢復完纔可以使用。
Media recovery complete.
SQL> alter database open resetlogs;--打開db,完畢
Database altered.
打開後,一定要full db backup。此時db是不一致的狀態,所以需要將數據導出再導入。
------------------------------------
在redo文件不是當前日誌情況下,上面的解決方法親測是成功的!謝謝原創作者!