實驗環境:RHEL6.4 + Oracle 11.2.0.4
二、丟失重做日志組
環境准備
SQL> set linesize 160
SQL> col member for a80
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- -------------------------------------------------------------------------------- ---
3 ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_3_c3g92rg3_.log NO
3 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_3_c3g92rmf_.log YES
2 ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log NO
2 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_2_c3g92qoq_.log YES
1 ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_1_c3g92prr_.log NO
1 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_1_c3g92px4_.log YES
6 rows selected.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------ ------------ ------------
1 1 4 52428800 512 2 NO CURRENT 1917689 03-NOV-15 2.8147E+14
2 1 2 52428800 512 2 YES INACTIVE 1861002 02-NOV-15 1888519 03-NOV-15
3 1 3 52428800 512 2 YES INACTIVE 1888519 03-NOV-15 1917689 03-NOV-15
一、丟失重做日志組中成員
1.1 故障模擬
模擬第2組日志組一個成員丟失。 ``` SQL> startup force ORACLE instance started.Total System Global Area 304807936 bytes
Fixed Size 2252744 bytes
Variable Size 205520952 bytes
Database Buffers 92274688 bytes
Redo Buffers 4759552 bytes
Database mounted.
Database opened.
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
3 ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_3_c3g92rg3_.log NO
3 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_3_c3g92rmf_.log YES
2 INVALID ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log NO
2 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_2_c3g92qoq_.log YES
1 ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_1_c3g92prr_.log NO
1 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_1_c3g92px4_.log YES
6 rows selected.
<h2 id="1.2">1.2 處理方法</h2>
刪除無效成員,然后在組中添加新成員。
SQL> alter database drop logfile member '/u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log';
SQL> alter database add logfile member '/u01/oradata/ORADB/onlinelog/redo02a.log' to group 2;
<h2 id="1.3">1.3 實際處理過程</h2>
SQL> alter database drop logfile member '/u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log';
alter database drop logfile member '/u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log'
*
ERROR at line 1:
ORA-01609: log 2 is the current log for thread 1 - cannot drop members
ORA-00312: online log 2 thread 1: '/u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log'
ORA-00312: online log 2 thread 1: '/u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_2_c3g92qoq_.log'
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
1 1 7 52428800 512 2 YES INACTIVE 1920749 03-NOV-15 1940772 03-NOV-15
2 1 8 52428800 512 2 NO CURRENT 1940772 03-NOV-15 2.8147E+14
3 1 6 52428800 512 2 YES INACTIVE 1920739 03-NOV-15 1920749 03-NOV-15
SQL> alter system switch logfile;
System altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
1 1 7 52428800 512 2 YES INACTIVE 1920749 03-NOV-15 1940772 03-NOV-15
2 1 8 52428800 512 2 YES ACTIVE 1940772 03-NOV-15 1941407 03-NOV-15
3 1 9 52428800 512 2 NO CURRENT 1941407 03-NOV-15 2.8147E+14
SQL> alter database drop logfile member '/u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log';
Database altered.
SQL> alter database add logfile member '/u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log' to group 2;
alter database add logfile member '/u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log' to group 2
*
ERROR at line 1:
ORA-01276: Cannot add file /u01/oradata/ORADB/onlinelog/o1_mf_2_c3g92qkl_.log. File has an Oracle Managed Files file name.
SQL> alter database add logfile member '/u01/oradata/ORADB/onlinelog/redo02a.log' to group 2;
Database altered.
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
3 ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_3_c3g92rg3_.log NO
3 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_3_c3g92rmf_.log YES
2 INVALID ONLINE /u01/oradata/ORADB/onlinelog/redo02a.log NO
2 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_2_c3g92qoq_.log YES
1 ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_1_c3g92prr_.log NO
1 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_1_c3g92px4_.log YES
6 rows selected.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
1 1 7 52428800 512 2 YES INACTIVE 1920749 03-NOV-15 1940772 03-NOV-15
2 1 8 52428800 512 2 YES ACTIVE 1940772 03-NOV-15 1941407 03-NOV-15
3 1 9 52428800 512 2 NO CURRENT 1941407 03-NOV-15 2.8147E+14
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
3 ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_3_c3g92rg3_.log NO
3 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_3_c3g92rmf_.log YES
2 ONLINE /u01/oradata/ORADB/onlinelog/redo02a.log NO
2 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_2_c3g92qoq_.log YES
1 ONLINE /u01/oradata/ORADB/onlinelog/o1_mf_1_c3g92prr_.log NO
1 ONLINE /u01/app/oracle/fast_recovery_area/ORADB/onlinelog/o1_mf_1_c3g92px4_.log YES
6 rows selected.
<h1 id="2">二、丟失重做日志組</h1>
<h2 id="2.1"> 2.1 丟失INACTIVE重做日志組</h2>
### 2.1.1 清除歸檔的INACTIVE重做日志組 ###
SQL> alter database clear logfile group 2;
Database altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
1 1 4 52428800 512 2 YES INACTIVE 1962650 03-NOV-15 1962653 03-NOV-15
2 1 0 52428800 512 3 YES UNUSED 1962653 03-NOV-15 1962685 03-NOV-15
3 1 6 52428800 512 2 NO CURRENT 1962685 03-NOV-15 2.8147E+14
可以看到,clear后的日志組狀態為UNUSED。
### 2.1.2 清除未歸檔的INACTIVE重做日志組 ###
清除未歸檔的INACTIVE重做日志組,不會丟失任何已提交事物,但清除后必須完全備份,從而確保可以執行完整恢復。
SQL> alter database clear logfile unarchived group 2;
需要考慮脫機文件是否需要已經清除的日志文件組才能重新聯機。如果需要,那么只能刪除包含脫機文件的表空間。
SQL> alter database clear logfile unarchived group 2 unrecoverable datafile;
控制文件備份到跟蹤文件目錄中,默認存放是udump目錄下
SQL> alter database backup controlfile to trace;
<h2 id="2.2">2.2 丟失ACTIVE重做日志組</h2>
這個時候嘗試生成檢查點,
SQL> alter system checkpoint;
### 2.2.1 第一種情況:命令成功執行 ###
命令成功執行,會將所有已經提交的更改寫入磁盤的數據文件中。就跟INACTIVE重做日志組處理流程一致了。
### 2.2.2 第二種情況:命令執行出現故障 ###
命令執行出現故障,就只能執行不完整恢復。
<h2 id="2.3">2.3 丟失CURRENT重做日志組</h2>
數據庫mount模式下執行不完整恢復,最后使用RESETLOGS打開數據庫。
SQL> alter database open resetlogs;
<h1 id="3">Reference</h1>
- OCP 認證考試指南 (1Z0-053)[M]. 清華大學出版社, 2010.