丟失重做日誌讀書筆記

foxmile發表於2008-01-27
在網上看到關於丟失重做日誌的文件,自己做了一下。下面是過程。

OS:WINDOWS XP SP2
DB:ORACLE 9.2.0.1
聯機日誌分為當前聯機日誌和非當前聯機日誌,非當前聯機日誌的損壞是比較簡單的,一般透過clear命令就可以解決問題。

損壞當前聯機日誌:
歸檔模式下當前日誌的損壞有兩種情況,
一、是資料庫是正常關閉,日誌檔案中沒有未決的事務需要例項恢復,當前日誌組的損壞就可以直接用alter database clear unarchived logfile group n來重建。
二、是日誌組中有活動的事務,資料庫需要媒體恢復,日誌組需要用來同步,有兩種補救辦法
A. 最好的辦法就是透過不完全恢復,可以保證資料庫的一致性,但是這種辦法要求在歸檔方式下,並且有可用的備份
B. 透過強制性恢復,但是可能導致資料庫不一致。
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\zero>sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期日 1月 27 16:24:56 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

已連線。
SP2-0614: 伺服器版本太低,不能實現此功能
SP2-0614: 伺服器版本太低,不能實現此功能
SQL> shutdown abort;
ORACLE 例程已經關閉。
SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。

1、進行非當前重做日誌的故障模擬和恢復
SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1        226 YES INACTIVE
         2        227 NO  CURRENT
         3        225 YES INACTIVE
         4        224 YES INACTIVE

SQL> shutdown abort;
ORACLE 例程已經關閉。
SQL> host move LOGZERO4.ORA logzero04.ora.bak
系統找不到指定的檔案。

SQL> host move D:\oracle\oradata\zero\LOGZERO4.ORA D:\oracle\oradata\zero\logzero04.ora.bak

SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 4 (執行緒 1) 的成員
ORA-00312: 聯機日誌 4 執行緒 1: 'D:\ORACLE\ORADATA\ZERO\LOGZERO4.ORA'


SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1        226 YES INACTIVE
         2        227 NO  INVALIDATED
         3        225 YES INACTIVE
         4        224 YES INACTIVE

SQL> alter database clear logfile group 4;

資料庫已更改。

SQL> alter database open;

資料庫已更改。

SQL> host del D:\oracle\oradata\zero\logzero04.ora.bak;

SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1        226 YES INACTIVE
         2        227 YES INACTIVE
         3        225 YES INACTIVE
         4        228 NO  CURRENT

SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> select group#,sequence#,archived,status from v$log;
select group#,sequence#,archived,status from v$log
*
ERROR 位於第 1 行:
ORA-01034: ORACLE not available

2、進行當前重做日誌(未歸檔)故障模擬和恢復(有資料庫備份)

SQL> host move D:\oracle\oradata\zero\LOGZERO4.ORA D:\oracle\oradata\zero\logzero04.ora.bak

SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 4 (執行緒 1) 的成員
ORA-00312: 聯機日誌 4 執行緒 1: 'D:\ORACLE\ORADATA\ZERO\LOGZERO4.ORA'


SQL> alter database clear unarchived logfile group 4;
alter database clear unarchived logfile group 4
*
ERROR 位於第 1 行:
ORA-00313: 無法開啟日誌組 4 (執行緒 1) 的成員
ORA-00312: 聯機日誌 4 執行緒 1: 'D:\ORACLE\ORADATA\ZERO\LOGZERO4.ORA'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。


SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1        226 YES INACTIVE
         2        227 YES INACTIVE
         3          0 YES UNUSED
         4          0 NO  CLEARING_CURRENT

SQL> alter database clear unarchived logfile group 1;

資料庫已更改。

SQL> alter database clear unarchived logfile group 4;
alter database clear unarchived logfile group 4
*
ERROR 位於第 1 行:
ORA-00313: 無法開啟日誌組 4 (執行緒 1) 的成員
ORA-00312: 聯機日誌 4 執行緒 1: 'D:\ORACLE\ORADATA\ZERO\LOGZERO4.ORA'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

由於之前沒有備份,所以在此處暫時物理恢復。
SQL> host move D:\oracle\oradata\zero\logzero04.ora.bak D:\oracle\oradata\zero\LOGZERO4.ORA

SQL> alter database open;

資料庫已更改。

完成之後,在rman裡面做一次資料庫全備份。然後進行下面操作

SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> host move D:\oracle\oradata\zero\LOGZERO4.ORA D:\oracle\oradata\zero\logzero04.ora.bak

SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> alter database clear unarchived logfile group 4;

資料庫已更改。

SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1        230 NO  CURRENT
         2        227 YES INACTIVE
         3        229 YES INACTIVE
         4          0 YES UNUSED

SQL> host del D:\oracle\oradata\zero\logzero04.ora.bak;

SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1        230 NO  CURRENT
         2        227 YES INACTIVE
         3        229 YES INACTIVE
         4          0 YES UNUSED

SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> host move D:\oracle\oradata\zero\REDO01.LOG D:\oracle\oradata\zero\REDO01.LOG.BAK

SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 1 (執行緒 1) 的成員
ORA-00312: 聯機日誌 1 執行緒 1: 'D:\ORACLE\ORADATA\ZERO\REDO01.LOG'


SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR 位於第 1 行:
ORA-00313: 無法開啟日誌組 1 (執行緒 1) 的成員
ORA-00312: 聯機日誌 1 執行緒 1: 'D:\ORACLE\ORADATA\ZERO\REDO01.LOG'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。


SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          0 NO  CLEARING_CURRENT
         2        227 YES INACTIVE
         3        229 YES INACTIVE
         4          0 YES UNUSED

SQL> recover database until cancel;
完成介質恢復。
SQL> alter database open resetlogs;

資料庫已更改。

SQL> host del D:\oracle\oradata\zero\redo01.log.bak;

SQL>
SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          1 YES INACTIVE
         2          2 YES INACTIVE
         3          3 NO  CURRENT
         4          0 YES UNUSED

SQL> alter system archive log current;

系統已更改。

SQL> alter system archive log current;

系統已更改。

SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          2 YES INACTIVE
         3          3 YES INACTIVE
         4          4 YES INACTIVE
注意,在使用resetlogs開啟資料庫之後,sequence#重置了。

3、進行當前重做日誌(未歸檔)故障模擬和恢復(無資料庫備份)


SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> host move D:\oracle\oradata\zero\REDO01.LOG D:\oracle\oradata\zero\REDO01.LOG.BAK

SQL> host move D:\oracle\oradata\zero\REDO01.LOG.BAK D:\oracle\oradata\zero\REDO01.LOG

SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 YES INACTIVE
         2          6 NO  CURRENT
         3          3 YES INACTIVE
         4          4 YES INACTIVE

SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> host move D:\oracle\oradata\zero\REDO01.LOG D:\oracle\oradata\zero\REDO01.LOG.BAK

SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 1 (執行緒 1) 的成員
ORA-00312: 聯機日誌 1 執行緒 1: 'D:\ORACLE\ORADATA\ZERO\REDO01.LOG'


SQL> host move D:\oracle\oradata\zero\REDO01.LOG.BAK D:\oracle\oradata\zero\REDO01.LOG

SQL> alter database open;

資料庫已更改。

SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 YES INACTIVE
         2          6 YES INACTIVE
         3          7 NO  CURRENT
         4          4 YES INACTIVE

SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> host move D:\oracle\oradata\zero\REDO03.LOG D:\oracle\oradata\zero\REDO03.LOG.BAK

SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 3 (執行緒 1) 的成員
ORA-00312: 聯機日誌 3 執行緒 1: 'D:\ORACLE\ORADATA\ZERO\REDO03.LOG'


SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 YES INACTIVE
         2          6 YES INACTIVE
         3          7 NO  CURRENT
         4          4 YES INACTIVE

SQL> alter database clear unarchived logfile group 3;
alter database clear unarchived logfile group 3
*
ERROR 位於第 1 行:
ORA-00313: 無法開啟日誌組 3 (執行緒 1) 的成員
ORA-00312: 聯機日誌 3 執行緒 1: 'D:\ORACLE\ORADATA\ZERO\REDO03.LOG'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。


SQL> create pfile='d:\init.ora' from spfile;

檔案已建立。

SQL> shutdown immediate;
ORA-01109: 資料庫未開啟


已經解除安裝資料庫。
ORACLE 例程已經關閉。

在init.ora裡面加入_allow_resetlogs_corruption=TRUE引數。然後利用init.ora啟動例項
SQL> startup mount pfile ='d:\init.ora';
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> recover database until cancel;
完成介質恢復。
SQL> alter database open resetlogs;

資料庫已更改。

SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount pfile ='d:\init.ora';
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> create spfile from pfile='d:\init.ora';

檔案已建立。

SQL> shutdown immediate;
ORA-01109: 資料庫未開啟


已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup;
ORACLE 例程已經啟動。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> alter system archive log current;

系統已更改。

SQL> select group#,sequence#,archived,status from v$log;

    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES INACTIVE
         2          3 YES ACTIVE
         3          1 YES INACTIVE
         4          4 NO  CURRENT

SQL>

至此,資料庫恢復完成,但是資料庫資料可能會出現不一致。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/79499/viewspace-417646/,如需轉載,請註明出處,否則將追究法律責任。

相關文章