首先注意:rman備份的時候並不會備份臨時表空間的數據文件(想想也是,反正是臨時的,備它干嘛),所以完全恢復之後,如果臨時表空間的數據文件也丟失,需要手工重新創建臨時表空間的數據文件。據消息靈通人士稱,10G之後的版本會在恢復過程中自動創建臨時表空間的數據文件,手頭沒有環境(11g都出了,俺還在學9i,落後啊。),未經嘗試,有心的朋友如果落實該消息,也不妨通知俺一下:)
其次需要了解:Oracle數據庫的恢復實際上包含了兩個概念:數據庫修復(RESTORE)與數據庫恢復(RECOVER):
數據庫修復:是指利用備份的數據庫文件來替換已經損壞的數據庫文件或者將其恢復到一個新的位置。RMAN在進行修復操作時,會利用恢復目錄(沒有建立恢復目錄的話就使用目標數據庫的控制文件)來獲取備份信息,並從中選擇最合適的備份進行修復操作。選擇備份時有兩個原則(1、選擇距離恢復目錄時刻最近;2、優先選擇鏡像復制,其次才是備份集)
數據庫恢復:是指利用重做日志或增量備份來重建丟失的數據。
再然後需要明白:我們在對目標數據庫做任何形式的修復或者恢復之前,目標數據庫必須處於加載狀態,恢復指定數據文件時,也可以在打開狀態下恢復(什麼,控制文件丟了,進不了加載狀態?黑黑,麻煩了,不過也並非完全無可救藥,接著往下看吧)。
一、對數據庫進行完全介質恢復
過程有三個步驟:
1、啟動數據庫到加載狀態
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
2、執行恢復操作(記的我們剛說過的,恢復分兩步,有先有後的。)
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE DELETE ARCHIVELOGS SKIP TABLESPACE TEMP;
注意:DELETE ARCHIVELOGS和SKIP TABLESPACE兩個參數是可選擇的,作用如下:
DELETE ARCHIVELOGS:表示RMAN將在完成恢復過程後自動刪除那些在恢復過程中修復的歸檔日志文件。
SKIP TABLESPACE:跳過指定表空間,比如臨時表,當然臨時表空間即使你不跳過它也不會恢復的。
3、打開數據庫
RMAN> ALTER DATABASE OPEN;
此處需要注意的一點是,如果你的數據庫並非處於歸檔模式,那麼必須使用ALTER DATABASE OPEN RESETLOGS來打開數據庫,因為RMAN會認為在非歸檔模式下是一個不一致的備份,執行resetlogs之後,Oracle將會把scn重新置為0。
二、恢復表空間
同樣也可以分成三個步驟:
1、啟動數據庫到加載狀態
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;
三、恢復數據文件
事實上,恢復表空間實際就是恢復其所對應的數據文件(一個表空間可能對應多個數據文件),所以步驟與上相似。
1、啟動數據庫到加載狀態
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;
3、打開數據庫
RMAN> ALTER DATABASE OPEN;
四、示例:歸檔模式下,假設某數據文件丟失,恢復該數據文件。
我們來模擬一個過程,首先我們創建一份數據庫的完全備份,然後在數據庫中進行若干操作,之後刪除該數據文件來模擬該文件意外丟失,最後我們通過rman來恢復該數據文件。
還記的我們6章實戰備份裡寫的備份腳本嗎,ok,我們先執行該腳本,進行數據庫備份。
E:\OracleScript\backup> database_backup_JSsweb.bat
千萬表忘了執行完之後看一下輸出的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 bytesVariable 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: 正在指定從備份集恢復的數據文件
正將數據文件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>
附個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(+)