Recovery from missing or corrupted datafile(多個資料檔案丟失或者損壞的恢復)

djb1008發表於2010-09-14
  1. 簡述

當資料庫的多個表空間的檔案都遭到不同程度的損壞,我們直接在資料庫級進行恢復。本試驗測試是丟失資料檔案,控制檔案、REDO檔案等其他檔案沒有受到破壞。

本試驗中刪除絕大部分的資料檔案,模擬該大部分資料檔案物理破壞或者丟失的情況發生,也就是說,如果一個資料庫的絕大部分的資料檔案丟失了,可以參照下面的操作步驟進行資料庫庫的恢復工作。

[@more@]

  1. 建立測試環境

2.1在測試表空間上建立表

SQL> CREATE TABLE AIDU.TEST_FOR_RECOVERY_DB(ID NUMBER NOT NULL,NAME VARCHAR2(200),PRIMARY KEY(ID)) TABLESPACE USER02;

表已建立。

2.2 做一次RMAN全備份

C:> RMAN TARGET /

RMAN>RUN{

SQL ALTER SYSTEM ARCHIVE LOG CURRENT;

ALLOCATE CHANNEL D1 TYPE DISK;

BACKUP FULL DATABASE PLUS ARCHIVELOG;

RELEASE CHANNEL D1;}

2.3 在測試表中插入資料,用於驗證資料是否完全恢復

SQL> CONN AIDU/AIDU

已連線。

SQL> INSERT INTO TEST_FOR_RECOVERY_DB VALUES(1,'TEST FOR RECOVERY DATABASE');

已建立 1 行。

SQL> COMMIT;

提交完成。

SQL> CONN / AS SYSDBA

已連線。

SQL> ALTER SYSTEM SWITCH LOGFILE;

系統已更改。

  1. 模擬災難恢復

SQL>SHUTDOWN IMMEDIATE;

SQL>HOST DEL C:ORADATAAIDUSYS*.*

SQL>HOST DEL C:ORADATAAIDUUS*.*

SQL>HOST DEL C:ORADATAAIDUIN*.*

SQL>HOST DEL C:ORADATAAIDUUN*.*

SQL>HOST DEL C:ORADATAAIDUTE*.*

實際上只保留了資料庫資料目錄下的REDO檔案,控制檔案。

SQL>STARTUP

ORACLE 例程已經啟動。

Total System Global Area 268435456 bytes

Fixed Size 1248504 bytes

Variable Size 100664072 bytes

Database Buffers 163577856 bytes

Redo Buffers 2945024 bytes

資料庫裝載完畢。

ORA-01157: 無法標識/鎖定資料檔案 1 - 請參閱 DBWR 跟蹤檔案

ORA-01110: 資料檔案 1: 'C:ORADATAAIDUSYSTEM01.DBF'

資料庫無法啟動

  1. 進行災難恢復

4.1 檢視當前資料庫狀態

SQL> SELECT OPEN_MODE FROM V$DATABASE;

OPEN_MODE

----------

MOUNTED

SQL>COL NAME FORMAT A30

SQL>COL ERROR FORMAT A30

SQL>COL FILE# FORMAT 99

SQL> SELECT A.FILE#,A.NAME,B.ERROR FROM V$DATAFILE A,V$RECOVER_FILE B

2 WHERE A.FILE#=B.FILE#;

FILE# NAME ERROR

----- ------------------------------ ------------------------------

1 C:ORADATAAIDUSYSTEM01.DBF FILE NOT FOUND

2 C:ORADATAAIDUUSER02.DBF FILE NOT FOUND

3 C:ORADATAAIDUSYSAUX01.DBF FILE NOT FOUND

4 C:ORADATAAIDUUSERS01.DBF FILE NOT FOUND

5 C:ORADATAAIDUINDX01.DBF FILE NOT FOUND

6 C:ORADATAAIDUINDX02.DBF FILE NOT FOUND

7 C:ORADATAAIDUUNDO2.ORA FILE NOT FOUND

8 C:ORADATAAIDUUSER02B.ORA FILE NOT FOUND

已選擇8行。

這裡看到有8個檔案需要進行恢復。

4.2使用RMAN進行恢復

RMAN> run{

2> RESTORE DATABASE;

3> RECOVER DATABASE;

4> SQL 'ALTER DATABASE OPEN';}

啟動 restore 2006-07-11 11:25:46

使用目標資料庫控制檔案替代恢復目錄

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=46 devtype=DISK

