首先 注意:rman備份的時候並不會備份臨時表空間的數據文件(想一想也是,反正是臨時的,備它幹嗎),因此徹底恢復以後, 若是臨時表空間的數據文件也丟失, 須要手工從新建立臨時表空間的數據文件。據消息靈通人士稱,10G以後的版本會在恢復過程當中自動建立臨時表空間的數據文件,手頭沒有環境(11g都出了,俺還在學9i,落後啊。),未經嘗試,有心的朋友若是落實該消息,也不妨通知俺一下:)web
其次須要瞭解:Oracle數據庫的恢復實際上包含了兩個概念:數據庫修復(RESTORE)與數據庫恢復(RECOVER):sql
數據庫修復(RESTORE): 是指利用備份的數據庫文件來替換已經損壞的數據庫文件或者將其恢復到一個新的位置。RMAN在進行修復操做時,會利用恢復目錄(沒有創建恢復目錄的話就使用目標數據庫的控制文件)來獲取備份信息,並從中選擇最合適的備份進行修復操做。選擇備份時有兩個原則(一、選擇距離恢復目錄時刻最近;二、優先選擇鏡像複製,其次纔是備份集)數據庫
數據庫恢復(RECOVER): 是指利用重作日誌或增量備份來重建丟失的數據。oracle
再而後須要明白:咱們在對目標數據庫作任何形式的修復或者恢復以前,目標數據庫必須處於加載狀態,恢復指定數據文件時,也能夠在打開狀態下恢復(什麼,控制文件丟了,進不了加載狀態?黑黑,麻煩了,不過也並不是徹底無可救藥,接着往下看吧)。spa
1、對數據庫進行徹底介質恢復rest
過程有三個步驟:日誌
一、啓動數據庫到加載狀態code
RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUP MOUNT;
二、執行恢復操做(記的咱們剛說過的,恢復分兩步,有先有後的。)ip
RMAN> RESTORE DATABASE; RMAN> RECOVER DATABASE DELETE ARCHIVELOGS SKIP TABLESPACE TEMP;
注意:DELETE ARCHIVELOGS和SKIP TABLESPACE兩個參數是可選擇的,做用以下:get
DELETE ARCHIVELOGS :表示RMAN將在完成恢復過程後自動刪除那些在恢復過程當中產生的歸檔日誌文件,RMAN並不會刪除restore命令以前的歸檔文件。
SKIP TABLESPACE :跳過指定表空間,好比臨時表,固然臨時表空間即便你不跳過它也不會恢復的。
三、打開數據庫
RMAN> ALTER DATABASE OPEN;
此處須要注意的一點是,若是你的數據庫並不是處於歸檔模式,那麼必須使用ALTER DATABASE OPEN RESETLOGS來打開數據庫,由於RMAN會認爲在非歸檔模式下是一個不一致的備份,執行resetlogs以後,oracle將會把scn從新置爲0。
2、恢復表空間
一樣也能夠分紅三個步驟:
一、啓動數據庫到加載狀態
RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUP MOUNT;
2 、進行恢復操做,在恢復以前,若是須要被恢復的表空間未處於脫機狀態,須要經過alter tablespace ... Offline語句將其置爲脫機:
RMAN> SQL ¨ALTER TABLESPACE jweb OFFLINE IMMEDIATE¨; RMAN> RESTORE TABLESPACE jweb; RMAN> RECOVER TABLESPACE jweb; RMAN> SQL ¨ALTER TABLESPACE jweb ONLINE¨;
三、打開數據庫
RMAN> ALTER DATABASE OPEN;
3、恢復數據文件
事實上,恢復表空間實際就是恢復其所對應的數據文件(一個表空間可能對應多個數據文件),因此步驟與上類似。
一、啓動數據庫到加載狀態
RMAN> SHUTDOWN IMMEDIATE; RMAN> STARTUP MOUNT;
2 、進行恢復操做,在恢復以前,若是須要被恢復的表空間未處於脫機狀態,須要經過alter tablespace ... Offline語句將其置爲脫機,操做數據文件時能夠直接指定數據文件,也能夠以數據文件序號代替:
RMAN>SQL ¨ALTER DATABASE DATAFILE 10 OFFLINE; RMAN> RESTORE DATAFILE 10; RMAN> RECOVER DATAFILE 10; RMAN>SQL ¨ ALTER DATABASE DATAFILE 10 ONLINE;
三、打開數據庫
RMAN> ALTER DATABASE OPEN;
4、示例:歸檔模式下,假設某數據文件丟失,恢復該數據文件。
咱們來模擬一個過程,首先咱們建立一份數據庫的徹底備份,而後在數據庫中進行若干操做,以後刪除該數據文件來模擬該文件意外丟失,最後咱們經過rman來恢復該數據文件。
還記的咱們實戰備份裏寫的備份腳本嗎,ok,咱們先執行該腳本,進行數據庫備份。
千萬別忘了執行完以後看一下輸出的log,必定要確保你全部的操做都是正確執行的。
Ok, 下面鏈接數據庫模擬一些操做。
C:\Documents and Settings\Administrator>sqlplus /nolog SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 7月 18 10:17:44 2007 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL> conn jss/jss 已鏈接。 SQL> create table tmp3(col varchar2(50)); ###### 建立一個臨時表並插入一些數據 表已建立。 SQL> insert into tmp3 values (¨test1¨); 已建立 1 行。 SQL> insert into tmp3 values (¨test2¨); 已建立 1 行。 SQL> insert into tmp3 values (¨test3¨); 已建立 1 行。 SQL> select *from tmp3; COL -------------------------------------------------- test1 test2 test3 SQL> commit; 提交完成。 SQL> conn / as sysdba #### 以dba用戶鏈接並關閉數據庫 已鏈接。 SQL> shutdown immediate; 數據庫已經關閉。 已經卸載數據庫。 ORACLE 例程已經關閉。 SQL> host del F:\OraHome1\oradata\jssweb\jweb.ora ###### 手動刪除數據文件 SQL> startup ORACLE 例程已經啓動。 Total System Global Area 143727516 bytes Fixed Size 453532 bytes Variable Size 109051904 bytes Database Buffers 33554432 bytes Redo Buffers 667648 bytes 數據庫裝載完畢。 ORA-01157: 沒法標識/鎖定數據文件 10 - 請參閱 DBWR 跟蹤文件 ORA-01110: 數據文件 10: ¨F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA¨ ####### 看看,啓動報錯了吧 SQL> select instance_name,status from v$instance; ####### 看看當前數據庫狀態,應該是處於mount INSTANCE_NAME STATUS ---------------- ------------ jssweb MOUNTED
OK, 下面該RMAN出馬了。
SQL> exit C:\Documents and Settings\Administrator>set oracle_sid=jssweb C:\Documents and Settings\Administrator>rman target / 恢復管理器: 版本9.2.0.1.0 - Production Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved. 鏈接到目標數據庫: JSSWEB (DBID=3391142503) RMAN> restore datafile ¨F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA¨; #### 首先修復數據文件。是否是有疑問,爲何不像上面第三節講的那樣先將該數據文件置爲脫機,笨啊你,數據庫都沒打開,脫什麼機啊,整個數據庫如今都是脫機的。 啓動 restore 於 18-7月 -07 正在使用目標數據庫控制文件替代恢復目錄 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=11 devtype=DISK 通道 ORA_DISK_1: 正在開始恢復數據文件備份集 通道 ORA_DISK_1: 正在指定從備份集恢復的數據文件 正將數據文件00010恢復到F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA 通道 ORA_DISK_1: 已恢復備份段 1 段 handle=D:\BACKUP\1AIN4JU5_1_1 tag=TAG20070718T092837 params=NULL 通道 ORA_DISK_1: 恢復完成 完成 restore 於 18-7月 -07 RMAN> recover datafile ¨F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA¨; ######## 恢復數據文件 啓動 recover 於 18-7月 -07 使用通道 ORA_DISK_1 正在開始介質的恢復 完成介質的恢復 完成 recover 於 18-7月 -07 RMAN> alter database open; ######## 看起來很順利,打開數據庫看看 數據庫已打開 RMAN> host ; Microsoft Windows [ 版本 5.2.3790] (C) 版權全部 1985-2003 Microsoft Corp. C:\Documents and Settings\Administrator> sqlplus jss/jss #### 連到該用戶 SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 7月 18 10:33:50 2007 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 鏈接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 - Production SQL> select *from tmp3; ###### 查詢咱們備份後建立的表 COL -------------------------------------------------- test1 test2 test3
yeah, 成功恢復,沒有數據丟失。
附個SQL:用來查詢數據文件,臨時文件與表空間對應及數據文件序號:
select ts.tablespace_name, df.file_name, df.file_id, tf.file_name from dba_tablespaces ts, dba_data_files df, dba_temp_files tf where ts.tablespace_name = df.tablespace_name(+) and ts.tablespace_name = tf.tablespace_name(+)