Oracle數據庫聯機日志文件丟失處理方法
2024-08-29 13:37:27
供稿:網友
 
                 試驗一:用命令清空日志組方法
 1、查看原來表中數據SQL>; conn test/test Connected. SQL>; select * from test;    TEL----------                                                                                                1 2 3 2、插入新數據SQL>; insert into test values(4);1 row created. SQL>; commit;Commit complete. SQL>;3、        正常關閉數據庫4、        利用os command刪除所有redo文件5、        啟動數據庫SQL>; startup Oracle instance started. Total System Global Area  353862792 bytes Fixed Size                   730248 bytes Variable Size             285212672 bytes Database Buffers           67108864 bytes Redo Buffers                 811008 bytes Database mounted. ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log' 6、        查看當前日志狀態SQL>; select * from v$log;    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS---------- ---------- ---------- ---------- ---------- --- ----------------    FIRST_CHANGE# FIRST_TIME------------- ----------    1          1          2  104857600          1 YES INACTIVE 487837 01-9月 -05    2          1          4  104857600          1 NO  CURRENT 487955 01-9月 -05    3          1          3  104857600          1 YES INACTIVE 487839 01-9月 -05看來redo01.log不是當前日志,對于這類非當前日志可以直接clear,系統會重新自動生成一個redo文件    7、SQL>; alter database clear logfile group 1;Database altered. 7、        繼續啟動db SQL>; alter database open;alter database open * ERROR at line 1:ORA-00313: open failed for members of log group 2 of thread 1 ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log' 8、        看來redo也得恢復,但是redo02是當前redo,直接clear是不行的SQL>; alter database clear logfile group 2;alter database clear logfile group 2 * ERROR at line 1:ORA-00350: log 2 of thread 1 needs to be archived ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log'嘗試clear unarchived logfile group ,報錯:SQL>; alter database clear unarchived logfile group 2;alter database clear unarchived logfile group 2 * ERROR at line 1:ORA-00313: open failed for members of log group 2 of thread 1 ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log' ORA-27037: unable to oBTain file status SVR4 Error: 2: No sUCh file or Directory Additional information: 3看來他是因為找不到這個文件,從有效的備份中cp一個過來看看SQL>; host cp /T3/ORACLE/oradatabak/redo02* /T3/ORACLE/oradata/ORA9
                             SQL>; alter database clear unarchived logfile group 2;    Database altered.搞定………。    9、        按照oracle的某些做法也是可以的SQL>; alter database clear unarchived logfile group 1 unrecoverable datafile;    Database altered.    10、但是對于非當前日志就都可以,下面看看redo03 SQL>;  alter database clear logfile group 3;    Database altered.    結論:假如數據庫是正常shutdown,非當前日志都可以直接clear來重新生成,而且不丟失數據,因為正常關閉db,數據已經寫入dbf文件了。唯獨當前日志不可以,當前日志必須首先從有效的備份中拷貝一個日志文件過來,然后用alter database clear unarchived logfile group n 或alter database clear unarchived logfile group n,除此之外,還可以用下面的方法來做    方法二:用cancel模式恢復數據庫
 前面的出錯提示,步驟都一樣,唯獨恢復的方法不一樣SQL>; startup ORACLE instance started. Total System Global Area  353862792 bytes Fixed Size                   730248 bytes Variable Size             285212672 bytes Database Buffers           67108864 bytes Redo Buffers                 811008 bytes Database mounted. ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'看看丟失了哪些redo SQL>; host ls /T3/ORACLE/oradarta/ORA9/redo* /T3/ORACLE/oradarta/ORA9/redo*: No such file or directory看來redo都丟了直接recover SQL>; recover database until cancel;Media recovery complete.這個時候redo還沒有生成SQL>; host ls /T3/ORACLE/oradata/ORA9/redo* /T3/ORACLE/oradata/ORA9/redo*: No such file or directory啟動數據庫SQL>; alter database open ;alter database open * ERROR at line 1:ORA-01589: must use RESETLOGS or NORESETLOGS option for database open    SQL>;  alter database open resetlogs;Database altered.(注重,這里必須用resetlogs,否則會錯誤的SQL>; alter database open noresetlogs;alter database open noresetlogs * ERROR at line 1:ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log' SQL>;Resetlogs其實就是根據控制文件讓系統自動重新生成redo,假如noresetlog的話,就不會重新生成redo,缺少了文件,db自然無法啟動)    SQL>;  host ls /T3/ORACLE/oradata/ORA9/redo* /T3/ORACLE/oradata/ORA9/redo01.log  /T3/ORACLE/oradata/ORA9/redo02.log  /T3/ORACLE/oradata/ORA9/redo03.log SQL>;檢驗SQL>; select * from test.test;    TEL----------    1 2 3 4 SQL>;數據一點兒都沒有丟失    結論:假如數據庫是正常關閉的,用recover database until cancel可以輕松恢復或者說重新建立所有的redo,不再區分是否是當前日志,而且由于正常關閉,不會丟失任何數據,唯一可能丟失的情況就是假如日志還沒有歸檔這種恢復方法 由于要resetlogs,所以在恢復完成后,日志清零,以前的備份不再起作用,所以建議立即備份SQL>; archive log list;Database log mode              Archive Mode Automatic archival             Enabled Archive destination            /T3/ORACLE/arch Oldest online log sequence     0 Next log sequence to archive   1 Current log sequence           1 SQL>;
                             實驗三:通過重新生成控制文件來恢復redo
 前面的都一樣,只是處理方法不一樣SQL>; startup ORACLE instance started.    Total System Global Area  353862792 bytes Fixed Size                   730248 bytes Variable Size             285212672 bytes Database Buffers           67108864 bytes Redo Buffers                 811008 bytes Database mounted. ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'    SQL>; alter database backup controlfile to trace;    Database altered.    SQL>; shutdown immediate ORA-01109: database not open    Database dismounted. ORACLE instance shut down. SQL>;2、        修改一下剛才生成的那個文件CREATE CONTROLFILE REUSE DATABASE "ORA9"  RESETLOGS  ARCHIVELOG——  SET STANDBY TO MAXIMIZE PERFORMANCE MAXLOGFILES 50 MAXLOGMEMBERS 5 MAXDATAFILES 100 MAXINSTANCES 1 MAXLOGHISTORY 226 LOGFILE GROUP 1 '/T3/ORACLE/oradata/ORA9/redo01.log'  SIZE 100M,GROUP 2 '/T3/ORACLE/oradata/ORA9/redo02.log'  SIZE 100M,GROUP 3 '/T3/ORACLE/oradata/ORA9/redo03.log'  SIZE 100M—— STANDBY LOGFILE DATAFILE '/T3/ORACLE/oradata/ORA9/system01.dbf','/T3/ORACLE/oradata/ORA9/undotbs01.dbf','/T3/ORACLE/oradata/ORA9/cwmlite01.dbf','/T3/ORACLE/oradata/ORA9/drsys01.dbf','/T3/ORACLE/oradata/ORA9/example01.dbf','/T3/ORACLE/oradata/ORA9/indx01.dbf','/T3/ORACLE/oradata/ORA9/odm01.dbf','/T3/ORACLE/oradata/ORA9/tools01.dbf','/T3/ORACLE/oradata/ORA9/users01.dbf','/T3/ORACLE/oradata/ORA9/xdb01.dbf','/T3/ORACLE/oradata/ORA9/test01.dbf' CHARACTER SET ZHS16GBK;另存為一個腳本,運行他SQL>; @clone.sql Control file created. SQL>; alter database open resetlogs;Database altered. SQL>;搞定……………    結論:這種方法的要害是重新創建控制文件,后面的步驟和前面的道理一樣的    前面的三種方法都是假設db是正常關閉的,數據已經寫入數據庫文件中,所以不會由數據存在redo種,所以clear的話也不會有數據丟失    方法四:修改系統參數方法1、        插入數據SQL>; select * from test;    TEL----------    1 2 3 4    SQL>; insert into test values(5);    1 row created.    SQL>; commit;    Commit complete.    SQL>;2、        強行關閉SQL>; shutdown abort ORACLE instance shut down. SQL>;3、        手工模擬刪除redo 4、        啟動db SQL>; startup ORACLE instance started.
                             Total System Global Area  353862792 bytes Fixed Size                   730248 bytes Variable Size             285212672 bytes Database Buffers           67108864 bytes Redo Buffers                 811008 bytes Database mounted. ORA-00313: open failed for members of log group 3 of thread 1 ORA-00312: online log 3 thread 1: '/T3/ORACLE/oradata/ORA9/redo03.log' ORA-27037: unable to obtain file status SVR4 Error: 2: No such file or directory Additional information: 3 5、        嘗試使用前3中方法中最簡單的SQL>; recover database until cancel;ORA-00279: change 550174 generated at 09/02/2005 16:00:19 needed for thread 1 ORA-00289: suggestion : /T3/ORACLE/arch/1_1.dbf ORA-00280: change 550174 for thread 1 is in sequence #1 Specify log: {<RET>;=suggested  filename  AUTO  CANCEL}看來不行6、        修改init.ora,加入一行_allow_resetlogs_corruption=true 7、        啟動with pfile SQL>; startup ORACLE instance started. Total System Global Area  320308312 bytes Fixed Size                   730200 bytes Variable Size             285212672 bytes Database Buffers           33554432 bytes Redo Buffers                 811008 bytes Database mounted. ORA-01589: must use RESETLOGS or NORESETLOGS option for database open    SQL>; host ls /T3/ORACLE/oradata/ORA9/redo* /T3/ORACLE/oradata/ORA9/redo*: No such file or directory SQL>; alter database open resetlogs;Database altered.    SQL>; host ls /T3/ORACLE/oradata/ORA9/redo* /T3/ORACLE/oradata/ORA9/redo01.log  /T3/ORACLE/oradata/ORA9/redo02.log  /T3/ORACLE/oradata/ORA9/redo03.log 8、        檢驗數據SQL>; select * from test.test;    TEL----------    1 2 3 4    SQL>;看到了吧,我們前面由于執行了SHUTDOWN ABORT,這時候對數據的修改還沒有保存到數據文件中,雖然執行了COMMIT,這個時候還在聯機日志中,等待CKPT觸發DBWR寫入DATAFILE,但是這個時候執行了SHUTDOWN ABORT,redo被刪除后,里面的信息也就丟了,造成數據丟失9、        備份,去掉那個參數    試驗五:丟失當前日志組的成員1、SQL>; select * from v$logfile;    GROUP# STATUS  TYPE---------- ------- -------    MEMBER--------------------------------------------------------------------------------    3         ONLINE /T3/ORACLE/oradata/ORA9/redo03.log
                             2         ONLINE /T3/ORACLE/oradata/ORA9/redo02.log    1         ONLINE /T3/ORACLE/oradata/ORA9/redo01.log    GROUP# STATUS  TYPE---------- ------- -------    MEMBER--------------------------------------------------------------------------------    1         ONLINE /T3/ORACLE/oradata/ORA9/redo01a.log    2         ONLINE /T3/ORACLE/oradata/ORA9/redo02a.log    3         ONLINE /T3/ORACLE/oradata/ORA9/redo03a.log    SQL>; select * from v$log;    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS---------- ---------- ---------- ---------- ---------- --- ----------------    FIRST_CHANGE# FIRST_TIME------------- ----------    1          1          2  104857600          2 YES INACTIVE 554599 02-9月 -05    2          1          3  104857600          2 YES INACTIVE 554601 02-9月 -05    3          1          4  104857600          2 NO  CURRENT 554603 02-9月 -05 SQL>;3、        模擬插入數據SQL>; conn test/test Connected. SQL>; select * from test;    TEL----------    1 2 3 4    SQL>; insert into test values(5);    1 row created.    SQL>; commit 2  ;    Commit complete. 4、shutdown db,模擬刪除一個當前日志成員$ cd oradata/ORA9 $ ls redo03* redo03.log   redo03a.log $ rm redo03a.log 5、啟動db,表面沒有錯誤SQL>; startup ORACLE instance started.    Total System Global Area  353862792 bytes Fixed Size                   730248 bytes Variable Size             285212672 bytes Database Buffers           67108864 bytes Redo Buffers                 811008 bytes Database mounted. Database opened. SQL>;6、 查看日至成員SQL>; select * from v$logfile;
                             GROUP# STATUS  TYPE---------- ------- -------    MEMBER--------------------------------------------------------------------------------    3         ONLINE /T3/ORACLE/oradata/ORA9/redo03.log    2         ONLINE /T3/ORACLE/oradata/ORA9/redo02.log    1         ONLINE /T3/ORACLE/oradata/ORA9/redo01.log    GROUP# STATUS  TYPE---------- ------- -------    MEMBER--------------------------------------------------------------------------------    1         ONLINE /T3/ORACLE/oradata/ORA9/redo01a.log    2         ONLINE /T3/ORACLE/oradata/ORA9/redo02a.log    3 INVALID ONLINE /T3/ORACLE/oradata/ORA9/redo03a.log 7、        刪除出問題的聯機日志文件SQL>; alter database drop logfile member '/T3/ORACLE/oradata/ORA9/redo03a.log';alter database drop logfile member '/T3/ORACLE/oradata/ORA9/redo03a.log' * ERROR at line 1:ORA-01609: log 3 is the current log for thread 1 - cannot drop members ORA-00312: online log 3 thread 1: '/T3/ORACLE/oradata/ORA9/redo03.log' ORA-00312: online log 3 thread 1: '/T3/ORACLE/oradata/ORA9/redo03a.log'    SQL>;看來當前日志成員是不答應刪除的SQL>; alter system switch logfile;    System altered.    SQL>; select * from v$log;    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS---------- ---------- ---------- ---------- ---------- --- ----------------    FIRST_CHANGE# FIRST_TIME------------- ----------    1          1          5  104857600          2 NO  CURRENT 557687 02-9月 -05    2          1          3  104857600          2 YES INACTIVE 554601 02-9月 -05    3          1          4  104857600          2 YES ACTIVE 554603 02-9月 -05    SQL>; alter database drop logfile member '/T3/ORACLE/oradata/ORA9/redo03a.log';    Database altered.    SQL>;  alter database add logfile member '/T3/ORACLE/oradata/ORA9/redo03a.log' to group 3;
                             Database altered. SQL>; select * from v$logfile;    GROUP# STATUS  TYPE---------- ------- -------    MEMBER--------------------------------------------------------------------------------    3         ONLINE /T3/ORACLE/oradata/ORA9/redo03.log    2         ONLINE /T3/ORACLE/oradata/ORA9/redo02.log    1         ONLINE /T3/ORACLE/oradata/ORA9/redo01.log    GROUP# STATUS  TYPE---------- ------- -------    MEMBER--------------------------------------------------------------------------------    1         ONLINE /T3/ORACLE/oradata/ORA9/redo01a.log    2         ONLINE /T3/ORACLE/oradata/ORA9/redo02a.log    3 INVALID ONLINE /T3/ORACLE/oradata/ORA9/redo03a.log看來還得切換一下日至SQL>; alter system switch logfile;    System altered. SQL>; select * from v$logfile;    GROUP# STATUS  TYPE---------- ------- -------    MEMBER--------------------------------------------------------------------------------    3         ONLINE /T3/ORACLE/oradata/ORA9/redo03.log    2         ONLINE /T3/ORACLE/oradata/ORA9/redo02.log    1         ONLINE /T3/ORACLE/oradata/ORA9/redo01.log    GROUP# STATUS  TYPE---------- ------- -------    MEMBER--------------------------------------------------------------------------------    1         ONLINE /T3/ORACLE/oradata/ORA9/redo01a.log    2         ONLINE /T3/ORACLE/oradata/ORA9/redo02a.log    3         ONLINE /T3/ORACLE/oradata/ORA9/redo03a.log    至此,大功告成……………。    結論:
 只要日志組的member不是一個,出現前面的4種可能性是非常小的,即使出現了也有相應的恢復方法,所以不必驚慌;假如memer多于1個,即使壞了其中的幾個,也不會 影響數據庫的正常啟動,啟動后,再進行相應的操作即可, 所以這個時候天天察看alert.log就顯得非常重要了。