通道 ORA_DISK_1: 正在開始恢復資料檔案備份集

通道 ORA_DISK_1: 正在指定從備份集恢復的資料檔案

正將資料檔案00001恢復到C:ORADATAAIDUSYSTEM01.DBF

正將資料檔案00002恢復到C:ORADATAAIDUUSER02.DBF

正將資料檔案00003恢復到C:ORADATAAIDUSYSAUX01.DBF

正將資料檔案00004恢復到C:ORADATAAIDUUSERS01.DBF

正將資料檔案00005恢復到C:ORADATAAIDUINDX01.DBF

正將資料檔案00006恢復到C:ORADATAAIDUINDX02.DBF

正將資料檔案00007恢復到C:ORADATAAIDUUNDO2.ORA

正將資料檔案00008恢復到C:ORADATAAIDUUSER02B.ORA

通道 ORA_DISK_1: 正在讀取備份段 C:ORADATAFLASH_RECOVERY_AREAAIDUBACKUPSET2006_07_11O1_MF_NNNDF_TAG20060711T094614_2C60Q8F5_.BKP

通道 ORA_DISK_1: 已恢復備份段 1

段控制程式碼 = C:ORADATAFLASH_RECOVERY_AREAAIDUBACKUPSET2006_07_11O1_MF_NNNDF_TAG20060711T094614_2C60Q8F5_.BKP 標記 = TAG20060711T094614

通道 ORA_DISK_1: 恢復完成, 用時: 00:01:15

完成 restore 2006-07-11 11:27:04

啟動 recover 2006-07-11 11:27:04

使用通道 ORA_DISK_1

正在開始介質的恢復

存檔日誌執行緒 1 序列 25 已作為檔案 C:ORADATAFLASH_RECOVERY_AREAAIDUARCHIVELOG2006_07_11O1_MF_1_25_2C60S8NJ_.ARC 存在於磁碟上

存檔日誌執行緒 1 序列 26 已作為檔案 C:ORADATAFLASH_RECOVERY_AREAAIDUARCHIVELOG2006_07_11O1_MF_1_26_2C60WK00_.ARC 存在於磁碟上

存檔日誌執行緒 1 序列 27 已作為檔案 C:ORADATAFLASH_RECOVERY_AREAAIDUARCHIVELOG2006_07_11O1_MF_1_27_2C65YXJ3_.ARC 存在於磁碟上

存檔日誌檔名 =C:ORADATAFLASH_RECOVERY_AREAAIDUARCHIVELOG2006_07_11O1_MF_1_25_2C60S8NJ_.ARC 執行緒 =1 序列 =25

介質恢復完成, 用時: 00:00:09

完成 recover 2006-07-11 11:27:17

sql 語句: ALTER DATABASE OPEN

4.3 檢查資料是否正常恢復

SQL> COL NAME FORMAT A30

SQL> SELECT * FROM TEST_FOR_RECOVERY_DB;

ID NAME

---------- ------------------------------

1 TEST FOR RECOVERY DATABASE

SQL> COL FILE# FORMAT 99

SQL> COL NAME FORMAT A30

SQL> COL STATUS FORMAT A10

SQL> SELECT FILE#,NAME,STATUS FROM V$DATAFILE ORDER BY FILE#;

FILE# NAME STATUS

----- ------------------------------ ----------

1 C:ORADATAAIDUSYSTEM01.DBF SYSTEM

2 C:ORADATAAIDUUSER02.DBF ONLINE

3 C:ORADATAAIDUSYSAUX01.DBF ONLINE

4 C:ORADATAAIDUUSERS01.DBF ONLINE

5 C:ORADATAAIDUINDX01.DBF ONLINE

6 C:ORADATAAIDUINDX02.DBF ONLINE

7 C:ORADATAAIDUUNDO2.ORA ONLINE

8 C:ORADATAAIDUUSER02B.ORA ONLINE

已選擇8行。

SQL> SELECT FILE#,NAME,STATUS FROM V$TEMPFILE ORDER BY FILE#;

FILE# NAME STATUS

----- ------------------------------ ----------

2 C:ORADATAAIDUTEMP02.DBF ONLINE

我們可以看到TEMP 表空間的檔案自動恢復了,請注意這些檔案並不是從RMAN備份集中恢復回來的,而是系統自動建立的。這次測試的環境是10.2.0.1,TEMP表空間的檔案可以自動重新建立,如果是10.2之前的版本,可能需要手工建立一下。

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

相關文章