Oracle丟失重做日志的幾種場景恢復


實驗環境:RHEL6.4 + Oracle 11.2.0.4

一、丟失重做日志組中成員

二、丟失重做日志組

Reference

環境准備

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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM