rman恢復--丟失聯機重做日誌的恢復

sun642514265發表於2013-12-29
聯機重做日誌大致分為兩種狀態:當前正在寫的和當前沒有寫的,丟失不同狀態的聯機重做日誌檔案,其處理方式也是不一樣的,下面分別介紹。


聯機重做日誌檔案須知

檢視當前資料庫中聯機重做日誌檔案的狀態

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

    GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- --- ----------------
     1         1            1       1 NO     CURRENT
     2         1            0       1 YES UNUSED
     3         1            0       1 YES UNUSED


注意檢視中的status列,該列標示著聯機重做日誌的狀態,共有6中可選值

UNUSED  ---標示從未用過。一般剛剛建立或open resetlogs開啟後,聯機重做日誌組為這一狀態。

CURRENT  ---表示當前的。

ACTIVE     ---表示活動的。雖然不是當前狀態,但也有可能正被使用或要被使用,比如crash recovery時可能存在這中聯機重做日誌組

CLEARING  ---日誌正在清空,當執行 alter database clear logfile語句時,該日誌組狀態為這種狀態,語句執行完畢後,操作的日誌組狀態變為UNUSED.

INACTIVE  ---不活動狀態。表示改組日誌中的內容已經被歸檔或順利寫入資料檔案,該組日誌可被繼續重用。

CLEARING_CURRENT ---日誌正在清空,但是由於清空出錯,如I/O裝置無法訪問,導致清空工作不能順利完成。



由上述檢視可見,group 1 的聯機重做日誌組位當前狀態,然後在查詢v$logfile檢視,即可看到聯機重做日誌組對應的檔案


SQL> select group#,member from v$logfile;

    GROUP#
----------
MEMBER
--------------------------------------------------------------------------------
     1
/u01/app/oracle/oradata/orcl/redo01.log

     2
/u01/app/oracle/oradata/orcl/redo02.log

     3
/u01/app/oracle/oradata/orcl/redo03.log


SQL> 


group 1 對應的是/u01/app/oracle/oradata/orcl/redo01.log,就是當前的聯機重做日誌檔案。


丟失非當前的聯機重做日誌檔案


1:模擬檔案丟失

步驟:先shutdown ,在delete日誌檔案,在startup

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


[oracle@oracle ~]$ cd /u01/app/oracle/oradata/orcl/
[oracle@oracle orcl]$ ll
total 2008060
-rw-r----- 1 oracle oinstall   9748480 Dec 24 22:34 control01.ctl
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:34 orcl_data.dbf
-rw-r----- 1 oracle oinstall  52429312 Dec 24 22:34 redo01.log
-rw-r----- 1 oracle oinstall  52429312 Dec 24 22:07 redo02.log
-rw-r----- 1 oracle oinstall  52429312 Dec 24 22:07 redo03.log
-rw-r----- 1 oracle oinstall 629153792 Dec 24 22:34 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Dec 24 22:34 system01.dbf
-rw-r----- 1 oracle oinstall  72359936 Dec 24 22:09 temp01.dbf
-rw-r----- 1 oracle oinstall  52436992 Dec 24 22:34 test_data.dbf
-rw-r----- 1 oracle oinstall 387981312 Dec 24 22:34 undotbs01.dbf
-rw-r----- 1 oracle oinstall   5251072 Dec 24 22:34 users01.dbf

[oracle@oracle orcl]$ rm redo02.log


 SQL> startup
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.
ORA-03113: 通訊通道的檔案結尾
程式 ID: 6762
會話 ID: 1 序列號: 5

2:恢復丟失的聯機重做日誌檔案

這裡group 2 對應的聯機重做日誌檔案丟失,可以通過 alter database clear logfile 命令重建日誌即可,如下

SQL> startup
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.
ORA-03113: 通訊通道的檔案結尾
程式 ID: 6762
會話 ID: 1 序列號: 5


SQL> conn /as sysdba

Connected to an idle instance.

SQL> startup mount;

ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.

SQL> alter database clear logfile group 2;

Database altered.

SQL> alter database open;

Database altered.

資料庫就可以正常開啟了。

由上所述,對於非當前的聯機重做日誌檔案損壞,其修復過程非常簡單,並且操作安全,不會造成資料丟失。


丟失當前的聯機重做日誌檔案

1:模擬檔案丟失

手動刪除聯機重做日誌檔案,如果確認是否為當前重做日誌檔案可以根據上面操作。

