redo文件被刪除或者redo文件所在的磁盤故障的處理方法

轉載: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文件不是當前日誌情況下,上面的解決方法親測是成功的!謝謝原創作者!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章