注意:資料庫開啟狀態時,丟失當前的聯機重做日誌檔案會造成資料庫崩潰,也就是資料庫處於不一致的狀態,為了儘可能的貼近實際,這才在關閉資料庫時,採用了shutdown abort 方式關閉。


操作:先shutdown abort,在delete檔案,在startup

SQL> shutdown abort;
ORACLE instance shut down.

SQL> startup mount;
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.

oracle@oracle orcl]$ rm redo01.log
[oracle@oracle orcl]$ ll
total 1956856
-rw-r----- 1 oracle oinstall   9748480 Dec 24 23:49 control01.ctl
-rw-r----- 1 oracle oinstall  52436992 Dec 24 23:39 orcl_data.dbf
-rw-r----- 1 oracle oinstall  52429312 Dec 24 23:39 redo02.log
-rw-r----- 1 oracle oinstall  52429312 Dec 24 23:39 redo03.log
-rw-r----- 1 oracle oinstall 629153792 Dec 24 23:45 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Dec 24 23:44 system01.dbf
-rw-r----- 1 oracle oinstall  72359936 Dec 24 23:28 temp01.dbf
-rw-r----- 1 oracle oinstall  52436992 Dec 24 23:39 test_data.dbf
-rw-r----- 1 oracle oinstall 387981312 Dec 24 23:44 undotbs01.dbf
-rw-r----- 1 oracle oinstall   5251072 Dec 24 23:39 users01.dbf

啟動資料庫

SQL> alter database open;

alter database open
*
ERROR at line 1:
ORA-00313: 無法開啟日誌組 1 (用於執行緒 1) 的成員
ORA-00312: 聯機日誌 1 執行緒 1: '/u01/app/oracle/oradata/orcl/redo01.log'
ORA-27037: 無法獲得檔案狀態
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


修復聯機重做日誌檔案

1:嘗試通過 alter database clear logfile 命令修復丟失的重做日誌檔案

SQL> alter database clear logfile group 1;              
alter database clear logfile group 1
*
ERROR at line 1:
ORA-01624: 日誌 1 是緊急恢復例項 orcl (執行緒 1) 所必需的
ORA-00312: 聯機日誌 1 執行緒 1: '/u01/app/oracle/oradata/orcl/redo01.log'

根據錯誤資訊可知,丟失的重做日誌檔案中包含必備的重做資訊,無法被clear。

2:執行不完全恢復

如果是歸檔模式下,並且有備份,建議通過備份進行不完全恢復,正常情況下只丟失當前的重做日誌檔案中的資料。

recover database until cancel;

如果沒有備份,就只能強制恢復了。這裡我們需要修改一個隱藏的初始化引數:

SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;


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


Database dismounted.
ORACLE instance shut down.

SQL> startup mount;
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.
SQL> recover database until cancel;
ORA-00279: 更改 840952 (在 12/25/2013 00:20:34 生成) 對於執行緒 1 是必需的
ORA-00289: 建議:
/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2013_12_25/o1_mf_1_1_%u_.arc
ORA-00280: 更改 840952 (用於執行緒 1) 在序列 #1 中


Specify log: {=suggested | filename | AUTO | CANCEL}

cancel

ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 將出現如下錯誤
ORA-01194: 檔案 1 需要更多的恢復來保持一致性
ORA-01110: 資料檔案 1: '/u01/app/oracle/oradata/orcl/system01.dbf'


ORA-01112: 未啟動介質恢復


SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項


SQL> alter database open resetlogs;

Database altered.

SQL> conn test/test
Connected.

SQL> select * from t1;

     ID NAME
---------- --------------------
     1 sun
     1 sun
     1 sun
     1 sun

SQL> 



那麼我之前新增的資料(沒有切換歸檔),不管是提交的還是未提交的資料,都會丟失。



注意:強烈建議,當資料庫恢復成功以後,應該馬上進行備份(expdp或exp)等備份方式,備份資料庫,然後新建資料庫,再通過imp或ipmdp方式將之前匯出的二進位制備份檔案匯入到新庫。


強制恢復完成以後,測試下資料庫,

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size              2217952 bytes
Variable Size            528484384 bytes
Database Buffers       301989888 bytes
Redo Buffers              2412544 bytes
Database mounted.
Database opened.
SQL> 

如果沒有問題,那麼說明ok了。
































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

相關文章