Oracle數據庫備份與恢復總結

關於Oracle數據庫的備份與恢復,網上有不少文章。經過了不少項目,以及我在給公
司做培訓時也有一些總結,現在總結在一起貼出來。以下方法,有一些可能不能完全歸納爲
備份與恢復,但是作爲開發 
DBA,有時也是很有用的。對於生產庫,一般還是推薦使用 
ARCHIVELOG模式下的 
OS備份或 
RMAN方法,要求比較高的可能還必須用到 
RAC等並
行處理的架構,這可是一個很大的主題了,在此不作討論。
這裏列出來,只是自己的一個備忘錄以備需要時查看,有好多不全面或者不當的地方,
歡迎各位補充、批評指正 
! 同時,本文借鑑了網上的一些相關文章,希望大俠們不要見怪,
此處一併謝過。 

exp/imp (導出與導入裝庫與卸庫) 

SQL*Loader 

User Managed Backup and Recovery (用戶管理的備份與恢復 


RMAN 

Flashback 

LogMiner 
.備份與恢復的規劃 
1. exp/imp (導出與導入裝庫與卸庫 

1.1 基本命令 
1. 獲取幫助 
$ exp help=y 
$ imp help=y 
2. 三種工作方式
(1)交互式方式 
$ exp // 然後按提示輸入所需要的參數
(2)命令行方式 
$ exp user/pwd@dbname file=/oracle/test.dmp full=y // 命令行中輸入所需的參數
(3)參數文件方式 
$ exp parfile=username.par // 在參數文件中輸入所需的參數
參數文件 
username.par內容 
userid=username/userpassword 
buffer=8192000 
compress=n 
grants=y 
file=/oracle/test.dmp 
full=y 
3. 三種模式
(1)表方式,將指定表的數據導出 
/導入。
導出:
導出一張或幾張表: 
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2
導出某張表的部分數據 
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1 query=/”where col1=/’…/’ 
and col2 /<…/”
導入:
導入一張或幾張表 
$ imp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2 fromuser=dbuser 
touser=dbuser2 commit=y ignore=y 
(2)用戶方式,將指定用戶的所有對象及數據導出 
/導入。
導出: 
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=(xx,yy) 
只導出數據對象,不導出數據 
(rows=n ) 
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n 
導入: 
$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 
commit=y ignore=y 
(3)全庫方式,將數據庫中的所有對象導出/導入
導出: 
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=y commit=y ignore=y 
導入: 
$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 
1.2 高級選項 
1. 分割成多個文件
以多個固定大小文件方式導出:這種做法通常用在表數據量較大,單個 
dump文件可能
會超出文件系統的限制的情況 
$ exp user/pwd file=1.dmp,2.dmp,3.dmp,… 
filesize=1000m log=xxx.log full=y 
以多個固定大小文件方式導入 
$ imp user/pwd file=1.dmp,2.dmp,3.dmp,… 
filesize=1000m tables=xxx fromuser=dbuser 
touser=dbuser2 commit=y ignore=y 
2. 
增量導出/導入 
// oracle 9i 以後 
exp 不再支持 
inctype 
必須爲 
SYS 或 
SYSTEM 纔可執行增量導出導入
增量導出: 包括三個類型:
(1)“完全”增量導出(Complete) 
// 備份整個數據庫 
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete
(2)“增量型”增量導出導出上一次備份後改變的數據。 
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental 
(3) 
“累計型”增量導出(Cumulative)只導出自上次“完全”導出之後數據庫中變化
了的信息。 
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative
增量導入: 
$ imp usr/pwd FULL=y inctype=system/restore/inctype 
其中: 
SYSTEM:導入系統對象 
RESTORE: 導入所有用戶對象 
3. 以SYSDBA進行導出 
/導入 
1. 用於 
Oracle技術支持 
2. 用於表空間傳輸
例: 
$ imp /'usr/pwd@instance as sysdba/' tablespaces=xx transport_tablespace=y 
file=xxx.dmp datafiles=xxx.dbf 
$ imp file=expdat.dmp userid=”””sys/password as sysdba””” 
transport_tablespace=y 
“datafile=(c:tempapp_data,c:tempapp_index)” 
4. 
表空間傳輸 (速度快 

表空間傳輸是 
8i新增加的一種快速在數據庫間移動數據的一種辦法,是把一個數
據庫上的格式數據文件附加到另外一個數據庫中,而不是把數據導出成 
dmp文件,這
在有些時候是非常管用的,因爲傳輸表空間移動數據就象複製文件一樣快。 
1.關於傳輸表空間有一些規則 
(10g前): 
.源數據庫和目標數據庫必須運行在相同的硬件平臺上。
.源數據庫與目標數據庫必須使用相同的字符集。 
.源數據庫與目標數據庫一定要有相同大小的數據塊 
.目標數據庫不能有與遷移表空間同名的表空間 

SYS的對象不能遷移 
.必須傳輸自包含的對象集 
.有一些對象,如物化視圖,基於函數的索引等不能被傳輸 
(同字節序文件的跨平臺可以用更換數據文件的文件頭的方法) 
(10g支持跨平臺的表空間傳輸,只要操作系統字節順序相同,就可以進行表空間
傳輸。需要使用 
RMAN轉換文件格式,略) 
2. 檢測一個表空間是否符合傳輸標準的方法: 
SQL > exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true); 
SQL > select * from sys.transport_set_violations; 
如果沒有行選擇,表示該表空間只包含表數據,並且是自包含的。對於有些非自包
含的表空間,如數據表空間和索引表空間,可以一起傳輸。 
3. 簡要使用步驟:
如果想參考詳細使用方法,也可以參考 
ORACLE聯機幫助。 
1.設置表空間爲只讀(假定表空間名字爲 
APP_Data 和 
APP_Index) 
SQL > alter tablespace app_data read only; 
SQL > alter tablespace app_index read only; 
2.發出 
EXP命令 
SQL> host exp userid=”””sys/password as sysdba””” 
transport_tablespace=y 
tablespaces=(app_data, app_index) 
以上需要注意的是 
•爲了在 
SQL中執行 
EXP,USERID必須用三個引號,在 
UNIX中也必須注意
避免“/”的使用 
•在 
816和以後,必須使用 
sysdba才能操作 
•這個命令在 
SQL中必須放置在一行(這裏是因爲顯示問題放在了兩行) 
3.拷貝.dbf數據文件(以及.dmp文件)到另一個地點,即目標數據庫
可以是 
cp(unix)或 
copy(windows)或通過 
ftp傳輸文件(一定要在 
bin方式) 
4.把本地的表空間設置爲讀寫 
$ alter tablespace app_data read write; 
$ alter tablespace app_index read write; 
5.在目標數據庫附加該數據文件 (直接指定數據文件名) 
(表空間不能存在,必須建立相應用戶名或者用 
fromuser/touser) 
$ imp file=expdat.dmp userid=”””sys/password as sysdba””” 
transport_tablespace=y datafiles=(“c:/app_data.dbf,c:/app_index.dbf”) 
tablespaces=app_data,app_index tts_owners=hr,oe 
6.設置目標數據庫表空間爲讀寫 
$ alter tablespace app_data read write; 
$ alter tablespace app_index read write; 
1.3 優化 
1. 加快exp速度
加大 
large_pool_size,可以提高 
exp的速度
採用直接路徑的方式(direct=y),數據不需要經過內存進行整合和檢查. 
設置較大的 
buffer,如果導出大對象,小 
buffer會失敗。 
export文件不在 
ORACLE使用的驅動器上
不要 
export到 
NFS文件系統 
UNIX環境:用管道模式直接導入導出來提高 
imp/exp的性能 
2. 加快imp速度
建立一個 
indexfile,在數據 
import完成後在建立索引
將 
import文件放在不同的驅動器上
增加 
DB_BLOCK_BUFFERS 
增加 
LOG_BUFFER 
用非歸檔方式運行 
ORACLE:ALTER DATABASE NOARCHIVELOG;
建立大的表空間和回滾段,OFFLINE其他回滾段,回滾段的大小爲最大表的 
1/2 
使用 
COMMIT=N 
使用 
ANALYZE=N 
單用戶模式導入 
UNIX環境:用管道模式直接導入導出來提高 
imp/exp的性能 
3. 通過unix/Linux PIPE管道加快exp/imp速度
通過管道導出數據 

1.通過 
mknod -p建立管道 
$ mknod /home/exppipe p // 在目錄/home下建立一個管道 
exppipe注意參數 

2.通過 
exp和 
gzip導出數據到建立的管道並壓縮 
$ exp test/test file=/home/exppipe & gzip < /home/exppipe > exp.dmp.gz 
$ exp test/test tables=bitmap file=/home/newsys/test.pipe & 
gzip < /home/newsys/test.pipe > bitmap.dmp.gz 
3.導出成功完成之後刪除建立的管道 
$ rm -rf /home/exppipe 
導出腳本: 
###UNIX下ORACLE數據庫通過PIPE管道進行備份
###### using "export" and "tar" command to bakup oracle datebase ####### 
trap "" 1 #nohup 
LOGFILE=/opt/bakup/log/bakup_ora.log 
export LOGFILE 
DUMPDIR=/archlog_node1 
export DUMPDIR 
exec >$LOGFILE 2>&1 
echo 
echo ' Begin at ' `date` 
echo 
# clear old result file 
cd $DUMPDIR 
if [ -f exp.dmp.Z ] 
then 
echo "clear old result file" 
rm exp.dmp.Z 
fi 
# make pipe 
mkfifo exp.pipe 
chmod a+rw exp.pipe 
# gain the dmp.Z file 
compress < exp.pipe > exp.dmp.Z & 
su -u oracle -c "exp userid=ll/ll file=$DUMPDIR/exp.pipe full=y buffer=20000000" 
echo 
echo ' exp end at '`date` 
echo 
# rm pipe 
rm exp.pipe 
# tar the dmp.Z file to tape 
mt -f /dev/rmt/0 rew 
tar cvf /dev/rmt/0 exp.dmp.Z 
echo 
echo ' tar end at '`date` 
echo 
通過管道導入生成的文件: 
1.通過 
mknod -p建立管道
$ mknod /home/exppipe p 
2.導入生成的壓縮文件 
$ imp test/test file=/home/exppipe fromuser=test touser=macro & 
gunzip < exp.dmp.gz > /home/exppipe 
3.刪除管道 
$ rm –fr /home/exppipe 
4. 全庫導入的一般步驟
注意:在導出時,需要通過toad或其他工具提取源數據庫創建主鍵和索引的腳本 
1. 
先全庫加 
rows=n把結構導進去 
$ imp system/manager file=exp.dmp log=imp.log full=y rows=n indexes=n 
2. 使業務用戶的觸發器失效 
/刪除主鍵和唯一索引 
spool drop_pk_u.sql 
select 'alter table '||table_name||' drop constraint '||constraint_name||';' 
from user_constraints 
where constraint_type in ('P','U'); 

spool off 
spool disable_trigger.sql 
select 'alter trigger '||trigger_name||' disable;' 
from user_triggers; 

spool off 
@drop_pk_u.sql 
@disable_trigger.sql 
3. 
以 
ignore=y全庫導入 
$ imp system/manager file=exp.dmp log=imp.log full=y ignore=y 
4. 通過 
toad或其他工具提取源數據庫創建主鍵和索引的腳本,在目標數據庫中創建主鍵
和索引。使觸發器生效。 
1.4 常見問題 
1. 
字符集問題 
ORACLE多國語言設置是爲了支持世界範圍的語言與字符集,一般對語言提示,
貨幣形式,排序方式和 
CHAR,VARCHAR2,CLOB,LONG字段的數據的顯示等有效。 
ORACLE的多國語言設置最主要的兩個特性就是國家語言設置與字符集設置,國家語
言設置決定了界面或提示使用的語言種類,字符集決定了數據庫保存與字符集有關數據
(如文本)時候的編碼規則。 
ORACLE字符集設定,分爲數據庫字符集和客戶端字符集環境設置。在數據庫端,
字符集在創建數據庫的時候設定,並保存在數據庫 
props$表中。
在客戶端的字符集環境比較簡單,主要就是環境變量或註冊表項 
NLS_LANG,注
意 
NLS_LANG的優先級別爲:參數文件<註冊表<環境變量<alter session。如果客戶端
字符集和服務器端字符集不一樣,而且字符集的轉換也不兼容,那麼客戶端的數據顯示
與導出/導入的與字符集有關的數據將都是亂碼。
使用一點點技巧,就可以使導出/導入在不同的字符集的數據庫上轉換數據。這裏
需要一個 
2進制文件編輯工具即可,如 
uedit32。用編輯方式打開導出的 
dmp文件,獲
取 
2、 
3字節的內容,如 
00 01,先把它轉換爲 
10進制數,爲 
1,使用函數 
NLS_CHARSET_NAME即可獲得該字符集: 
SQL> select nls_charset_name(1) from dual; 
NLS_CHARSET_NAME(1) 
US7ASCII 
可以知道該 
dmp文件的字符集爲 
US7ASCII,如果需要把該 
dmp文件的字符集換
成 
ZHS16GBK,則需要用 
NLS_CHARSET_ID獲取該字符集的編號: 
SQL> select nls_charset_id('zhs16gbk') from dual; 
NLS_CHARSET_ID('ZHS16GBK') 
852 
把 
852換成 
16進制數,爲 
354,把 
2、3字節的 
00 01換成 
03 54,即完成了把該 
dmp文件字符集從 
us7ascii到 
zhs16gbk的轉化,這樣,再把該 
dmp文件導入到 
zhs16gbk
字符集的數據庫就可以了。 
2. 版本問題 
Exp/Imp很多時候,可以跨版本使用,如在版本 
7與版本 
8之間導出導入數據,但
這樣做必須選擇正確的版本,規則爲: 
•總是使用 
IMP的版本匹配數據庫的版本,如果要導入到 
816,則使用 
816的導入工
具。 
•總是使用 
EXP的版本匹配兩個數據庫中低的那個版本,如在 
815與 
816之間互導,
則使用 
815的 
EXP工具。 
imp和 
exp版本不能往上兼容: imp可以導入低版本 
exp生成的文件, 不能導入高
版本 
exp生成的文件
2. SQL*Loader 
2.1 基本知識 
Oracle 的 
SQL*LOADER可以將外部格式化的文本數據加載到數據庫表中。通常
與 
SPOOL導出文本數據方法配合使用。 
1.命令格式 
SQLLDR keyword=value [,keyword=value,...] 
例: 
$ sqlldr user/pwd control=emp.ctl data=emp.dat bad=emp.bad log=emp.log 
2.控制文件 
SQL*LOADER根據控制文件可以找到需要加載的數據。並且分析和解釋這些數
據。
控制文件由三個部分組成,具體參數參考幫助文檔: 
1. 全局選件,行,跳過的記錄數等; 
2. INFILE子句指定的輸入數據; 
3. 數據特性說明。 
comment: --註釋
例: 
load data 
infile * 
append --除了 
append外,還有 
insert、replace、truncate等方式 
into table emp 
fields terminated by ‘|’ 

no float external, 
name char(20), 
age integer external, 
duty char(1), 
salary float external, 
upd_ts date(14) ‘YYYYMMDDHH24MISS’ 

begindata 
100000000003|Mulder|000020|1|000000005000|20020101000000 
100000000004|Scully|000025|2|000000008000|20020101235959 
控制文件中 
infile選項跟 
sqlldr命令行中 
data選項含義相同,如使用 
infile *則表明
數據在本控制文件以 
begin data開頭的區域內。
一些選項: 
FIELDS TERMINATED BY WHITESPACE 
FIELDS TERMINATED BY x'09' 
FILLER_1 FILLER, // 指定某一列將不會被裝載 
DEPTNO position(1:2), DNAME position(*:16), // 指定列的位置 
SEQNO RECNUM //載入每行的行號 
SKIP n // 指定導入時可以跳過多少行數據 
3.數據文件
按控制文件數據格式定義的數據行集,例: 
100000000001|Tom|000020|1|000000005000|20020101000000 
100000000002|Jerry|000025|2|000000008000|20020101235959 
固定格式、可變格式、流記錄格式:
固定格式:
當數據固定的格式(長度一樣)時且是在文件中得到時,要用 
INFILE "fix n" 
load data 
infile 'example.dat' "fix 11" 
into table example 
fields terminated by ',' optionally enclosed by '"' 
(col1 char(5), 
col2 char(7)) 
example.dat: 
001, cd, 0002,fghi, 
00003,lmn, 
1, "pqrs", 
0005,uvwx, 
可變格式: 
當數據是可變格式(長度不一樣)時且是在文件中得到時,要用 
INFILE "var n"。如: 
load data 
infile 'example.dat' "var 3" 
into table example 
fields terminated by ',' optionally enclosed by '"' 
(col1 char(5), 
col2 char(7)) 
example.dat: 
009hello,cd,010world,im, 
012my,name is, 
流記錄格式: // Stream-recored format: 
load data infile 'xx.dat' "str '|/n'" 
into table xx field terminated by ',' optionally enclosed by '"' 
(col1 char(5), col2 char(7)) 
example.dat: 
hello, ccd,| 
world, bb,| 
4. 壞文件 
bad=emp.bad 
壞文件包含那些被 
SQL*Loader拒絕的記錄。被拒絕的記錄可能是不符合要求的記
錄。 
5. 日誌文件及日誌信息 
log=emp.log 
當 
SQL*Loader 開始執行後,它就自動建立日誌文件。日誌文件包含有加載的總
結,加載中的錯誤信息等。 
2.2 高級選項 
1. Conventional Path Load 與 
Direct Path Load 
Conventional-path Load:
通過常規通道方式上載。
特點:commit, always gen redo logs, enforce all constraints, fire insert triggers, can 
load into cluster, other user can make change 
rows:每次提交的記錄數 
bindsize:每次提交記錄的緩衝區 
readsize:與 
bindsize成對使用,其中較小者會自動調整到較大者 
sqlldr先計算單條記錄長度,乘以 
rows,如小於 
bindsize,不會試圖擴張 
rows以填
充 
bindsize;如超出,則以 
bindsize爲準。
命令爲: 
$ sqlldr dbuser/oracle control=emp.ctl log=emp.log rows=10000 bindsize=8192000 
Direct-Path Load:
通過直通方式上載,可以跳過數據庫的相關邏輯,不進行 
SQL解析,而直接將數
據導入到數據文件中。
特點:save, conditionly gen redo logs, enforce PK UK NN, not fire triggers, can not load 
into cluster, other user can not make change
命令爲: 
$ sqlldr dbuser/oracle control=emp.ctl log=emp.log direct=true 
2. SPOOL導出文本數據方法
導入的數據文件可以用 
SPOOL導出文本數據方法生成。 
SQL*PLUS環境設置 
SET NEWPAGE NONE HEADING OFF SPACE 0 PAGESIZE 0 
SET TRIMOUT ON TRIMSPOOL ON LINESIZE 2500 
注:LINESIZE要稍微設置大些,免得數據被截斷,它應和相應的 
TRIMSPOOL結
合使用防止導出的文本有太多的尾部空格。
但是如果 
LINESIZE設置太大,會大大降低導出的速度,另外在 
WINDOWS下導
出最好不要用 
PLSQL導出,速度比較慢,直接用 
COMMEND下的 
SQLPLUS命令最
小化窗口執行。對於字段內包含很多回車換行符的應該給與過濾,形成比較規矩的文本
文件。
通常情況下,我們使用 
SPOOL方法,將數據庫中的表導出爲文本文件,如下述: 
set trimspool on 
set linesize 120 pagesize 2000 newpage 1 heading off term off 
spool 路徑+文件名 
select col1||','||col2||','||col3||','||col4||'..' from tablename; 
spool off 
2.3腳本 
1. 將表中數據記錄導出爲字段值用分隔符'|'分開的.dat文件 
#!/bin/ksh 
################################################################## 
##名稱: unloadtable 
##功能: 本shell用於將表中數據記錄導出
##導出爲字段值用分隔符'|'分開的.dat文件
##編者:
##日期: 2006.03.18 
################################################################## 
if [ $# -ne 3 ] 
then 
echo "usage:unloadtable tablename username password." 
exit 0 
fi 
##準備工作
echo "set heading off " >/tmp/$1.col 
echo "set pagesize 0" >>/tmp/$1.col 
echo "set linesize 800 " >>/tmp/$1.col 
echo "set feedback off " >>/tmp/$1.col 
echo "set tab off " >>/tmp/$1.col 
echo "select column_name||',' from user_tab_columns where lower(table_name)='$1' order by 
column_id; " >> /tmp/$1.col 
##產生select語句
echo "set heading off " >/tmp/$1.sel 
echo "set pagesize 0" >>/tmp/$1.sel 
echo "set linesize 800 " >>/tmp/$1.sel 
echo "set feedback off " >>/tmp/$1.sel 
echo "set tab off " >>/tmp/$1.sel 
echo "select " >>/tmp/$1.sel 
echo `sqlplus -s $2/$3 < /tmp/$1.col` |sed "s/,/||'|'||/g" |sed "s/||$//g"|sed "s/date//"date/"/g" 
>>/tmp/$1.sel 
##生成dat文件
#echo "from $1;/n/" >>/tmp/$1.sel由於/ 導致多執行一次select 
echo "from $1;/n" >>/tmp/$1.sel 
sqlplus -s $2/$3 < /tmp/$1.sel >$1_tmp.dat 
#awk '{if(FNR!=1) print $0}' $1_tmp.dat >$1.dat FNR選項使得第一條記錄選不出
awk '{print $0}' $1_tmp.dat >$1.dat 
rm -f $1_tmp.dat 
2. 將數據導入到相應表中 
#!/bin/ksh 
################################################################## 
##名稱:loadtable 
##功能:本shell用於將已經準備好的.dat數據文件導入相應的表中
## .dat文件各個字段值用分隔符'|'分開。
##編者:
##日期: 2006.03.18 
################################################################## 
if [ $# -ne 3 ] 
then 
echo "usage:loadtable tablename username password." 
exit 0 
fi 
##準備工作
echo "set heading off " >/tmp/$1.colsql 
echo "set pagesize 0" >>/tmp/$1.colsql 
echo "set linesize 800 " >>/tmp/$1.colsql 
echo "set feedback off " >>/tmp/$1.colsql 
echo "set tab off " >>/tmp/$1.colsql 
echo "select column_name||',' from user_tab_columns where lower(table_name)='$1' order by 
column_id; " >> /tmp/$1.colsql 
##產生ctl文件
echo "load data" >/tmp/$1.ctl 
echo "infile *" >>/tmp/$1.ctl 
echo "into table $1" >>/tmp/$1.ctl 
echo "fields terminated by '|'" >>/tmp/$1.ctl 
echo `sqlplus -s $2/$3 < /tmp/$1.colsql` |sed "s/,$/)/g" |sed "s/^/(/g" >>/tmp/$1.ctl 
##開始導入數據
echo "truncate table $1;" >/tmp/$1.sql 
sqlplus $2/$3 < /tmp/$1.sql 
sqlldr $2/$3 data=$1.dat control=/tmp/$1.ctl log=/tmp/$1.log 
3. OS備份/用戶管理的備份與恢復 
(User 
Managed Backup and Recovery) 
用戶管理的備份與恢復也稱 
OS物理備份,是指通過數據庫命令設置數據庫爲備份
狀態,然後用操作系統命令,拷貝需要備份或恢復的文件。這種備份與恢復需要用戶的
參與手工或自動完成。
對於使用 
OS拷貝備份的數據文件,可以使用 
DBVERTIFY 進行檢驗。DBVERTIFY 
是一個外部工具,主要用於校驗數據文件或備份的數據文件的數據塊是否正確。
例: 
dbv /u01/oradata/oracle/users01.dbf BLOCKSIZE=8192
參數說明:
關鍵字說明(默認) 
-----------------------
--------------------
FILE
要檢驗的文件(NONE) 
START起始塊(文件的第一個塊) 
END結束塊(文件的最後一個塊) 
BLOCKSIZE邏輯塊大小(2048) 
LOGFILE輸出日誌(NONE) 
FEEDBACK顯示進程(0) 
Recover 還可以進行測試,檢測恢復的錯誤,錯誤信息記載在 
alert_SID.log 文件
中,通過測試,我們可以知道該恢復操作是否能正常完成。 
SQL> RECOVER TABLESPACE sales TEST; 
SQL> RECOVER DATABASE UNTIL CANCEL TEST; 
3.1 相關設置 
3.1.1 設置ARCHIVELOG與NONARCHIVELOG模式
重做日誌組是以循環方式使用的,重做日誌組會被覆蓋重做日誌信息就會丟失。爲
了保存歷史以來的重做日誌,數據庫可以運行在日誌歸檔模式下(archivelog mode)。
在日誌歸檔模式下,當日志組撤換到下一個組時後臺進程 
ARCn將上一個日誌文件復
制到另一個地方(oracle 10g 使用快速恢復區會歸檔到該區)保存。數據庫默認爲非歸檔
模式(noarchivelog mode)。
設置 
ARCHIVELOG模式步驟: 
1. 關閉數據庫,備份已有的數據,改變數據庫的運行方式是對數據庫的重要改動,所
以要對數據庫做備份,對可能出現的問題作出保護。 
2. 
修改初試化參數: 使用 
PFILE,修改初始化參數文件 
init[SID].ora 
log_archive_start=true #啓動自動歸檔 
log_archive_format=ARC%T%S.arc #歸檔文件格式 
log_archive_dest=/arch12/arch #歸檔路徑
3. 
啓動 
Instance到 
Mount狀態,即加載數據庫但不打開數據庫: 
SQL > startup mount; 
4. 
發出修改命令 
SQL > alter database archivelog; 
SQL > alter database open; 
設置 
NONARCHIVELOG模式步驟同上,只需修改相應參數值即可。 
3.1.2 LOGGING 與 
NOLOGGING 
表空間、表、索引、分區可以設置爲 
NOLOGGING,用於快速裝入數據(Direct Load)。
在插入數據時只寫入最小的重做日誌和回滾數據。在歸檔數據庫模式下,執行 
Direct Load 
操作後應立即進行備份,否則不能使用之前的備份進行恢復。另外,用戶可以設置數據庫的
強制日誌模式,使用所有操作都記入日誌。 
LOGGING 與 
NOLOGGING 的區別: 
LOGGING NOLOGGING 
所有的更改寫入 
REDO 最小寫入 
REDO LOG 
從最近備份中完全恢復不能從最近備份中完全恢復
不需要增加備份需要增加備份
NOLOGGING 的操作: 
CREATE TABLE … 
NOLOGGING AS SELECT語句 
INSERT /*+APPEND*/ INTO <表> NOLOGGING SELECT 語句 
INSERT /*+ PARALLEL(<表>,<n>)達式*/ INTO <表> NOLOGGING SELECT 語句 
SQL*LOADER 的 
DIRECT 方法
例: 
SQL>CREATE TABLE emp1 NOLOGGING AS SELECT * FROM emp; 
SQL>SELECT name,unrecoverable_time FROM V$DATAFILE; 
SQL>INSERT /*+ APPEND */ INTO emp1 NOLOGGING SELECT* * FROM emp; 
SQL>SELECT name,unrecoverable_time FROM V$DATAFILE; 
SQL>ALTER DATABASE NO FORCE LOGGING; 
3.1.3 歸檔路徑
在歸檔模式下進行自動歸檔時,或者在恢復時設置歸檔所在的位置,需要設置歸檔路徑
初始化參數: 
LOG_ARCHIVE_DEST_n=”LOCATION=path MANDATORY|OPTIONAL REOPEN=n” 
LOG_ARCHIVE_DEST_n=”SERVICE=standby MANDATORY|OPTIONAL REOPEN=n” 
3.2 NONARCHIVELOG模式 
3.2.1 脫機冷備與恢復
冷備份發生在數據庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的數
據庫。冷備份是將關鍵性文件拷貝到另外位置的一種說法。對於備份 
Oracle信息而言,冷
備份是最快和最安全的方法。
冷備份的優點: 
1.是非常快速的備份方法(只需拷貝文件) 
2.容易歸檔(簡單拷貝即可) 
3.容易恢復到某個時間點上(只需將文件再拷貝回去) 
4.能與歸檔方法相結合,作數據庫“最新狀態”的恢復。 
5.低度維護,高度安全。
冷備份的不足: 
1.單獨使用時,只能提供到“某一時間點上”的恢復。 
2.在實施備份的全過程中,數據庫必須要作備份而不能作其它工作。也就是說,在
冷備份過程中,數據庫必須是關閉狀態。 
3.若磁盤空間有限,只能拷貝到磁帶等其它外部存儲設備上,速度會很慢。 
4.不能按表或按用戶恢復。
如果可能的話(主要看效率),應將信息備份到磁盤上,然後啓動數據庫(使用戶可以
工作)並將所備份的信息拷貝到磁帶上(拷貝的同時,數據庫也可以工作)。冷備份中必須
拷貝的文件包括: 
1.所有數據文件 
2.所有控制文件 
3.所有聯機 
REDO LOG文件 
4.參數化參數 
Init.ora文件(可選)。 
3.2.2 案例 
1.9i 脫機冷備/恢復的例子:
(1)關閉數據庫 
$ sqlplus /nolog 
SQL> connect /as sysdba 
SQL> shutdown normal;
(2)用拷貝命令備份 
/恢復全部的時間文件、重做日誌文件、控制文件、初始化參數
文件 
SQL > host cp xx xx;
可以使用以下冷備腳本: 
#!/bin/bash 
################################################################## 
##名稱: coldback_gen.sh 
##功能:本shell用於生成冷備份腳本, 進行冷備份
同時生成相應的恢復命令
##可以修改後在生成後立即執行
##編者: 
##日期: 2006.12.13. 
################################################################## 
##設置變量
##設置臨時文件名
tempsql=./backup.sql 
##設置備份文件存放路徑
backdate=`date -u +%Y%m%d` 
backupdir=/u04/oracle/coldback/$backdate 
mkdir $backupdir 
##設置備份腳本文件名
backupsh=$backupdir/coldback.sh 
rcvrsh=$backupdir/recovery.sh 
echo "正在生成冷備份腳本[$backupsh]..." 
##檢查ORACLE數據庫是否啓動
oraisrun=`ps -ef|grep -c ora_` 
if [ "$oraisrun" = "0" ] || [ "$oraisrun" = "1" ] 
then 
echo "ORACLE數據庫尚未啓動,請先啓動ORACLE" 
echo "" 
exit 
fi 
##準備工作
echo "set heading off " > $tempsql 
echo "set feedback off " >>$tempsql 
echo "set tab off " >>$tempsql 
echo "set verify off " >>$tempsql 
echo "set pagesize 0" >>$tempsql 
echo "set linesize 800 " >>$tempsql 
echo "select '#!/bin/bash' from dual;" >> $tempsql 
echo "select '' from dual;" >> $tempsql 
echo "select '## 備份腳本生成時間: " `date +%Y年%m月%d日-%H:%M:%S` "' 
from dual;" >> $tempsql 
echo "select '## 備份目的路徑: $backupdir' from dual; " >> $tempsql 
echo "select '' from dual; " >> $tempsql 
echo "" 
echo "select 'echo ''開始進行脫機冷備...''' from dual; " >> $tempsql 
echo "select 'echo ''備份目的路徑: $backupdir ''' from dual; " >> $tempsql 
##這裏不直接關閉數據庫,提示用戶手工關閉爲好如果需要直接關閉,請修改
echo "select 'orarun='||'/`'||'ps -ef|grep -c ora_'||'/`' from dual;" >>$tempsql 
echo "select 'if [ "/$orarun" != "0" ] && [ "/$orarun" != "1" ] ' from dual;" >>$tempsql 
echo "select 'then' from dual; " >>$tempsql 
echo "select 'echo '' '' ' from dual;" >>$tempsql 
echo "select 'echo ''ORACLE數據庫已啓動,請先關閉ORACLE數據庫'' ' from dual; 
" >>$tempsql 
echo "select 'echo '' '' ' from dual;" >>$tempsql 
echo "select 'exit' from dual; " >>$tempsql 
echo "select 'fi' from dual; " >>$tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'echo ''正在備份控制文件...''' from dual; " >> $tempsql 
echo "select 'cp ' ||name||' $backupdir' from v/$controlfile; " >> $tempsql 
echo "select 'echo ''控制文件備份完畢!''' from dual; " >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'echo ''正在備份數據文件...''' from dual; " >> $tempsql 
echo "select 'cp ' ||name||' $backupdir' from v/$datafile; " >> $tempsql 
echo "select 'echo ''數據文件備份完畢!''' from dual; " >> $tempsql 
echo "select 'echo ''正在備份聯機日誌...''' from dual; " >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'cp '||member||' $backupdir' from v/$logfile; " >> $tempsql 
echo "select 'echo ''聯機日誌備份完畢!''' from dual;" >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'echo ''脫機冷備完畢!''' from dual;" >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
##生成冷備份執行腳本
sqlplus -s ' / as sysdba' < $tempsql > $backupsh 
rm -f $tempsql 
chmod +x $backupsh 
cp $backupsh . 
echo "正在生成冷備對應的恢復腳本[$rcvrsh]..." 
##準備工作
echo "set heading off " > $tempsql 
echo "set feedback off " >>$tempsql 
echo "set tab off " >>$tempsql 
echo "set verify off " >>$tempsql 
echo "set pagesize 0" >>$tempsql 
echo "set linesize 800 " >>$tempsql 
echo "select '#!/bin/bash' from dual;" >> $tempsql 
echo "select '' from dual;" >> $tempsql 
echo "select '## 恢復腳本生成時間: " `date +%Y年%m月%d日-%H:%M:%S` "' 
from dual;" >> $tempsql 
echo "select '## 恢復文件所在路徑: $backupdir' from dual; " >> $tempsql 
echo "select '' from dual; " >> $tempsql 
echo "" 
echo "select 'echo ''開始進行文件的複製恢復...''' from dual; " >> $tempsql 
echo "select 'echo ''恢復文件所在的路徑: $backupdir ''' from dual; " >> $tempsql 
##這裏不直接關閉數據庫,提示用戶手工關閉爲好如果需要直接關閉,請修改
echo "select 'orarun='||'/`'||'ps -ef|grep -c ora_'||'/`' from dual;" >>$tempsql 
echo "select 'if [ "/$orarun" != "0" ] && [ "/$orarun" != "1" ] ' from dual;" >>$tempsql 
echo "select 'then' from dual; " >>$tempsql 
echo "select 'echo '' '' ' from dual;" >>$tempsql 
echo "select 'echo ''ORACLE數據庫已啓動,請先關閉ORACLE數據庫'' ' from dual; 
" >>$tempsql 
echo "select 'echo '' '' ' from dual;" >>$tempsql 
echo "select 'exit' from dual; " >>$tempsql 
echo "select 'fi' from dual; " >>$tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'echo ''正在恢復控制文件...''' from dual; " >> $tempsql 
echo "select 'cp '||'$backupdir'||'/'||substr(name,instr(name,'/',-1)+1, 
length(name)-instr(name,'/',-1) )||' '||name from v/$controlfile; " >> $tempsql 
echo "select 'echo ''控制文件恢復完畢!''' from dual; " >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'echo ''正在恢復數據文件...''' from dual; " >> $tempsql 
echo "select 'cp '||'$backupdir'||'/'||substr(name,instr(name,'/',-1)+1, 
length(name)-instr(name,'/',-1) )||' '||name from v/$datafile; " >> $tempsql 
echo "select 'echo ''數據文件恢復完畢!''' from dual; " >> $tempsql 
echo "select 'echo ''正在恢復聯機日誌...''' from dual; " >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'cp '||'$backupdir'||'/'||substr(member,instr(member,'/',-1)+1, 
length(member)-instr(member,'/',-1) )||' '||member from v/$logfile; " >> $tempsql 
echo "select 'echo ''聯機日誌恢復完畢!''' from dual;" >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'echo ''脫機冷備恢復完畢!''' from dual;" >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
echo "select 'echo '' '' ' from dual; " >> $tempsql 
##生成冷備恢復的執行腳本
sqlplus -s ' / as sysdba' < $tempsql > $rcvrsh 
rm -f $tempsql 
chmod +x $rcvrsh 
cp $rcvrsh . 
echo "生成脫機冷備備份與恢復腳本完畢!" 
echo "請檢查腳本文件: [$backupsh]" 
echo " [$rcvrsh]" 
echo "" 
#如果需要生成後立即執行備份,可增加關閉數據庫的操作,然後將以一幾行的注
釋#去掉即可
#./$backupsh 
#echo "備份執行完畢,請檢查!" 
#echo "" 
(3)重啓 
Oracle數據庫 
$ sqlplus /nolog 
SQL> connect /as sysdba 
SQL> startup 
2.如果自從上次脫機冷備後,數據文件錯誤,聯機日誌沒有被覆蓋,可模擬不完全恢
復。 
1. SQL> shutdown; 
2.$ cp....; // 只恢復出錯的數據文件 
3. SQL> startup mount; 
4. SQL> recover database; 
5. SQL> alter database open; 
3.3 ARCHIVELOG模式 
3.3.1 脫機冷備與恢復
同 
NONARCHIVELOG模式 
3.3.2 
聯機熱備
聯機熱備是在數據庫運行的情況下進行備份的方法。熱備份要求數據庫在 
Archivelog
方式下操作,並需要大量的檔案空間。
熱備份的優點: 
1.可在表空間或數據文件級備份,備份時間短。 
2.備份時數據庫仍可使用,支持 
24*7不間斷運行。 
3.可達到秒級恢復(恢復到某一時間點上)。 
4.可對幾乎所有數據庫實體作恢復。 
5.恢復是快速的,在大多數情況下在數據庫仍工作時恢復。
熱備份的不足是: 
1.不能出錯,否則後果嚴重。 
2.若熱備份不成功,所得結果不可用於時間點的恢復。 
3.因難於維護,所以要特別仔細小心,不允許“以失敗而告終”。
注意:在熱備過程中系統會生成更多的重做日誌和回滾數據。所以必須在數據庫較
空閒時才進行備份。
備份內容: 
(1) 
數據文件: 一個表空間一個表空間地備份 
sql> alter tablespace users begin backup; 
sql> $copy '/xx/xx.dbf ' '/yy/yy.dbf' ; 
sql> alter tablespace users end backup; 
sql> alter system checkpoint; 
(只讀表空間直接拷貝,不用 
begin backup) 
(2) 備份歸檔 
log文件
(1)臨時停止歸檔進程 
log_archive_max_processes=0 
(2)log下那些在 
archive redo log目標目錄中的文件
(3)重新啓動 
archive進程
(4)備份歸檔的 
redo log 文件 
(3) 
備份聯機的控制文件: 
sql> alter database backup controlfile to '/xx/xx.ctl'; 
(4) 
備份初始化文件配置文件等: 
sql> $copy .. .. ; 
熱備腳本:hotback.sql 
Rem 熱備份腳本for Linux 
Rem 執行該腳本必須保證數據庫處於歸檔模式
Rem [email protected] 2007-03-17 
Rem 
Rem 設置SQL*Plus環境參數
Rem 
set feedback off 
set pagesize 0 
set heading off 
set verify off 
set linesize 100 
set trimspool on 
Rem 設置備份相關的路徑For Linux 
Rem 設置數據文件備份路徑
define datafile_dir = '/u05/oracle/hotback/datafile' 
Rem 設置歸檔日誌文件備份路徑
define archlog_dir = '/u05/oracle/hotback/archlog' 
Rem 設置控制文件備份路徑
define controlfile_dir = '/u05/oracle/hotback/controlfile' 
Rem 設置生成的備份腳本名
define hotback = '/u05/oracle/hotback/open_hot_backup.sql' 
define spoolfile = '/u05/oracle/hotback/spool.tmp' 
define cpy = 'cp' 
prompt *** Spooling to &hotback 
Rem 產生備份數據文件、歸檔日誌文件的命令
set serveroutput on size 1000000 
spool &hotback 
prompt spool &spoolfile 
prompt archive log list;; 
prompt alter system switch logfile;; 
prompt alter system archive log all;; 
DECLARE 
CURSOR cur_tablespace IS 
SELECT tablespace_name 
FROM dba_tablespaces 
ORDER BY tablespace_name; 
CURSOR cur_datafile (tn VARCHAR) IS 
SELECT file_name 
FROM dba_data_files 
WHERE tablespace_name = tn 
ORDER BY file_name; 
CURSOR cur_arch_dest IS 
SELECT value 
FROM v$parameter 
WHERE name = 'log_archive_dest'; 
BEGIN 
FOR ct IN cur_tablespace LOOP 
IF ct.tablespace_name!='TEMP' then 
dbms_output.put_line ('alter tablespace '||ct.tablespace_name||' begin backup;'); 
FOR cd IN cur_datafile (ct.tablespace_name) LOOP 
dbms_output.put_line ('host &cpy '||cd.file_name||' &datafile_dir'); 
END LOOP; 
dbms_output.put_line ('alter tablespace '||ct.tablespace_name||' end backup;'); 
end if; 
END LOOP; 
FOR dest IN cur_arch_dest LOOP 
dbms_output.put_line ('host &cpy '|| dest.value || '/* &archlog_dir '); 
END LOOP; 
END; 

Rem 產生備份控制文件的命令
prompt alter system archive log current;; 
prompt alter database backup controlfile to trace;; 
prompt alter database backup controlfile to '&controlfile_dir/control.bak' REUSE;; 
prompt archive log list;; 
prompt prompt ***Hot Backup Finish***; 
prompt spool off 
spool off; 
host rm -f &spoolfile 
Rem 執行生成的腳本文件
Rem @&hotback 
Rem host del &hotback 
3.3.3 聯機熱備的恢復 
3.3.3.1完全恢復
一般步驟: 
1. 
通過以下信息,找到故障數據文件 
alert.log 
background trace file 
v$recover_file v$recovery_log
通過這兩個視圖可以瞭解詳細的需要恢復的數據文件與需要使用到的歸檔日誌。 
2. 
將故障數據文件對應的表空間 
offline 
SQL> alter tablespace xxx offline; 
3. restore and recover 
SQL> host cp .. ..; 
SQL> [alter database] recover database/tablespace/datafile 'xx'; 
4. 
將表空間 
online 
SQL> alter tablespace xxx online; 
3.3.3.2不完全恢復
不完全恢復的方法只能恢復到過去某個時間點/SCN的數據庫狀態。
一些限制: 
1. 
必要條件
一個有效的 
online/offline 備份(包含所有的數據文件) 
自從備份到故障前的所有歸檔日誌
有可能需要控件文件 (所有控件文件丟失,數據庫結構已改變) 
SQL> recover database ... using backup controlfile; 
2. 只能恢復到所有備份數據文件的最大 
SCN以後, 
3. 恢復後需要 
resetlog,所以需要在恢復後馬上備份
三種不完全恢復的方法: 
1.基於變化的不完全恢復 
Change-based Recovery 
2.基於用戶干涉(取消)的不完全恢復 
Cancel-based Recovery 
3.基於時間的不完全恢復 
Time-based Recovery 
獲得信息: 
alert.log 
可以通過 
LogMiner獲得精確的時間/SCN,一般在備機上恢復,再 
exp/imp到生產機。
查看需要恢復的文件,以及相關的提示信息 
SQL> select * from v$recover_file; 
SQL> select * from v$datafile; 
查看二者的 
change#, 確定對應的在 
v$log_history中的範圍,從而確定需要那個日誌文
件序列
設置歸檔日誌文件的路徑: 
LOG_ARCHIVE_DEST 
設置 
log 在不同的路徑: 
SQL> SET LOGSOURCE 'xx'; 
SQL> alter system archive log start to 'xx';
恢復步驟: 
1. 
關閉數據庫,啓動到 
MOUNT狀態 
SQL> shutdown; 
SQL> startup mount; 
2. 
恢復數據文件、日誌文件、歸檔日誌文件 
SQL> host cp .. ..; 
SQL> archive log list; 
SQL> archived log ==>LOG_ARCHIVE_DEST 
3. 
執行恢復命令
基於變化: 
SQL> recover database until change 9999; 
基於時間: 
SQL> revover database until time '2001-12-01 14:02:23' using backup controlfile; 
基於取消: 
SQL> recover database until cancel; 
4. 
重置日誌,恢復後需要馬上備份 
SQL> alter database open resetlogs; 
3.4 分類案例 
3.4.1 控件文件的備份與恢復
一、備份 
1. 
鏡像控制文件
手工備份 
// 每當數據庫結構發生變化時立即備份 
1.數據庫關閉時,OS命令拷貝。 
2. 
聯機備份 
SQL> alter database backup controlfile to 'ctl.bak'; 
SQL> alter database backup controlfile to trace; 
二、恢復 
1. 
損壞一個控制文件:從鏡像拷貝或修改 
initSID.ora取消損壞的控制文件。 
2. 
損壞所有的控制文件:
利用備份的控制文件恢復,拷貝或在命令中恢復: 
SQL> recover database ...using backup controlfile; 
手工重建控制文件:
NOMOUNT狀態下執行 
SQL> CREATE CONYTROLFILE..; //注意聯機日誌和數據文件的路徑和文件名 
SQL> alter database open resetlogs; 
3.4.2 聯機日誌文件的備份與恢復
一、備份 
1. 鏡像在不同的磁盤上。 
//如果有鏡像備份,不用恢復 
2. 非歸檔模式下,在數據庫關閉時用 
OS命令拷貝備份。 
3. 歸檔模式下,手工或自動歸檔。
二、恢復 
// 在恢復後一定要重做備份
丟失日誌組成員:
在有多個鏡像時,一般不會報錯,如果需要恢復,可以先刪除再增加。 
1. 刪除: 
SQL> alter database drop logfile member 'xx'; 
2. 新增: 
SQL> alter database add logfile member 'xx' to group 2; 
( 如果丟失當前日誌組成員:可以先 
alter system switch logfile; 再進行操作。) 
以下恢復方法都是指丟失所有日誌組成員的情況下的恢復。
一、丟失非當前聯機日誌
 1. 
重啓數據庫到 
Mount狀態: 
2. 
重建丟失的日誌:用命令清空日誌組的方法 
//已歸檔,重建該日誌 
SQL> alter database clear logfile group 2; 
//歸檔模式下如果沒有歸檔 
SQL> alter database clear unarchived logfile group 2;
二、丟失當前聯機日誌 
1. 
如果數據庫正常關閉:
日誌中沒有未決事務需要實例恢復,同非當前聯機日誌方法。 
2. 
如果是非正常關閉數據庫的情況,未決事務需要實例恢復:
如果有備份,可通過備份進行不完全恢復。 
// until cancel 
沒有備份,進行強制性恢復 
// 最後的辦法,可能導致數據庫的不一致 
3. 
如果數據庫當前爲 
Open狀態,有活動的事務:
嘗試能否 
Export或熱備份,如果可以,趕緊備份
檢查非當前日誌是否正常,可先做 
clear,然後嘗試是否能 
switch log,能
否正常關閉 
DB,如果可以 
switch log正常關閉 
DB,方法同 
1,否則同 

3.4.3 回滾數據文件的恢復 
1. 從可用備份中恢復
非歸檔模式下的恢復會有數據丟失
歸檔模式下,有可用備份,可完全恢復(需要關閉數據庫 

2. 沒有可用備份時強行恢復 

// offline drop,刪除重建。
// 需要先註釋 
undo_tablespace,或者重新指定一個系統回滾段表空間,然後再操作 
1. 數據庫正常關閉沒有未決的事務 
1. shutdown,修改 
init參數文件,註釋 
undo_tablespace 
2. SQL>startup restrict mount; 
3. SQL>alter database datafile 2 offline drop; 
4. SQL>alter database open; 
5. SQL>drop tablespace xxx including contents; 
6. 重建回滾段表空間 
7. shutdown,修改 
init參數文件,去掉註釋設置新的 
undo_tablespace 
8. SQL> alter system disable restricted session; 
2. 非正常關閉強制恢復隱含參數:_CORRUPTED_ROLLBACK_SEGMENTS 
1. shutdown,修改 
init參數文件,刪除 
undo_tablespace 
2. SQL>startup restrict mount; 
3. SQL>alter database datafile 2 offline drop; 
4. SQL>alter database open; 
5. SQL>drop tablespace xxx including contents; 
如果出錯:回滾段中有活動事務 
SQL>drop rollback segment rbs0; rbs1, 2 ... 
在第 
1步中,加入隱含參數 
_CORRUPTED_ROLLBACK_SEGMENTS 
= (_SYSSMU1$,_SYSSMU2$,_SYSSMU3$, ...) 
6. 重建回滾段表空間,online 
7. shutdown,修改 
init參數文件,去掉註釋設置新的 
undo_tablespace 
去掉隱含參數 
8. SQL>alter system disable restricted session; 
3.4.5 臨時數據文件的恢復
方法:先將用戶臨時表空間置爲其他,然後刪除重建 
1. SQL> shutdown 
2. SQL> startup restrict mount; 
3. SQL> alter user xxx temporary tablespace TEMP2; 
4. SQL> alter database open; 
5. SQL> drop tablespace temp including contents; 
6. 重建臨時表空間 
7. 重新分配給各用戶 
8. SQL> alter system disable restricted session; 
如果是默認的臨時表空間,需要先將默認臨時表空間置爲其他 
SQL> alter database default temporary tablespace temp_2; 
4. RMAN(備份與恢復管理器 

RMAN是 
ORACLE提供的一個備份與恢復的工具,可以用來備份和還原數據庫文件、
歸檔日誌和控制文件。它也可以用來執行完全或不完全的數據庫恢復。 
RMAN可以由命令行接口或者 
OEM的 
Backup Manager GUI來控制。 
4.1基本知識 
4.1.1 RMAN的組件、概念 
1. 
RMAN 主要包括以下組件: 
Target Database: (目標數據庫 

就是需要 
RMAN 對其進行備份與恢復的數據庫, 
RMAN 可以備份數據文件,控制文
件,歸檔日誌,spfile。(注意:RMAN不能用於備份聯機日誌、初始化參數文件和口令文件) 
Server Session: (服務器會話) 
RMAN啓動數據庫上的 
Oracle服務器進程,將建立一個與目標數據庫的會話。由目標
數據庫上的服務器進程進行備份、還原、恢復的實際操作。
服務器進程 
RMAN 的服務進程是一個後臺進程,用於與 
RMAN工具與數據庫之間的通信,也用於 
RMAN 工具與磁盤/磁帶等 
I/O 設置之間的通信,服務進程負責備份與恢復的所有工作,
在如下情況將產生一個服務進程: 
.當連接到目標數據庫 
.分配一個新的通道 
Channel: (通道) 
一個通道是 
RMAN和目標數據庫之間的一個連接,"allocate channel"命令在目標數據庫
啓動一個服務器進程,同時必須定義服務器進程執行備份或者恢復操作使用的 
I/O類型。
通道控制命令可以用來: 
.控制 
RMAN使用的 
O/S資源,影響並行度 
.指定 
I/O帶寬的限制值(設置 
limit read rate參數) 
.定義備份片大小的限制(設置 
limit kbytes) 
.指定當前打開文件的限制值(設置 
limit maxopenfiles) 
recovery catalog: (恢復目錄 

用來保存備份與恢復信息的一個數據庫,不建議創建在目標數據庫上。 
RMAN利用恢
複目錄記載的信息去判斷如何執行需要的備份恢復操作。
如果不採用恢復目錄,備份信息可以存在於目標數據庫的 
control file中。
如果存放在目標數據庫的 
control file中,控件文件會不斷增長,不能保存 
RMAN的 
Script。 
CONTROL_FILE_RECORD_KEEP_TIME (default=7):控件文件中 
RMAN信息保存的
最短時間。
使用恢復目錄的優勢:可以存儲腳本,記載較長時間的備份恢復操作。 
RMAN Repository: (RMAN 恢復目錄數據庫 

存放 
recovery catalog(恢復目錄)的數據庫。建議爲恢復目錄數據庫創建一個單獨的數據
庫。 
MML: (媒體管理庫 

Media Management Layer (MML)是第三方工具或軟件,用於管理對磁帶的讀寫與文件的
跟蹤管理。如果你想直接通過 
RMAN 備份到磁帶上,就必須配置媒體管理層,媒體管理層
的工具如備份軟件可以調用 
RMAN來進行備份與恢復。 
Command Line and Script (命令行接口與腳本 

( 見 
4.1.2 ) 
2.概念述語 
Backup Sets (備份集合) 
備份集合的特性:包括一個或多個數據文件或歸檔日誌,以 
oracle專有的格式保存,有
一個完全的所有的備份片集合構成,構成一個完全備份或增量備份。 
Backup Pieces (備份片) 
一個備份集由若干個備份片組成。每個備份片是一個單獨的輸出文件。一個備份片的大
小是有限制的;如果沒有大小的限制,備份集就只由一個備份片構成。備份片的大小不能
大於使用的文件系統所支持的文件長度的最大值。 
Image Copies鏡像備份
鏡像備份是獨立文件(數據文件、歸檔日誌、控制文件)的備份。它很類似操作系統級
的文件備份。它不是備份集或備份片,也沒有被壓縮。 
Full backup Sets全備份集合
全備份是一個或多個數據文件中使用過的數據塊的的備份。沒有使用過的數據塊是不被
備份的,也就是說,oracle 進行備份集合的壓縮。 
Incremental backup sets增量備份集合
增量備份是指備份一個或多個數據文件的自從上一次同一級別的或更低級別的備份以
來被修改過的數據塊。與完全備份相同,增量備份也進行壓縮。 
File multiplexing 
多個數據文件可以在一個備份集中。
Recovery catalog resyncing 恢復目錄同步
使用恢復管理器執行 
backup、copy、restore或者 
switch命令時,恢復目錄自動進行更
新,但是有關日誌與歸檔日誌信息沒有自動記入恢復目錄。需要進行目錄同步。使用 
resync 
catalog命令進行同步。 
RMAN> resync catalog; 
Incarnation 對應物
在不完全恢復完成之後,通常需要使用 
resetlogs 選項來打開數據庫。 
resetlogs 表示一個
數據庫邏輯生存期的結束和另一個數據庫邏輯生存期的開始。數據庫的邏輯生存期也被稱爲
一個對應物(incarnation)。每次使用 
resetlogs選項來打開數據庫後都會創建一個新的數據庫
對應物。 
4.1.2 RMAN的使用:命令行接口與腳本
數據庫狀態: 
RMAN恢復目錄數據庫:必須OPEN 
目標數據庫:根據不同情況,必須MOUNT或OPEN 
1. 使用不帶恢復目錄的 
RMAN 
設置目標數據庫的 
ORACLE_SID ,執行: 
$ rman nocatalog 
RMAN> connect target 
RMAN> connect target user/pwd>@db 
2. 使用帶恢復目錄的 
RMAN 
$ rman catalog rman/rman 
RMAN> connect target //連接本地數據庫作爲目標數據庫 
RMAN> connect target user/pwd>@db //連接遠程數據庫
或 
$ rman catalog rman/rman target user/pwd>@db 
3. 命令行接口 
1、單個執行 
RMAN> backup database; 
2、運行一個命令塊 
RMAN> RUN { 
2> copy datafile 10 to 
3> '/oracle/prod/backup/prod_10.dbf'; 
4> } 
3、運行存儲在恢復目錄中的腳本: 
RMAN> RUN { EXECUTE SCRIPT backup_whole_db }; 
4、運行外部腳本: 
$ rman catalog rman/rman target / @backup_db.rman 
$ rman cmdfile=backup.rman msglog=backup.log 
RMAN> @backup_db.rman 
RMAN> RUN { @backup_db.rman }
如果在 
cron 中執行,注意在腳本中設置正確的環境變量,例: 
#set env 
export ORACLE_HOME=/opt/oracle/product/9.2 
export ORACLE_SID=test 
export NLS_LANG="AMERICAN_AMERICA.zhs16gbk" 
export PATH=$PATH:$ORACLE_HOME/bin 
rman cmdfile=backup_db.rman 
4. 使用腳本
創建或者取代腳本: 
RMAN> create script alloc_disk { 
2> # Allocates one disk 
3> allocate channel dev1 type disk; 
4> setlimit channel dev1 kbytes 2097150 maxopenfiles 32 readrate 200; 
5> } 
RMAN> replace script rel_disk { 
2> # releases disk 
3> release channel dev1; 
5> } 
刪除腳本: 
RMAN> DELETE SCRIPT Level0Backup;
查看腳本: 
RMAN> PRINT SCRIPT Level0Backup; 
運行腳本: 
RMAN> RUN { EXECUTE SCRIPT backup_whole_db }; 
5. 運行 
OS命令 
RMAN支持通過執行 
host命令暫時退出 
RMAN的命令提示符而進入到操作系統的命令
環境。 
6. 執行 
SQL語句
在 
RMAN 的命令提示符後輸入 
SQL 命令,然後在一對單引號(雙引號亦可)中輸入要
執行的 
SQL 語句,例如: 
RMAN> SQL 'ALTER SYSTEM CHECKPOINT'; 
對於 
SELECT語句,無法得到結果。可以先執行 
host再用 
SQLPLUS。
4.2 RMAN的配置 
4.2.1 建立Recovery Catalog恢復目錄 
(1) 在目錄數據庫中創建恢復目錄所用表空間: 
SQL> create tablespace rman_ts datafile '/xxx/rman_ts.dbf' size 20M; 
(2) 在目錄數據庫中創建 
RMAN 用戶並授權: 
SQL> create user rman identified by rman default tablespace rman_ts temporary 
tablespace temp quota unlimited on rman_ts; 
SQL> grant connect, resource, recovery_catalog_owner to rman; 
(3) 在目錄數據庫中創建恢復目錄 
$ rman catalog rman/rman 
RMAN> create catalog tablespace rman_ts; 
(4) 登記目標數據庫:
一個恢復目錄可以註冊多個目標數據庫,註冊目標數據庫的命令爲: 
$ RMAN catalog rman/rman target user/pwd @rcdb; 
RMAN> register database; 
4.2.2 查看RMAN的默認設置 
SHOW命令
必須連接目標數據庫 
RMAN> show all 
RMAN> show channel; // 通道分配 
RMAN> show device type; // IO設備類型 
RMAN> show retention policy; // 保存策略 
RMAN> show datafile backup copies; // 多個備份的拷貝數目 
RMAN> show maxsetsize; // 備份集大小的最大值 
RMAN> show exclude; // 不必備份的表空間 
RMAN> show backup optimization; // 備份的優化 
4.2.3 配置RMAN的默認設置 
1. 配置備份集文件的格式 
(format) 
RMAN> configure channel device type disk format '/u05/oracle/rmanback/%U'; 
備份文件可以自定義各種各樣的格式,如下 
%c 備份片的拷貝數 
%d 數據庫名稱 
%D 位於該月中的第幾天 
(DD) 
%M 位於該年中的第幾月 
(MM) 
%F 一個基於 
DBID 唯一的名稱,這個格式的形式爲 
c-IIIIIIIIII-YYYYMMDD-QQ, 
其中 
IIIIIIIIII 爲該數據庫的 
DBID,YYYYMMDD 爲日期,QQ 是一個 
1-256 的
序列 
%n 數據庫名稱,向右填補到最大八個字符 
%u 一個八個字符的名稱代表備份集與創建時間 
%p 該備份集中的備份片號,從 
1 開始到創建的文件數 
%U 一個唯一的文件名,代表%u_%p_%c 
%s 備份集的號 
%t 備份集時間戳 
%T 年月日格式(YYYYMMDD) 
2. 配置默認 
IO設備類型 
( device type ) 
IO 設備類型可以是磁盤或者磁帶,在默認的情況下是磁盤,可以通過如下的命令
進行重新配置。 
RMAN> configure default device type to disk; 
RMAN> configure default device type to sbt;
注意,如果換了一種 
IO 設備,相應的配置也需要做修改,如 
RMAN> configure device type sbt parallelism 2; 
3. 配置自動分配的通道 
( Chanel ) 
RMAN> configure channel device type disk format 
'/U01/ORACLE/BACKUP/%U
在運行塊中,手工指定通道分配,這樣的話,將取代默認的通道分配。 
RMAN> Run { 
allocate channel cq type disk format='/u01/backup/%u.bak'; 
… 
}
通道的一些特性:
讀的速率限制 
Allocate channel ……rate = integer
最大備份片大小限制 
Allocate channel …… 
maxpiecesize = integer
最大併發打開文件數(默認 
16) 
Allocate channel …… 
maxopenfile = integer 
4. 配置默認的保存策略 
( Retention Policy) 
保存策略是管理備份與副本有效期或者是否有效的一種方法。恢復數據庫的時候 
Oracle 不考慮失效的備份。我們可以定義兩種保存策略:恢復窗口備份保存策略
(recovery window backup retention policy )和冗餘備份保存策略(redundancy backup 
retention policy )
備份策略保持分爲兩個保持策略:
一個是時間策略,決定至少有一個備份能恢復到指定的日期
一個冗餘策略,規定至少有幾個冗餘的備份。
恢復窗口備份保存策略
這種保存策略類型的使用基於數據庫可能恢復到的最早的日期。例如,假設今天
是星期一,此前存在 
3 個備份。第一個備份在昨天生成的,第二個備份是上星期四生
成的,而最後一個備份是 
10 天前備份的。假如恢復窗口是 
7 天,那麼昨天和上星期
四的備份是有效備份,而 
10 天前的備份會成爲廢棄備份。下面的命令將恢復窗口配置
爲 
7 天: 
RMAN> configure retention policy to recovery window of 7 days;
冗餘備份保存策略
使用這種保存策略,RMAN會從最新備份開是保留 
N 個數據備份,其餘的廢棄。
例如,如果有四個備份,而冗餘數是 3,那麼最早的那個備份將被廢棄。下面的命令將
備份策略設置爲 3: 
RMAN> configure retention policy to redundancy 3;
設置 
NONE可以把使備份保持策略失效,Clear 將恢復默認的保持策略 
RMAN> configure retention policy to none;
例:
保證至少有一個備份能恢復到 
Sysdate-5的時間點上,之前的備份將標記爲 
Obsolete 
RMAN> configure retention policy to recovery window of 5 days;
至少需要有三個冗餘的備份存在,如果多餘三個備份以上的備份將標記爲冗餘 
RMAN> configure retention policy to redundancy 5; 
5. 配置多個備份的拷貝數目 
( backup copies ) 
如果覺得單個備份集不放心,可以設置多個備份集的拷貝,如: 
RMAN> configure datafile backup copies for device type disk to 2; 
RMAN> configure archivelog backup copies for device type disk to 2;
如果指定了多個拷貝,可以在通道配置或者備份配置中指定多個拷貝地點: 
RMAN> configure channel device type disk format '/u01/backup/%U,(') '/u02/backup/%U'; 
RMAN> backup datafile n format '/u01/backup/%U', '/u02/backup/%U'; 
6. 設置並行備份 
( ARALLELISM ) 
RMAN支持並行備份與恢復,也可以在配置中指定默認的並行程度。如: 
RMAN> configure device type disk parallelism 4;
指定在以後的備份與恢復中,將採用並行度爲 
4,同時開啓 
4個通道進行備份與恢
復,當然也可以在 
RUN的運行塊中手工分配多個通道來決定備份與恢復的並行程度。
並行的數目決定了開啓通道的個數。如果指定了通道配置,將採用指定的通道,如果沒
有指定通道,將採用默認通道配置。
還可以在 
BACKUP命令中使用指定 
FILESPERSET或者指定(datafile 1,4,5 channel 
c1 tag=DF1)(datafile 2,3,6 channel c2 tag=DF2) 
7. 設置控制文件自動備份 
(autobackup on) 
通過如下的命令,可以設置控制文件的自動備份 
RMAN> configure controlfile autobackup on;
對於沒有恢復目錄的備份策略來說,這個特性是特別有效的,控制文件的自動備份
發生在任何 
backup 或者 
copy 命令之後,或者任何數據庫的結構改變之後。
可以用如下的配置指定控制文件的備份路徑與格式 
RMAN> configure controlfile autobackup format for type disk to '%f'; 
在備份期間,將產生一個控制文件的快照,用於控制文件的讀一致性,如下配置: 
RMAN> configure snapshot controlfile name to 
'/u01/app/oracle/product/9.0.2/dbs/snapcf_U02.f'; 
8. 設置備份優化選項 
( optimization ) 
可以在配置中設置備份的優化,如 
RMAN> configure backup optimization on;
如果優化設置打開,將對備份的數據文件、歸檔日誌或備份集運行一個優化算法。 
4.2.4 RMAN 會話的設置 
set 命令與 
configure 命令很相似,但是 
set 命令設置不是永久的。set 命令定義只應
用於當前 
RMAN會話的設置。
可以用於 
RUN代碼之外的命令有: 
set echo on | off // 顯示或關閉 
RMAN顯示 
set DBID dbidn // 指定一個數據庫的數據庫標識符。
下面的 
set命令只能在 
RUN代碼中使用: 
set newname:
用於 
TSPITR或者數據庫複製操作,指定新的數據庫文件名,將數據庫移動
到新的系統中並且文件名不同的時候可以用此命令。 
set maxcorrupt for datafile:
用於定義 
RMAN操作失敗之前允許的數據塊訛誤的數量 
set archivelog destination:
可以修改存儲歸檔的重做日誌 
archive_log_dest_1的目的地。 
set 命令和 
until 子句:
可以定義數據庫時間點恢復操作所使用的具體的時間點、SCN或者日誌序列
號,例: 
set until time "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')"; 
set backup copies:
使用該命令可以定義爲備份集的每個備份片創建的鏡像副本數。
例: 
RMAN> RUN{ 
set maxcorrupt for datafile 3 to 10; 
set backup copies = 2; 
backup database; 

4.3 Copy鏡像拷貝與恢復 
Copy鏡像拷貝命令可以創建數據庫數據文件、歸檔重做日誌或者控制文件的精確副本。 
RMAN 副本與這些文件的區別僅在於名稱和(或)位置的區別。功能相當於用戶管理的備
份恢復中的熱備份。備份副本的好處是恢復比較快,恢復時可以不用拷貝,指定新位置即可。 
Copy鏡像拷貝至少要在 
mount 狀態下運行。
Copy鏡像拷貝可作爲增量備份的 
Level 0 
Oracle10g開始,允許使用單條命令"backup as copy"進行數據庫拷貝。 
4.3.1 備份
生成數據文件副本: 
RMAN> copy datafile 3 to 'd:/backup/datafilecopy/users01.dbf.bak'; 
RMAN> copy datafile 'd:/oracle/oradata/ora9i/users01.dbf' to 
'd:/backup/datafilecopy/users01.dbf.bak';
生成控制文件副本: 
RMAN> copy current controlfile to … 

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP is ON;
備份 
ARCHIVELOG 副本: 
// 只能一個一個的來備份,而不能指定一個範圍 
RMAN> copy archivelog 'd:/oracle/oradata/arc/ming_351.arc' to 
'd:/oracle/orabackup/arc/ming_351.arc';
並行設置: 
1. RMAN> configure device type ... parallelism = 3; 
//only 2 channel, one for writting data to disk 
2. 
手工分配多個通道 
3. 
在命令中指定多個文件 
RMAN> copy datafile 'xx' to 'xx2', datafile 'yy' to 'yy2', ...; 
塊檢查: 
CHECK LOGICAL 選項 
MAXCORRUPT參數 
V$COPY_CORRUPTION 
在複製操作中,Oracle 服務器進程對每個塊執行校驗和計算以檢測是否有塊損壞。 
RMAN 在還原副本時也要覈對校驗和。該過程稱爲物理損壞檢測。可以使用 
NOCHECKSUM 選項取消校驗和操作,從而加快複製進程。如果數據庫已在維護塊校
驗和,則此選項無效。缺省情況下,禁用邏輯損壞的錯誤檢查。
可以使用 
CHECK LOGICAL 選項測試通過了物理損壞檢查的數據和索引塊,查看
它們是否存在邏輯損壞,如行片或索引條目損壞。如果檢測到任何塊存在邏輯損壞,則
將該塊記錄到服務器進程的警報日誌和跟蹤文件中。
可以使用 
MAXCORRUPT 參數設置邏輯和物理損壞的閾值。只要在某個文件中檢
測到的邏輯和物理損壞總和低於該值,則 
RMAN 命令完成,同時 
Oracle 將損壞塊的
範圍植入到 
V$COPY_CORRUPTION 視圖。如果超出 
MAXCORRUPT,則該命令終
止,並且不植入視圖。當並行度比較高時,佔用的計算機資源較多,但備份操作完成
速度較快。缺省情況下將啓用對物理損壞的錯誤檢查。有關在備份過程中遇到的損壞數
據文件塊的信息將記錄在控制文件和警報日誌中。 
4.3.2 恢復
查看所有的 
Copy鏡像拷貝:
RMAN> list copy; 
數據文件副本還原:
還原時可以 
offline數據文件所屬表空間,然後利用 
OS拷貝命令恢復副本。
還可以用 
restore (datafile num) from datafilecopy 命令來從數據文件副本中還原數
據文件,然後再用 
recover 命令來恢復。例如: 
RMAN> sql "alter database datafile 5 offline"; 
RMAN> restore (datafile 5) from datafilecopy; 
RMAN> recover datafile 5; 
RMAN> sql "alter database datafile 5 online";
注意,上面的圓括號很重要,如果沒有,restore 命令就會執行失敗。 
4.4 Backup備份與恢復 
Backup 備份命令生成 
Backup sets (備份集合),以 
oracle專有的格式保存,由一個完全
的所有的備份片集合構成,構成一個完全備份或增量備份。 
4.4.1 BACKUP 備份命令選項
設置標記 
(TAG) 
RMAN> backup database tag= 'test backup'; 
限制備份集大小 
RMAN> backup database maxsetsize=100M; 
只備份新增部分 
RMAN> backup incremental level 0 database; 
備份控制文件同時備份 
SPFILE 
RMAN> backup current controlfile; 
RMAN> configure controlfile autobackup on; // 默認是 
off 
也可以在備份數據庫或者文件的時候加上 
include current controlfile 選項。例如: 
RMAN> backup database include current controlfile; 
備份時如果包含了 
SYSTEM表空間,將自動備份控件文件和 
SPFILE 
RMAN> backup file 1;
使用自動備份進行恢復 

RMAN> restore spfile/controlfile to '/xx/xx' from autobackup; 
備份歸檔日誌 
(9i) 
RMAN> backup archivelog all; 
RMAN> backup ... plus archivelog; // 在備份其他時同時備份歸檔日誌 
plus archivelog隱含如下步驟: 
.運行一個 
ALTER SYSTEM ARCHIVELOG CURRENT命令

運行 
BACKUP ARCHIVELOG ALL命令。注意如果備份優化被啓用, 
RMAN只會備份未備份過的日誌 

備份 
BACKUP命令中定義的文件 

運行 
ALTER SYSTEM ARCHIVELOG CURRENT命令 

備份所有的剩下的歸檔日誌
備份完後刪除歸檔日誌 
RMAN> backup ... ARCHIVELOG all delete all input;
修改備份集的保存策略
例如:將備份設置爲永久有效 
RMAN> backup database keep forever logs|nologs;
設置爲有效期 
180 天 
RMAN> backup database keep until time='sysdate+180';
重寫 
configure exclude / noexclude
通過 
configure exclude 可以配置 
RMAN不備份上次備份以來沒有發生變化的數據文
件。如果要確保 
RMAN備份這些數據文件,可以在 
backup命令中添加 
noexclude 選項。
例如: 
RMAN> backup database noexclude;
跳過脫機的、不可存取的或者只讀的數據文件 
RMAN> backup database skip offline skip inaccessible skip readonly;
強制備份只讀的數據文件 
RMAN> backup database force;
備份指定週期內沒有備份的數據文件 
RMAN> backup database not backed up; 
RMAN> backup database not backed up since time='sysdate-2';
在備份操作期間檢查邏輯訛誤 
RMAN> backup check logical database; //在檢查邏輯錯誤的同時進行備份 
RMAN> backup validate check logical database; //只檢查
建立壓縮備份集 
RMAN> backup as compressed backupset tablespace users 
FORMAT='D:/BACKUP/%d_%s.dbf'; 
4.4.2 RESTORE/RECOVER恢復命令選項
數據庫恢復 
RMAN> restore/revover database ; 
表空間恢復 
RMAN> restore/revover tablespace xx ; 
只讀表空間的恢復
默認情況下,即使丟失了只讀的數據文件,RMAN 也不會在執行完全數據庫還原
操作時候還原只讀的數據文件。要在完全恢復期間還原只讀的數據文件,就必須在 
RESTORE命令中使用 
CHECK READONLY參數: 
RMAN> RESTORE DATABASE CHECK READONLY; 
恢復 
SPFILE/控制文件
使用自動備份恢復 
SPFILE/控制文件 
RMAN> startup nomount; 
RMAN> set dbid=153910023 
RMAN> restore controlfile from autobackup 
RMAN> restore spfile/controlfile to '/xx/xx' from autobackup ; 
或 
RMAN> restore controlfile from '/arch/ct_c-2347671489-20060630-00'; 
聯機狀態:目標數據庫 
MOUNT或 
OPEN 
RMAN> restore controlfile to 'd:/temp/control01.ctl'; 
歸檔重做日誌的還原 
RMAN> RESTORE ARCHIVELOG ALL; 
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1 UNTIL LOGSEQ=20; 
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1; 
也可以用 
SET命令來指定歸檔日誌的還原位置,例如: 
RMAN> run 

set archivelog destination to "d:/temp"; 
restore archivelog all; 

數據文件副本還原 
RMAN> sql "alter datafile 5 offline"; 
RMAN> restore (datafile 5) from datafilecopy; 
RMAN> recover datafile 5; 
RMAN> sql "alter datafile 5 online";
請注意,上面的圓括號很重要
還原檢查與恢復測試
與備份檢查一樣,還原操作也可以檢查是否能正常 
restore或者是否該備份集
是否有效。如::
RMAN> RESTORE DATABASE VALIDATE; 
RMAN> VALIDATE BACKUPSET 218; 
RMAN> RESTORE DATABASE VALIDATE CHECK LOGICAL ;
從指定的 
tag 恢復: 
RMAN> RESTORE FROM tag=’xxxx’; 
不完全恢復的還原:
 1.set until time/SCN/ 
2.RMAN> restore database until scn 1000; 
RMAN>restore database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')"; 
RMAN> restore database until sequence 100 thread 1; 
塊級別的恢復
塊恢復 
Block Media Recovery (BMR),塊是恢復的最小單元,通過塊可以減少恢復
時間,而且數據文件可以在線。恢復塊的時候,必須指定具體的塊號,如: 
RMAN> blockrecover datafile 6 block 3; 
具體請見 
4.7.4 塊媒體恢復 
Block Media Recovery (BMR) 
4.4.3 非歸檔模式下的 
BACKUP 備份與恢復
恢復目錄:打開
目標數據庫:例程啓動,數據庫加載,mount 不能 
open
因爲目標數據庫不在歸檔模式下,所以當進行備份 
/恢復操作的時候數據庫無法打
開。目標數據庫只能在 
MOUNT狀態不能 
Open,所以屬於脫機備份。
非歸檔模式不備份 
redo日誌,只有完全備份和 
readonly/offline表空間和數據文件
備份是有意義的,所以非歸檔模式最好不用 
RMAN進行備份,備份語法與歸檔模式相
同,所以這裏只做簡單介紹。 
4.4.3.1 全庫備份
例:使用默認的設置脫機全備份的語句
RMAN> shutdown immediate; 
RMAN> startup mount; 
RMAN> backup database; 
RMAN> startup; 
例:不使用默認的設置執行脫機備份操作,在備份命令中指定備份選項 
RMAN> shutdown immediate; 
RMAN> startup mount; 
RMAN> run { 
allocate channel c1 type disk format '/xxx/ming_%U'; 
allocate channel c2 type disk format '/xxx/ming_%U'; 
backup full tag full_db_backup format "/backups/db_t%t_s%s_p%p" (database); 
backup current controlfile; 
release channel c1 ; 
release channel c2 ; 

在這個例子中,我們分配了兩個通道,備份位置是在/xxx。默認情況下,如果備份數據
文件 
1 (SYSTEM 表空間),控制文件和參數文件也會備份。
可以通過下面的命令顯示恢復目錄中記載的備份集信息: 
RMAN> list backupset of database; 
4.4.3.2 全庫備份的恢復 
$ rman target / 
RMAN> startup mount 
RMAN> restore database; 
RMAN> recover database; 
RMAN> alter database open resetlogs; 
4.4.3.3 表空間備份
只有 
readonly/offline表空間的備份纔有意義。 
RMAN> run { 
2> allocate channel dev1 type disk; 
3> backup 
4> tag tbs_users_read_only 
5> format "/oracle/backups/tbs_users_t%t_s%s" 
6> (tablespace users); 
7> } 
使用下列命令來顯示恢復目錄中該表的備份信息: 
RMAN> list backupset of tablespace users; 
4.4.3.4 表空間備份的恢復 
RMAN> RUN{ 
sql "alter tablespace xx offline immediate;" 
restore tablespace xx; 
recover tablespace xx; 
sql "alter tablespace xx online;" 

4.4.3.5 備份控制文件 
RMAN> run { 
2> allocate channel dev1 type "SBT_TAPE"; 
3> backup 
4> format "cf_t%t_s%s_p%p" 
5> tag cf_monday_night 
6> (current controlfile); 
7> release channel dev1; 
8> } 
注:數據庫完全備份將自動備份控制文件。(或者備份時加 
include current controlfile) 
4.4.4 歸檔模式下的BACKUP備份與完全恢復
要用 
RMAN 進行聯機備份操作,數據庫就必須位於 
ARCHIVELOG 模式。恢復
目錄必須打開,目標數據庫例程必須啓動,數據庫加載或者打開。
這部分只介紹完全恢復,不完全恢復見下一節。 
4.4.4.1 整庫備份與恢復
備份命令:
只備份數據文件 (如果 
configure controlfile autobackup on; 將自動包括控件文件, 
SPFILE): 
RMAN> backup database;
同時備份歸檔日誌,然後將備份後的歸檔日誌刪除 
RMAN> backup database plus archivelog delete input;
明確指定同時備份控件文件: 
RMAN> run{ 
allocate channel c1 type disk; 
sql 'alter system archive log current'; 
backup full database include current controlfile tag 'dbfull' 
format '/u06/oracle/rmanback/full_%u_%s_%p'; 
sql 'alter system archive log current'; 
release channel c1; 

可以用 
RMAN的 
plus archvielog選項簡化數據庫備份: 
RMAN> run { 
2> backup database 
3> format '/xxfull%d_%T_%s' 
4> plus archivelog 
5> format '/xx/arch_%d_%T_%s' 
6> delete all input; 
7> } 
完全恢復:
目標數據庫必須是 
mount狀態 
$ rman target / 
RMAN> startup mount 
RMAN> restore database; 
RMAN> recover database; 
RMAN> alter database open; 
4.4.4.3 表空間的備份與恢復
備份命令: 
RMAN> backup tablespace users ; 
例: 
RMAN> RUN{ 
allocate channel c1 type disk; 
backup tablespace users tag 'ts_users' format '/oracle/rmanback/ts_%u_%s_%p' ; 
release channel c1; 

恢復:
如果我們只丟失了特定的表空間的數據文件,那麼我們可以選擇只恢復這個表空間,而
不是恢復整個數據庫。表空間恢復可以在不關閉數據庫的情況下進行,只需要將需要恢復的
表空間 
offline。 
RMAN> RUN{ 
sql "alter tablespace xx offline immediate;" 
restore tablespace xx; 
recover tablespace xx; 
sql "alter tablespace xx online;" 

恢復到一個不同的位置:
RMAN> RUN{ 
sql "alter tablespace xx offline immediate;" 
SET NEWNAME for datafile 1 to '/xx'; 
restore tablespace xx; 
switch datafile 1; 
recover tablespace xx; 
sql "alter tablespace tbs1 online;" 

4.4.4.3 數據文件的備份與恢復
備份命令: 
RMAN> backup datafile 3; 
RMAN> backup datafile 'D:/ORACLE/ORADATA/TEST/TEST.DB'; 
恢復命令:
數據文件恢復與表空間恢復類似。假設數據文件號爲 
5 的文件丟失,文件名是: 
'E:/ORACLE/ORADATA/USERS.DBF',那麼我們恢復的時候可以指定文件號,也可以指定
文件名。 
RMAN> run { 
2> allocate channel dev1 type disk; 
3> sql "alter tablespace users offline immediate"; 
4> restore datafile 4; --或者restore 'E:/ORACLE/ORADATA/USERS.DBF' 
5> recover datafile 4; 
6> sql "alter tablespace users online"; 
7> release channel dev1; 
8> } 
恢復到一個不同的位置: 
$ rman target / 
RMAN> startup mount 
RMAN> RUN{ 
sql "alter tablespace users offline immediate"; 
SET NEWNAME for datafile 9 to '/xx/user01.dbf'; 
restore datafile 9; 
switch datafile all; 
recover datafile 9; 
sql "alter tablespace users online"; 

4.4.4.4 歸檔重做日誌的備份與恢復
備份:
整庫備份的同時,備份所有歸檔 (以及聯機日誌): 
RMAN> backup database plus archivelog;
備份所有歸檔: 
RMAN> backup archivelog all;
備份兩天來的歸檔: 
RMAN> backup archivelog from time='sysdate-2' [to time=’xxx’] ;
備份從 
sequence 1 開始的歸檔: 
RMAN> backup archivelog from sequence 1 [to sequence =’n];
備份沒有三次備份的歸檔: 
RMAN> backup archivelog not backed up 3 times;
備份所有歸檔,然後刪除歸檔: 
RMAN> backup archivelog all delete input; 
恢復:
顯示恢復目錄中的歸檔日誌: 
RMAN> list backupset of archivelog all; 
一般情況下,在 
RMAN 的普通恢復過程中,不必恢復歸檔的重做日誌。不過偶爾也需
要恢復重做日誌,例如我們用 
Log Miner 來從歸檔中查找一些東西。 
RMAN命令舉例: 
RMAN> RESTORE ARCHIVELOG ALL; 
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1 UNTIL LOGSEQ=20; 
RMAN> RESTORE ARCHIVELOG FROM LOGSEQ=1;
可以用 
SET命令來指定歸檔日誌的還原位置,例如: 
RMAN> run{ 
set archivelog destination to "d:/temp"; 
restore archivelog all; 
}
需要注意的是,即使新的歸檔日誌目錄不同於默認的歸檔日誌目錄,如果 
Oracle 判定
日誌已存在,也不會恢復該歸檔日誌文件。 
4.4.4.5 聯機日誌的備份
聯機日誌不能用 
RMAN 來備份,可以先將其歸檔,再備份。爲了實現這點,必須在 
RMAN
中執行歸檔命令語句: 
RMAN> run { 
2> allocate channel dev1 type disk; 
3> sql "alter system archive log current"; 
4> backup (archivelog from time "sysdate-1" all delete input) 
5> "format "/oracle/backups/log_t%t_s%s_p%p"; 
6> release channel dev1; 
7> } 
上面的腳本可以在執行完一個完整的聯機數據庫備份後執行,確保所有的重做日誌可以
將數據庫恢復到一個一致性的狀態。
當然,也可以在全庫備份時使用 
plus archvielog 選項,將自動完成聯機日誌的備份。 
4.4.4.6 控制文件和服務器參數文件的備份與恢復
備份: 
// 
設置文件名格式 
RMAN> set controlfile autobackup format for device type disk to 'ctl_%F'; 
1. RMAN> configure controlfile autobackup on; // backup database時將自動備份 
2. RMAN> backup current controlfile; 
3. RMAN> backup .... include control file; 
4. RMAN> backup file 1; // system datafile自動備份
恢復 
SPFILE: 
SPFILE(PFILE)的丟失/損壞,對數據庫不會產生致命影響,可以從其他方式恢復。
不過既然 
RMAN的備份計劃中包括了 
SPFILE的備份,那麼就可以使用 
RMAN來還原 
SPFILE了。 
$ rman target / catalog "rman/rman@db
RMAN> set dbid=153910023 // SET DBID這個步驟是不能省略的,否則會報錯。 
RMAN> restore spfile from autobackup [MAXDAYS 100]; // 或者 
restore spfile; 
RMAN> startup force 
或者從某個備份集恢復: 
RMAN> restore spfile from backupset bs_num命令。
使用 
dbms_backup_restore包恢復服務器參數文件:
在一些不常見的情況下,我們可能需要直接使用 
dbms_backup_restore 包來恢復 
spfile。當然這個包也可以用來恢復其它數據,是常規辦法都沒有用的時候的一個利器。
這個包可以在數據庫 
NOMOUNT 狀態下使用。假設我們有一個自動備份文件 
C-2600315304-20060829-02,我們需要從這裏恢復數據,那麼可以通過執行下面的腳本
來完成: 
SQL> 
DECLARE 
DEVTYPE VARCHAR2(256); 
DONE BOOLEAN; 
BEGIN 
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL); 
DBMS_BACKUP_RESTORE.restoresetdatafile; 
DBMS_BACKUP_RESTORE.restorespfileto('/back/SPFILE.ORA'); 
DBMS_BACKUP_RESTORE.restorebackuppiece( 
'/back/C-2600315304-20060829-02',DONE=>done); 
DBMS_BACKUP_RESTORE.devicedeallocate(NULL); 
END; 

恢復控制文件: 
RMAN> startup nomount; 
RMAN> set dbid=153910023 
RMAN> restore controlfile from autobackup
或 
RMAN> restore controlfile from '/arch/ct_c-2347671489-20060630-00'; 
聯機狀態:目標數據庫 
MOUNT或 
OPEN 
RMAN> restore controlfile to 'd:/temp/control01.ctl'; 
然後再執行恢復數據庫的其他步驟: 
RMAN> restore database; 
RMAN> recover database; 
RMAN> alter database open resetlogs; 
使用 
dbms_backup_restore包恢復控制文件: 
SQL> 
DECLARE 
DEVTYPE VARCHAR2(256); 
DONE BOOLEAN; 
BEGIN 
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL); 
DBMS_BACKUP_RESTORE.restoresetdatafile; 
DBMS_BACKUP_RESTORE.restorecontrolfileto('/back/CONTROL01.CTL'); 
DBMS_BACKUP_RESTORE.restorebackuppiece 
('/back/C-2600315304-20060829-00',DONE=>done); 
DBMS_BACKUP_RESTORE.devicedeallocate(NULL); 
END; 

4.4.4.7 備份集的備份的備份與恢復
備份:
備份所有備份集: 
RMAN> backup backupset all;
備份指定備份集: 
RMAN> backup backupset bs_num; 
恢復:(這種備份只是增加一個鏡像,不用恢復)
主要用於改變備份集的位置,或者創建多個鏡像備份,比如將備份集從硬盤備份到磁
帶。如果要詳細瞭解,見我在 
ITPUB上發的帖子: 
http://www.itpub.net/viewthread.php?tid=1007747&page=1&extra
4.4.5 歸檔模式下的不完全恢復
不完全恢復就意味着有數據的丟失。引起不完全恢復的原因有很多,如丟失了聯機日誌
或某個歸檔日誌。另外如果出現了嚴重損害數據庫的用戶錯誤,比如某用戶錯誤的刪除了某
個重要的數據,那麼數據庫也要恢復到這個錯誤操作之前。
不完全恢復會影響整個數據庫,需要在 
MOUNT狀態下進行。在不完全恢復完成之後,
通常需要使用 
resetlogs 選項來打開數據庫。 
resetlogs 表示一個數據庫邏輯生存期的結束和
另一個數據庫邏輯生存期的開始。數據庫的邏輯生存期也被稱爲一個對應物(incarnation)。
每次使用 
resetlogs 選項來打開數據庫後都會創建一個新的數據庫對應物,這對於恢復操作
來說非常重要。每次使用 
resetlogs 後,SCN計數器不會被重置,但是 
Oracle會重置聯機日
志序列號,同時還會重置聯機重做日誌內容。因此執行了 
resetlogs之後,應該立即重新備
份整個數據庫,否則恢復起來相當麻煩。(注:Oracle 10g中已經可以在 
resetlogs之後不備
份數據庫,恢復的時候能夠穿越 
resetlogs)
使用 
RMAN 執行不完全恢復操作時需要完成的一個工作是建立恢復目標。恢復目標是
要終止恢復進程的點,可以是時間點、指定的 
SCN 或者一個日誌序列號。我們可以在 
run
代碼中使用 
set 命令和 
until time、until scn、until sequence參數。
也可以選擇在 
RESTORE和 
RECOVER命令中直接使用 
UNTIL TIME、UNTIL SCN、
或者 
UNTIL SEQUENCE參數,這樣就可以避免使用 
run 代碼。例如; 
startup mount; 
restore database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')"; 
recover database "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')"; 
alter database open resetlogs; 
4.4.5.1 基於 
SCN的恢復
如果知道數據庫出錯前的 
SCN,可以將數據庫還原到指定 
SCN 狀態。 
$ startup mount; 
RMAN> run{ 
allocate channel d1 type disk; 
restore database until scn 1317011; --或者set until scn 1317011 
recover database until scn 1317011; 
sql 'alter database open resetlogs'; 
release channel d1; 

4.4.5.2 基於時間的恢復
下面使用 
set until time 命令爲 
2005 年 
8 月 
1 日下午 1點的恢復目標: 
$ startup mount; 
RMAN> run{ 
set until time "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')"; 
restore database; 
recover database; 
alter database open resetlogs; 
}
執行上面的命令時, 
RMAN 會查找與恢復目標時間最近、但是不包含恢復目標時間及
以後時間的備份集,並且從這個備份中還原數據庫。如果數據庫非歸檔模式,那麼恢復操作
會在備份集的時間點停止;否則 
RECOVER 命令會應用恢復目標之前的歸檔重做日誌或需
要的增量備份。 
4.4.5.3 基於日誌序列的恢復 
RMAN 允許用戶將數據庫恢復到指定的歸檔重做日誌序列號。如果歸檔的重做日誌中
有間隙(某個歸檔日誌文件或備份損壞或丟失),使用這種方法就很方便。間隙通常意味
着我們只能將數據庫還原到間隙開始的地方。 
SQL> startup mount; 
RMAN> restore database until sequence 100 thread 1; --not include 100 
RMAN> recover database until sequence 100 thread 1; 
SQL> alter database open resetlogs; 
RMAN> RUN { 
2> SET UNTIL SEQUENCE 120 THREAD 1; 
4> RESTORE DATABASE; 
5> RECOVER DATABASE; --recovers through log 119 not include 120 
6> ALTER DATABASE OPEN RESESTLOGS; 
7> } 
4.5. RMAN查看信息 
List與 
Report 
4.5.1 恢復目錄相關視圖
恢復目錄本身有一組視圖,用於存放目標數據庫與備份信息,可以用 
RMAN用戶登錄數
據庫進行查看,例: 
RC_DATABASE 
RC_DATAFILE 
RC_STORED_SCRIPT 
RC_STORED_SCRIPT_LINE 
RC_TABLESPACE 
4.5.2 RMAN 動態性能視圖
以下是目標數據庫上與 
RMAN 備份有關係的一些動態性能視圖,可以用 
SYS用戶進行
查詢。 
V$ARCHIVED_LOG 
V$BACKUP_CORRUPTION 
V$COPY_CORRUPTION 
V$BACKUP_DEVICE 
V$CONTROLFILE_RECORD_SECTION 
V$BACKUP_DATAFILE用於通過確定各數據文件中的塊數來創建大小相同的備份
集。通過它也可以找出數據文件中已損壞的塊數。 
V$BACKUP_REDOLOG顯示在備份集中存儲的歸檔日誌。 
V$BACKUP_SET顯示已經創建的備份集。 
V$BACKUP_PIECE顯示爲備份集創建的備份片。
這裏還有一個視圖,可以大致的監控到 
RMAN備份進行的程度。如通過如下的 
SQL
腳本,將獲得備份的進度。 
SQL> SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK, 
2 ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE" 
3 FROM V$SESSION_LONGOPS 
4 WHERE OPNAME LIKE 'RMAN%' 
5 AND OPNAME NOT LIKE '%aggregate%' 
6 AND TOTALWORK != 0 
7 AND SOFAR <> TOTALWORK; 
要在備份過程中將某一進程與一個通道關聯起來,請: 
1. 啓動恢復管理器並連接到目標數據庫和恢復目錄(與後者的連接是可選的)。 
rman target / catalog rman/rman@rcat 
2. 在分配通道後,設置 
COMMAND ID 參數,然後複製所需的對象。 
run { 
allocate channel t1 type disk; 
set command id to 'rman'; 
copy datafile 1 to '/u01/backup/df1.cpy'; 
release channel t1;} 
3. 查詢 
V$SESSION_LONGOPS 視圖以獲得複製的狀態。 
SELECT sid, serial#, context, sofar, totalwork 
round(sofar/totalwork*100,2) "% Complete", 
FROM v$session_longops 
WHERE opname LIKE 'RMAN:%' 
AND opname NOT LIKE 'RMAN: aggregate%'; 
4. 使用 
SQL*Plus 並查詢 
V$PROCESS 和 
V$SESSION 以獲得 
SID 和 
SPID。然
後,使用
操作系統實用程序來監視進程或線程。 
SELECT sid, spid, client_info 
FROM v$process p, v$session s 
WHERE p.addr = s.paddr 
AND client_info LIKE '%id=rman%'; 
4.5.3 List 
List 命令是一種在數據庫控制文件或者恢復目錄中查詢備份的歷史信息的方法。 
List提供了一組信息,可以提供各種備份的信息,如對應物、備份集、歸檔日誌備份、控
制文件備份等等。
列出對應物: 
RMAN> list incarnation; 
列出備份概要信息: 
RMAN> list backup summary; 
按備份類型列出備份: 
RMAN> list backup by file; 
獲得備份的詳細信息,包括備份片的物理文件名: 
RMAN> list backup; 
RMAN> list backupset bs#;
或者按照 
TAG 來查: 
RMAN> list backup tag=tab_number; 
列出過期的備份: 
RMAN> list expired backup; 
按照表空間和數據文件來列出備份:
列出 
USERS表空間的備份: 
RMAN> list backup of tablespace USERS;
列出文件 
5 的備份: 
RMAN> list backup of datafile 5;
列出文件 
E:/ORACLE/USERS.DB 的備份: 
RMAN> list backup of datafile ' E:/ORACLE/USERS.DB ';
列出控制文件的備份: 
RMAN> list backup of controlfile; 
列出歸檔日誌的備份: 
RMAN> list archivelog all; 
RMAN> list backup of archivelog all; 
列出副本: 
RMAN> list copy列出所有的副本。 
RMAN> list copy of controlfile列出控制文件副本 
RMAN> list copy of archivelog all列出所有歸檔日誌副本 
RMAN> list copy of database列出數據庫所有數據文件的副本 
4.5.4 Report 
Report 命令被用於判斷數據庫的當前可恢復狀態和提供數據庫備份的特定信息,可
以檢測哪些文件需要備份,哪些備份能被刪除以及那些文件能不能獲得的信息。可以報
告數據庫的所有能備份數據文件對象,包括數據文件名、文件號、表空間、文件大小、
是否含有回滾段等。 
RMAN> report schema
或者 
RMAN> REPORT SCHEMA AT TIME 'SYSDATE-14'; 
RMAN> REPORT SCHEMA AT SCN 1000; 
RMAN> REPORT SCHEMA AT SEQUENCE 100 THREAD 1;
報告需要備份的數據文件 
RMAN> report need backup [ redundancy | days | incremental n];
報告過期了的數據文件或者不可用的備份與拷貝 
RMAN> Report obsolete [orphan] 
報告最近沒有備份的數據文件 
RMAN> report need backup days=10; // 恢復需要超過 
10天的歸檔日誌 
RMAN> report need backup incremental=3; // 恢復時需要超過 
3 增量的文件報表
文件增量名稱 
8 15 E:/ORACLE/ORADATA/MING_RECOVER/MINGDICT.DB 
9 15 E:/ORACLE/ORADATA/MING_RECOVER/MINGLOB.DB
這個報告中,列出的數據文件,在進行恢復的時候,需要從 
3 個以上的增量備份文件中
恢復。我們知道如果需要從很多文件中恢復,會影響恢復速度,可以根據情況來重新備份這
些文件。
報告備份冗餘或恢復窗口
我們可以執行 
report need backup redundancy 來確定爲滿足冗餘備份策略而需要備份的
文件。例如: 
RMAN> report need backup redundancy=2; // 文件冗餘備份少於 
2 個
我們也可以按照恢復窗口來查找需要備份的文件。比如我們要求恢復窗口小於 
2 天,那
麼用下面的命令: 
RMAN> report need backup recovery window of 2 days; //文件報表的恢復需要超過 
2天
的歸檔日誌
這個命令等同於:report need backup days=2; 
4.6 RMAN的管理與維護
如果數據庫做了 
alter database open resetlogs; 就需 
reset database,如果有庫結構變化,就需
要 
resync catalog 
4.6.1加入目錄數據庫
如果存在以前創建的備份數據想註冊到目標數據庫,可以採用如下手工方式加入到
恢復目錄中, 
RMAN> CATALOG datafilecopy '/oracle/ .... /system01.dbf'; 
RMAN> CATALOG controlfilecopy '/oracle/CONTROL01.CTL.BCK'; 
RMAN> CATALOG archivelog '/oracle/arc001.log'; 
10g新特性: 
1.可以手工加入手工加入備份片,所以,只要你的備份還在,歸檔還在,即使 
catalog 
database崩潰,控制文件重建,照樣可以用這些備份來做恢復。 
RMAN> CATALOG backupiece '/oracle/xxxx'; 
2.掃描整個目錄,如果備份片或者歸檔日誌文件太多,可以放到一個目錄中,一次
性掃描就行。 
RMAN> CATALOG START WITH '/xxx/arch_logs'; 
4.6.2 恢復目錄的建立、升級與刪除
恢復目錄的建立請見:4.2.1 建立 
Recovery Catalog恢復目錄
當恢復目錄管理的某個數據庫進行了升級,只要版本不高於恢復目錄就沒有問題,
下面的命令查詢恢復目錄的版本 
(RMAN用戶): 
SQL> select version from rcver;
如果要高於恢復目錄,那麼恢復目錄就必須進行升級。用下面的命令即可: 
RMAN> upgrade catalog; 
恢復目錄可以採用如下命令刪除 
RMAN> DROP CATALOG; 
4.6.3 同步或重置 
CROSSCHECK命令(交叉校驗) 
如果目標數據庫物理對象發生了變化,如添加了一個數據文件,需要用如下命令同
步: 
RMAN> resync catalog; 
如果目標數據庫 
reset了數據庫,需要用如下命令同步 
RMAN> reset database; 
(必須使用 
catalog數據庫 

打開數據庫的時候,每次使用 
resetlogs參數都會創建數據庫的一個新對應物。如
果這個操作是在 
rman 中完成的,rman 會自動更新恢復目錄。如果是在 
rman 之外完
成,如 
sql*plus,那麼就必須手工重置對應物。如: 
RMAN> reset database;
另外有的時候,我們需要改成之前的某個對應物,可以用 
list incarnation 來顯示出
對應物列表之後用下面的命令: 
RMAN> reset database to incarnation incarnation_num;
當手工刪除了數據庫的歸檔文件後,要執行以下腳本同步 
RMAN> allocate channel for maintenance type disk; 
RMAN> change archivelog all crosscheck; 
RMAN> release channel; 
當手工刪除了數據庫的 
RMAN備份後,要執行以下腳本來同步 
RMAN> allocate channel for maintenance type disk; 
RMAN> crosscheck backup; 
RMAN> delete expire backup; 
RMAN> release channel; 
關於 
CROSSCHECK交叉校驗命令
該命令用於覈對磁盤和磁帶上的備份文件,以確保 
RMAN資料庫與備份文件保持
同步。該命令只會檢查 
RMAN資料庫所記載的備份文件。當執行 
CROSSCHECK命令
時,如果資料庫記錄不匹配於備份文件的物理狀態,那麼該命令會更新資料庫記錄的狀
態信息。當使用 
CROSSCHECK命令覈對備份文件之後,備份文件的狀態會包括 
AVALIABLE、UNAVALIABLE和 
EXPIRED 三種,如果備份文件處於 
EXPIRED狀態,
則說明物理文件已經被手工刪除或者損壞。注意,如果備份文件處於 
EXPIRED狀態,
應該使用 
DELETE命令刪除該備份文件。
覈對所有備份集 
RMAN>CROSSCHECK BACKUP; 
覈對所有數據文件的備份集 
RMAN> CROSSCHECK BACKUP OF DATABASE; 
覈對特定表空間的備份集 
RMAN>CROSSCHECK BACKUP OF TABLESPACE SYSTEM; 
覈對特定數據文件的備份集 
RMAN>CROSSCHECK BACKUP OF DATAFILE 4; 
覈對控制文件的備份集 
RMAN>CROSSCHECK BACKUP OF CONTROLFILE; 
覈對 
SPFILE的備份集 
RMAN> CROSSCHECK BACKUP OF SPFILE; 
覈對歸檔日誌的備份集 
RMAN> CROSSCHECK BACKUP OF ARCHIVELOG SEQUENCE 3; 
覈對所有映像副本 
RMAN> CROSSCHECK COPY; 
覈對所有數據文件的映像副本 
RMAN> CROSSCHECK COPY OF DATABASE; 
覈對特定表空間的映像副本 
RMAN> CROSSCHECK COPY OF TABLESPACE USERS; 
覈對特定數據文件的映像副本 
RMAN> CROSSCHECK COPY OF DATAFILE 4; 
覈對控制文件的映像副本 
RMAN> CROSSCHECK COPY OF CONTROLFILE; 
覈對歸檔日誌的映像副本 
RMAN> CROSSCHECK COPY OF ARCHIVELOG SEQUENCE 4; 
4.6.4 修改備份的可用狀態、保存策略 
Change命令 
Change命令可以修改備份的狀態是可用(available)還是不可用(unavailable)。對
於不可用的備份,還原與恢復期間不會被考慮到,不過執行 
delete expired命令期間也不
會刪除這些記錄。
例如: 
RMAN> change backup of database tag='GOLD' unavailable; 
RMAN> change copy of database like '%GOLD%' available; 
RMAN> change archivelog 'd:/arc/arch_001.arc' unavailable; 
RMAN> change backupset 4981 available; 
RMAN> change backup of database available; 
RMAN> change archivelog all available; 
RMAN> change archivelog all backed up 5 times unavailable;
當一個給定的備份或者副本根據備份的保存策略的標準而被廢棄的時候,RMAN 
並不會自動刪除這個備份或者副本,而只是標記這個備份爲廢棄。我們可以用 
report 
obsolete 命令來查看標記爲廢棄的備份。可以使用 
change 命令來將一個備份修改爲永
久保留的備份,也可以修改爲要保存多少天的備份。還可以使用 
change … 
nokeep來手
工丟棄一個備份。
舉例:
將 
4421備份集標記爲廢棄 
RMAN> change backupset 4421 nokeep;
將 
4421備份集標記爲 
7 天內有效 
RMAN> change backupset 4421 keep until time 'sysdate+7' logs;
將 
4421備份集標記爲永久有效 
RMAN> change backupset 4421 keep forever logs;
廢棄的備份集並不真正的刪除,如果需要物理刪除,則可以用下面的命令: 
RMAN> delete obsolete; 
4.6.5 查看與刪除過時的備份信息
列出已經過時的備份: 
RMAN> report obsolete; 
定義 
delete通道: 
RMAN> allocate channel for delete/maintenance type disk; 
刪除過時的備份信息 
RMAN> allocate channel for maintenance type disk; 
RMAN> change backupset id delete; 
RMAN> release channel; 
當手工刪除了數據庫的 
RMAN備份文件後,要執行以下腳本進行同步: 
RMAN> allocate channel for maintenance type disk; 
RMAN> crosscheck backup; 
RMAN> delete expired backup; --刪除過期的備份 
RMAN> delete obsolete; -- 刪除廢棄的備份 
RMAN> release channel; 
在 
8i 和 
8i 之前的版本只能用 
change…delete命令來刪除物理備份。 
RMAN> change archivelog until logseq=500 delete; 
4.6.6 恢復目錄記錄的刪除
如果不加以維護,具有 
DELETE 狀態的舊備份會一直駐留在恢復目錄中。爲了解決
這個問題,Oracle 提供了?/rdbms/admin/prgrmanc.sql,這個腳本可以刪除恢復目錄中具有 
DELETE 狀態的記錄。如果想刪除舊的對應物,那麼我們可以刪除 
dbinc 表的記錄。例
如,如果要刪除對應物是 
2 的記錄,則可以執行下面的語句: 
SQL> delete from dbinc where dbinc_key=2; 
4.6.7 備份RMAN數據庫 
RMAN自己的數據庫也需要備份,但是本身很小,而且不是經常發生變化,所以在
每次 
RMAN備份完成後,可以對 
RMAN數據庫備份。 
$ EXP RMAN/RMAN OWNER=RMAN FILE=RMAN.DMP ROWS=Y GRANTS=Y 
COMPRESS=Y CONSISTENT=Y 
4.6.8 備份檢查驗證備份的可恢復性
我們可以通過 
Validate 命令來檢查是否能備份,如數據文件是否存在,是否存在壞
塊不能被備份,通過使用 
RESTORE DATABASE VALIDATE; 和 
RESTORE DATABASE 
VALIDATE CHECK LOGICAL; 可以檢查最新的備份是否可恢復。這些命令並不真正的執
行恢復,而是檢查備份中是否有訛誤。如果使用 
CHECK LOGICAL 選項,還將檢查數
據和索引段中是否存在邏輯訛誤。 
RMAN> RESTORE DATABASE VALIDATE; 
RMAN> RESTORE DATABASE VALIDATE CHECK LOGICAL ; 
RMAN> VALIDATE BACKUPSET 218; 
RMAN> VALIDATE BACKUPSET bs CHECK LOGICAL ; 
RMAN> BACKUP VALIDATE DATABASE ARCHIVELOG ALL;
對於數據庫與數據文件,可以從指定的 
tag 恢復:
RMAN> RESTORE DATAFILE 1 FROM TAG=’tag name’; 
4.6.9 登記目標數據庫:
一個恢復目錄可以註冊多個目標數據庫,註冊目標數據庫的命令爲: 
$ RMAN catalog rman/rman target user/pwd @db; 
RMAN> register database 
4.6.10 註銷數據庫
註銷數據庫不是簡單的在 
RMAN提示下反註冊就可以了,需要運行一個程序包,過程
如下: 
1. 
連接目標數據庫,獲得目標數據庫 
ID 
$ RMAN target internal/password catalog rman/rman@rcdb
2. 
以 
RMAN用戶登錄,查詢恢復目錄,得到更詳細的信息 
SQL> SELECT db_key, db_id FROM db WHERE db_id = 1231209694; 
DB_KEY DB_ID 
1 1237603294 
1 row selected. 
3. 運行過程 
dbms_rcvcat.unregisterdatabase註銷數據庫,如 
SQL> EXECUTE dbms_rcvcat.unregisterdatabase(1 , 1237603294) 
4.6.11 重新啓動備份
對於異常結束了的備份,很多人可能不想再重新開始備份了吧,特別是備份到 
90%
以上,因爲異常原因終止了該備份,那怎麼辦呢?RMAN提供一個重新開始備份的方法,
通過簡單的命令,你就可以只備份那不到 
1%的數據了。 
RMAN> backup not backed up since time 'sysdate-14' database plus archivelog; 
4.6.12 腳本及自動運行
腳本的自動/定時運行可以通過 
Windows 計劃任務,UNIX/Linux的 
Crontab/at命令,
或者第三方軟件實現,詳細介紹有待補充。
 (未完成) 
1、編寫 
rman批處理文件 
2、編寫 
Shell腳本 
set ORACLE_SID =xxxx 或 
export $ORACLE_SID 
rman target / msglog /xxx.log cmdfile=/xxx/backup.rman 
3、設定執行計劃
4.7高級主題 
4.7.1 使用RMAN備份集恢復 
DB到其他機器 
(1常規方法) 
用途:
利用生產 
DB的備份集建立測試環境或備用數據庫
(設置成相同的 
DBID,不需要連接原始 
DB,只需要利用 
Catalog )
步驟: 
1.準備工作,配置目標 
DB環境 

在目標 
DB上設置 
ORACLE相關的環境變量:記下生產 
DB的 
ORACLE_SID, 
DBID 
$ set ORACLE_SID=ming 

在目標 
DB創建與生產 
DB相同的目錄,將生產 
DB的 
pfile 文件 
FTP到目標 
DB,或者,在第二步中可以從備份集中進行恢復得到 
PFILE。 

在目標 
DB上創建生產 
DB的 
RMAN 備份集存放的目錄,沒有使用 
catalog
情況時這點必然保持一樣 

移植備份集(確定包含控制文件,數據文件,歸檔文件)到目標 
DB 

配置網絡連接 
2.目標 
DB在 
nomount狀態下恢復 
pfile和 
controlfile 
連接恢復目錄和目標數據庫: 
$ RMAN target / catalog rman/rman@rcdb 
RMAN > set DBID= 3324789823 
RMAN > startup nomount 
RMAN> restore spfile to pfile ‘/home/oracle/pfile’[from ‘backupset name’]; 
RMAN> restore controlfile [to 'xx '] from '/xx/ ORADB_ctl_20070111_c-xx'; 
(控制文件的恢復可以參考 
4.4.4.6 中其他方法) 
3.啓動目標 
DB 到 
mount,在目標 
DB上 
Restore和 
Recover 
RMAN> alter database mount; --可能會提示找不到密碼文件,不用理會
如果備份集的位置改變了,需要先進行交叉校驗: 
RMAN> catalog start with '/newdir'; 
RMAN> crosscheck backup; 
RMAN> report schema; 
然後 
restore / recover : 
RMAN> run { 
allocate channel ch_disk_db_1 device type disk; 
restore database; 
recover database until sequence=2412 thread=1; 
--最後一個 
arachivelog的 
sequence 
release channel ch_disk_db_1; 

4.Resetlogs 打開目標 
DB 
聯機日誌文件並沒有恢復,所以需要 
resetlogs 
SQL> alter database open resetlogs; 
5.重建臨時表空間,重建密碼文件,立即備份數據庫
重建臨時表空間:
因爲備份時不備份臨時文件,v$tempfile中查詢爲空,所以可以增加一個文件即
可: 
SQL> alter tablespace temp add tempfile '/u05/oracle/oradata/crm/temp01.dbf' size 
10M; 
重建密碼文件
可以通過 
orapwd命令重建密碼文件
備註:恢復時有時遇到的一個問題 
RMAN-03002 ORA-27064錯誤
解決辦法:把數據文件 
resize到 
oracle的 
block size的整數倍 
SQL> alter database datafile 'xxx' resize n MB; 
4.7.2 使用RMAN備份集恢復 
DB到其他機器 
(2複製方法) 
使用 
RMAN DUPLICATE 命令可以在保留目標數據庫的基礎上依靠目標數據庫 
(Target Database)的備份創建一個副本數據庫 
(Duplicate Database) 。該副本即可與目標數
據庫完全相同,也可僅包含目標數據庫表空間的一部子集。目標站點(Target Site)以及副
本站點(Duplicate Site)甚至可以在同一臺機器上。
(生成新的唯一的 
DBID,如果控制文件中仍保存有備份信息,可以不連接 
Catalog )
步驟: 
1.準備工作,配置副本 
DB環境 
1. 備份主數據庫(包括數據文件、控制文件以及所有歸檔),並把該備份集拷貝到副本
數據庫機器同樣的目錄下。 
2. 拷貝主數據庫的初始化參數文件 
pfile到副本數據庫機器上,並根據需要作相應修改,
創建密碼文件。 
3. 配置主數據庫到副本數據庫的連接。 
2.啓動副本數據庫到 
nomount下,目錄數據庫必須 
MOUNT (或 
OPEN) 
$ sqlplus /nolog 
SQL> conn / as sysdba 
SQL> startup nomount 
3.運行 
RMAN,分別連接主數據庫與副本數據庫實例
控制文件中保存有備份信息,可以不連接 
Catalog 
在副本數據庫上: 
$ rman target sys/change_on_install@MING auxiliary / 
4.運行復制命令
如果沒有配置自動分配通道的話,需要手工指定至少 
1 條輔助通道。 
DUPLICATE命令將自動完成:將還原所有數據文件,重新創建控制文件,並利
用新的參數文件啓動恢復數據庫到一致狀態,最後用 
resetlog 方式打開數據庫,並
重建 
redolog 
RMAN> RUN 

ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISK; 
duplicate target database to crm nofilenamecheck; 
RELEASE CHANNEL aux1; 

5.重建臨時表空間,立即備份數據庫 
SQL> alter tablespace temp add tempfile '/u05/oracle/oradata/crm/temp01.dbf' size 
10M; 
附:Duplicate複製命令的一些高級用法:
 1.NOFILENAMECHECK 
異機恢復需要指定 
NOFILENAMECHECK,可以跳過文件名檢測,避免 
oracle錯
誤的領會你的操作意圖。
 2.指定 
PFILE 
如果輔助實例不是用 
SPFILE啓動,需要指定 
PFILE 參數,PFILE文件必須放
在運行 
RMAN 的客戶端上。
 3.跳過不需要複製的表空間
要跳過只讀表空間,在執行 
duplicate命令時指定 
SKIP READONLY子句即可。
要跳過離線表空間,在執行 
duplicate命令之前將其置爲 
OFFLINE NORMAL狀態
即可,RMAN 複製時會跳過只讀或離線表空間的數據文件。
要跳過正常的表空間,指定 
SKIP TABLESPACE ts_name, … 
4.恢復到以前的時間點
要恢復到以前的時間點,在 
duplicate命令中指定 
UNTIL TIME 'SYSDATE-1' 
5.創建過程中重命名控制文件
可以使用 
restore controlfile from …;或者 
dbms_backup_restore包恢復出控件文件,
然後在初始化參數文件 
PFILE中進行正確的設置。 
6.創建過程中重命名在線日誌文件 
1.執行 
duplicate 命名時指定 
LOGFILE子句,手工設置 
redo logs文件名。
例: 
LOGFILE 
GROUP 1 ('?/oradata/newdb/redo01_1.log', 
'?/oradata/newdb/redo01_2. log') SIZE 200K, 

 2.副本數據庫初始化參數文件 
PFILE中設置 
LOG_FILE_NAME_CONVERT 
LOG_FILE_NAME_CONVERT = 'string1' , 'string2' , 'string3' , 'string4' , ...; 
將 
strin1替換爲 
string2,string3替換爲 
string4 
7.創建過程中重命名數據文件,或改變數據庫文件的新的路徑 
1.在初始化參數中重命名: 
DB_FILE_NAME_CONVERT=’xxxx’,’yyyy’ 
2.在 
Duplicate Duplicate Duplicate命令中重命名數據文件: 
duplicate target database to newdb 
DB_FILE_NAME_CONVERT=('xxxx', 'yyyyy '); 
3.使用 
SET NEWNAME 命令重命名數據文件 
SET NEWNAME FOR DATAFILE 1 TO '/xxx/xxx.dbf'; 
4.使用 
CONFIGURE AUXNAME 命令重命名數據文件 
CONFIGURE AUXNAME FOR DATAFILE 1 TO '/xxxx/xxx.dbf'; 
5.重命名臨時文件路徑 
SET NEWNAME FOR TEMPFILE '/xxx/xxx.dbf' TO '/yyy/xxx.dbf'; 
例:一個比較複雜的複製命令如下: 
RMAN> RUN 

allocate auxiliary channel newdb1 device type sbt; 
duplicate target database to newdb 
DB_FILE_NAME_CONVERT=('/h1/oracle/dbs/trgt/','/h2/oracle/oradata/newdb/') 
UNTIL TIME 'SYSDATE-1' # specifies incomplete recovery 
SKIP TABLESPACE cmwlite, drsys, example # skip desired tablespaces 
PFILE = ?/dbs/initNEWDB.ora 
LOGFILE 
GROUP 1 ('?/oradata/newdb/redo01_1.log', 
'?/oradata/newdb/redo01_2. log') SIZE 200K, 
GROUP 2 ('?/oradata/newdb/redo02_1. log'', 
'?/oradata/newdb/redo02_2. log'') SIZE 200K 
GROUP 3 ('?/oradata/newdb/redo03_1. log'', 
'?/oradata/newdb/redo03_2. log'') SIZE 200K REUSE; 

4.7.3 表空間時間點恢復(TSPITR) 
用戶可能錯誤的刪除了幾個表,而且還截斷了幾個表,如果進行整庫恢復可能代價比較
高,這時,我們可以執行表空間時間點恢復(tablespace point-in-time recovery, 
TSPITR)。
爲了掌握如何執行 
TSPITR,應該理解下面這些術語:
輔助實例 
(auxiliary instance):這是我們創建的臨時實例,RMAN 使用這個實例執行 
TSPITR。完成 
TSPITR 後,這個實例可以刪除。
輔助集(auxiliary set):輔助實例上的文件集。包括控制文件、回滾段或者重做段的表
空間、系統表空間、聯機日誌文件等,還可以選擇輔助實例的臨時表空間。
恢復集 
(recovery set):要執行 
TSPITR 的表空間 
/數據文件集
目標數據庫:實際執行 
TSPITR 的數據庫 
TSPITR 的本質是,RMAN 將要進行時間點恢復的表空間按照設定的條件恢復到輔助
實例上,然後再從輔助實例將表空間傳到目標數據庫,從而避免整個數據庫的恢復,減少恢
復時間,而且這期間其他表空間仍然可用。( 用戶管理的備份與恢復也可以使用 
TSPITR) 
檢查TSPITR之後丟失的對象,被丟失對象信息的獲取: 
SQL> Select owner, name 
From TS_PITR_OBJECTS_TO_BE_DROPPED 
Where tablespace_name = 'USER01' And creation_time > 
to_date( '2004-09-27 11:25:21', 'yyyy-mm-dd hh24:mi:ss' ); 
進行 
TSPITR 的基本步驟是(與有些書上的步驟略有不同): 
(0) 檢查需要恢復的表空間的數據文件備份和控制文件備份是否存在 
(1) 驗證表空間的可傳輸性 
(2) 準備輔助實例 
(3) 執行實際的 
TSPITR 
(4) 在目標數據庫上執行 
TSPITR 後的操作。 
1.驗證表空間的可傳輸性 
RMAN 使用 
Oracle 可傳送的表空間特性來執行 
TSPITR,因此表空間本身必須是可傳送
的。許多因素都導致表空間不可傳送。 
TSPITR 限制
不能還原包含 
SYS 用戶對象
不能執行 
TSPITR 恢復具有複製主表的表空間
不支持使用快照日誌的表空間
不能還原含有回滾段的表空間
不能還原含有分區對象(該對象的分區跨越多個表空間)的表空間
表空間中不能含有 
VARRAY、嵌套表、外部表對象 
TSPITR 不能用於恢復刪除的表空間。
可以通過 
TS_PITR_CHECK 視圖來判斷表空間是否可傳送。如果表空間不可傳送,那
麼執行 
TSPITR時就會失敗。下面是查詢 
USERS 表空間是否可傳送的語句: 
SQL> SELECT OBJ1_NAME "Object Owner",obj1_name "Object Name", 
obj1_type "Object Type",ts1_name "Tablespace Name",reason 
FROM TS_PITR_CHECK WHERE ts1_name='USERS';
如果未選定行,說明 
USERS 表空間可傳輸。 
2.準備 
TSPITR 的輔助實例 
(AUXILIARY INSTANCE) 
啓動 
TSPITR之前,需要準備輔助實例。這是一個不需要 
RMAN 參與的手工過程。執
行下面的步驟來創建輔助實例: 

創建口令文件 

創建輔助實例的參數文件:
編輯輔助實例參數文件的一個簡單方法是把目標數據庫的參數文件改一下即
可。如果目標數據庫用的是 
SPFILE,那麼在 
SQLPLUS 中執行 
CREATE PFILE 
FROM SPFILE 就可以生成參數文件。
注意: 
control_files 設置爲輔助實例上的文件名 
db_name = 目標實例 
lock_name_space 如果輔助實例與目標數據庫同一主機,必須設置 
instance_name service_names取一新名,如 
AUX 
db_file_name_convert數據文件名的轉換 
log_file_name_convert日誌文件名的轉換
註釋掉 
log_archive_start 參數 

如果在 
Windows NT 上運行 
Oracle,需要使用 
oradim 來添加數據庫服務 

啓動輔助實例,如有必要,配置 
tnsnames.ora,測試是否連通。 
3.執行實際的 
TSPITR 
例子:恢復用戶誤刪除的某個重要的表。將實例 
MING 的 
USERS 表空間恢復到 
SCN 
是 
3818161 的時候。
啓動輔助實例: 
C:/>SET ORACLE_SID=AUX1 
C:/>SQLPLUS /NOLOG 
SQL> CONNECT / AS SYSDBA 
SQL> STARTUP NOMOUNT;
請注意,SET ORACLE_SID=AUX1 很重要,這樣就可以不用配置 
TNSNAMES.ORA 
執行實際的 
TSPITR
首先要連到目標數據庫和輔助實例。可以聯到恢復目錄,也可以不連到恢復目錄: 
C:/> SET ORACLE_SID=AUX1 
C:/> RMAN TARGET /@MING CATALOG RMAN/RMAN@RECO AUXILIARY / 
RMAN> RECOVER TABLESPACE USERS UNTIL SCN 233646; 

等待完成表空間的恢復。當然也可以用 
UNTIL TIME 或者 
UNTIL SEQUENCE子
句,例: 
RMAN> run { 
allocate auxiliary channel c1 device type disk; 
recover tablespace user02 until logseq 9; 

( 這裏有些版本有一個 
ORACLE的 
BUG,執行到最後可能會報錯,需要打補丁 
?? ) 
可以改變輔助集/恢復集數據文件的位置和名稱: 
set newname for datafile 5 to 'c:/demo/user01.dbf'; 
configure auxname for datafile 1 to '/backup/xxx.dbf’; 
在初始化參數文件中用 
DB_FILE_NAME_CONVERT進行轉換 
10g 中增加了 
auxiliary destination,更方便 
RMAN> recover tablespace user01 until logseq 19 auxiliary destination 'd:/auxiliary'; 
4.執行 
TSPITR 後的操作
首先應該重新連接 
RMAN與目標數據庫,並且備份剛恢復的表空間。完成備份後,
需要將表空間聯機(RMAN 在 
TSPITR 後使表空間脫機)。最後,我們還要關閉或刪除輔
助數據庫。 
4.7.4 塊媒體恢復 
Block Media Recovery (BMR) 
產生塊損壞的原因一般是間斷或隨機的 
I/O 錯誤或者是內存的塊錯誤。要恢復的壞塊
信息可以從報警與跟蹤文件,表與索引的分析, 
DBV工具或第三方媒體管理工具以及具體
的查詢語句中獲得。 
1. DBV工具 
dbv file=EYGLE.DBF blocksize=8192 
2. RMAN> backup validate datafile 4; --或者 
BACKUP VALIDATE DATABASE 
備份的壞塊信息保存在 
V$BACKUP_CORRUPTION、 
V$COPY_CORRUPTION 和 
V$DATABASE_BLOCK_CORRUPTION視圖中。 
V$BACKUP_CORRUPTION顯示歷史訛誤的視圖 
V$DATABASE_BLOCK_CORRUPTION顯示當前數據塊訛誤的視圖。
一旦修正了數據庫的塊訛誤,就需要重新運行 
BACKUP VALIDATE DATABASE 命令,
然後確認 
V$DATABASE_BLOCK_CORRUPTION中沒有其他訛誤。 
RMAN 可以備份包含損壞數據塊的數據文件,通過設置 
set maxcorrupt 可以跳過指定
個數的壞塊來避免備份失敗。 
RMAN> set maxcorrupt for datafile 1 to 0; 
在 
Oracle9i中可以用 
RMAN來執行塊級的恢復,而且恢復期間數據文件可以是聯機狀
態。RMAN通過 
Block Media Recovery(簡稱 
BMR)來執行塊級恢復操作。假設我們在查
詢一個 
Oracle 表的時候接收到下面的錯誤: 
ERROR 位於第 
1行: 
ORA-01578: ORACLE 數據塊損壞(文件號 5,塊號 
97) 
ORA-01110:數據文件 
5: 'E:/xxxx.dbf'
那麼我們就可以在 
RMAN中用 
BLOCKRECOVER命令來修復: 
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 97;
啓動 
blockrecover 於 
03-9月 
-06
正在啓動全部恢復目錄的 
resync
完成全部 
resync
使用通道 
ORA_DISK_1
通道 
ORA_DISK_1:正在從數據文件副本 
E:/xxxx.bak恢復塊
正在開始介質的恢復
完成介質的恢復
完成 
blockrecover 於 
03-9月 
-06
恢復 
V$DATABASE_BLOCK_CORRUPTION視圖中列出的壞塊: 
RMAN> blockrecover corruption list [ restore until time 'sysdate -10' ]; 
恢復指定壞塊: 
RMAN> blockrecover datafile 2 block 12,13 datafile 9 block 19; 
RMAN> blockrecover tablespace system dba 44404,44405 from tag "weekly_backup"; 
RMAN> blockrecover tablespace system dba 44404,44405 restore until time 'sysdate-2'; 
4.7.5 使用恢復目錄恢復前一個對應物
在不完全恢復完成之後,通常需要使用 
resetlogs 選項來打開數據庫。 
resetlogs 表示
一個數據庫邏輯生存期的結束和另一個數據庫邏輯生存期的開始。數據庫的邏輯生存期
也被稱爲一個對應物(incarnation)。每次使用 
resetlogs選項來打開數據庫後都會創建一個
新的數據庫對應物。
使用 
RMAN可以進行穿越 
resetlogs的恢復,即可以恢復到前一個對應物。10g版本
增強了這方面的功能。 
(1) 使用恢復目錄的情況
使用恢復目錄的情況下,恢復前一個對應物是非常簡單的。
首先,用 
list incarnation;來顯示有哪些對應物: 
RMAN> list incarnation;
數據庫 
Incarnations 列表 
DB關鍵字 
Inc關鍵字 
DB名 
DB ID CUR重置 
SCN重置時間 
1 2 MING 2600315304 NO 1 20-4 月 
-06 
1 854 MING 2600315304 NO 3407561 19-8 月 
-06 
1 4368 MING 2600315304 NO 3794049 29-8 月 
-06 
1 4437 MING 2600315304 NO 3794728 29-8 月 
-06 
1 4639 MING 2600315304 YES 3794935 29-8 月 
-06
接下來,決定恢復到哪個對應物
比如,決定恢復到上面的 
4437,
方法:在 
NOMOUNT狀態下用下面的命令: 
RMAN> reset database to incarnation 4437;
下面是具體的恢復步驟的一個演示(輸出略去): 
RMAN> shutdown immediate; 
RMAN> startup nomount; 
RMAN> reset database to incarnation 4437; 
RMAN> restore controlfile; 
RMAN> alter database mount; 
RMAN> restore database until scn 3794934; 
RMAN> recover database until scn 3794934; 
RMAN> alter database open resetlogs;
上面的例子中,我們最大可恢復到的 
SCN 就是 
3794934,因爲 
4437 的下一個對
應物的重置 
SCN 是 
3794935。 
(2) 不使用恢復目錄的情況
不使用恢復目錄的情況下,要恢復前一個對應物就必須要能恢復到前一對應物的控
制文件。不使用恢復目錄,我們就無法使用 
RESET DATABASE TO incarnation_num 命
令。
首先看看有哪些對應物: 
RMAN> list incarnation;
數據庫 
Incarnations列表 
DB關鍵字 
Inc關鍵字 
DB名 
DB ID CUR重置 
SCN重置時間 
1 1 MING 2600315304 NO 3501920 20-8 月 
-06 
2 2 MING 2600315304 NO 3785052 29-8 月 
-06 
3 3 MING 2600315304 NO 3794049 29-8 月 
-06 
4 4 MING 2600315304 NO 3794728 29-8 月 
-06 
5 5 MING 2600315304 NO 3794935 29-8 月 
-06 
6 6 MING 2600315304 YES 3976301 03-9 月 
-06
假設我們要恢復到 
5,6之間,那麼就要看看有沒有控制文件的備份的 
SCN 在 
3794935 
到 
3976301。我們使用下面的命令: 
RMAN> LIST BACKUP OF CONTROLFILE BY FILE;
控制文件備份列表 
=========================== 
CF Ckp SCN Ckp時間 
BSKey S 段數副本數標記 
3976095 03-9 月 
-06 34 A 2 1 TAG20060903T170136 
3959239 03-9 月 
-0630 A1 1 
3959170 03-9 月 
-0629 A1 1 
3958983 03-9 月 
-0628 A1 1 
3958937 03-9 月 
-0627 A1 1 
3816575 30-8 月 
-06 11 A 2 1 TAG20060830T064447
可以看出,上面的列表中,控制文件都是可以用的。接下來找到一個具體的含有控制文
件的備份: 
RMAN> LIST BACKUP OF CONTROLFILE;
備份集列表 
=================== 
……
段名:E:/TEST/C-2600315304-20060830-07
控制文件包括: Ckp SCN: 3818213 Ckp時間:30-8 月 
-06 
……
假設我們使用 
E:/TEST/C-2600315304-20060830-07,那麼接下來我們需要用 
DBMS_BACKUP_RESTORE 包來從這個文件中恢復控制文件。(在 
SQLPLUS 中運行)
SQL>SHUTDOWN IMMEDIATE; 
SQL>STARTUP NOMOUNT; 
SQL>DECLARE 
DEVTYPE VARCHAR2(256); 
DONE BOOLEAN; 
BEGIN 
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL); 
DBMS_BACKUP_RESTORE.restoresetdatafile; 
DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL01.CTL'); 
DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',D 
ONE=>done); 
DBMS_BACKUP_RESTORE.restoresetdatafile; 
DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL02.CTL'); 
DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',D 
ONE=>done); 
DBMS_BACKUP_RESTORE.restoresetdatafile; 
DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL03.CTL'); 
DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',D 
ONE=>done); 
DBMS_BACKUP_RESTORE.devicedeallocate(NULL); 
END; 

SQL>ALTER DATABASE MOUNT; 
重新聯到 
RMAN 後再來運行一下 
LIST INCARNATION; 
$ RMAN TARGET /@MING NOCATALOG; 
RMAN> LIST INCARNATION;
數據庫 
Incarnations 列表 
DB關鍵字 
Inc關鍵字 
DB名 
DB ID CUR重置 
SCN
重置時間 
------------------------------------------------------------1 
1 MING 2600315304 NO 3501920 20-8 月 
-06 
2 2 MING 2600315304 NO 3785052 29-8 月 
-06 
3 3 MING 2600315304 NO 3794049 29-8 月 
-06 
4 4 MING 2600315304 NO 3794728 29-8 月 
-06 
5 5 MING 2600315304 YES 3794935 29-8 月 
-06
可以看出來,我們已經恢復到想要的對應物上了。接下來: 
RMAN> RESTORE DATABASE; 
RMAN> RECOVER DATABASE; 
RMAN> ALTER DATABASE OPEN RESETLOGS; 
4.7.6 RMAN增量備份
通過增量備份, 
RMAN 允許用戶只備份上次增量備份操作以來被修改過的數據塊。 
N 級別增量備份備份從最近的 
N 級別或者更小級別以來的所有更改過的數據塊內容。0 
級備份與全備份的不同就是 
0 級備份可以作爲其它增量備份的基礎備份而全備份是不可
以的。
增量備份的優點:節約備份時間節省備份磁帶或者磁盤空間降低網絡帶寬要求
增量備份的缺點:恢復時間可能要長。
增量備份分爲兩種,一種是累積增量備份,一種是非累積增量備份。
差異增量備份(Differential Incremental Backup) 
差異備份是默認的增量備份類型,備份上一次在同級或者更低級別進行備份以來所
有有變化的數據塊。 
RMAN>backup incremental level n (incremental) database; 
累積增量備份(Cumulative Incremental Backup) 
包括上一次低級備份以來所有有變化的數據塊。累計增量備份增加了備份的時間,
但是因爲恢復的時候,需要從更少的備份集中恢復數據,所以,爲了減少恢復的時候,
累計增量備份將比差異增量備份更有效。 
RMAN>backup incremental level n (cumulative) database; 
9i :不管怎麼樣增量備份,還是需要比較數據庫中全部的數據塊,這個過程其實是一個漫
長的過程,而且由於增量備份形成多個不同的備份集,使得恢復變的更加不可靠而且速度慢,
所以增量備份在版本 
9中仍然是雞肋,除非是很大型的數據倉庫系統,沒有必要選擇增量備
份。 
10g :在增量備份上做了很大的改進,可以使增量備份變成真正意義的增量,因爲通過特
有的增量日誌,使得 
RMAN 沒有必要去比較數據庫的每一個數據塊,當然,代價就是日誌
的 
IO與磁盤空間付出。另外,10g通過備份的合併,使增量備份的結果可以合併在一起,
而完全的減少了恢復時間。 
1.基本備份(0 級備份) 
Level 0 是增量備份策略的基礎(注意與 
Full備份區別)。執行增量備份操作時,首先需
要的是基本備份(incremental base backup),增量備份必須有一個基本備份。基本備份的增量
級別是 0,如果沒有 
0 級備份,那麼其它級別的備份會自動轉成基本備份。 
0 級備份舉例: 
RMAN> run { 
2> allocate channel dev1 type disk; 
3> backup 
4> incremental level 0 
5> filesperset 4 #定義每個backupset 的最大文件數
6> format "/oracle/backups/sunday_level0_%t" 
7> (database); 
8> release channel dev1; 
9> } 
使用 
LIST語句查看,數據庫備份集的列表顯示中, 
"type" 將顯示 
"Incremental","LV"
列將顯示"0" 。 
2. 
N 級備份 
RMAN> run { 
2> allocate channel dev1 type disk; 
3> backup 
4> incremental level 1/2/3/4 
5> filesperset 4 #定義每個backupset 的最大文件數
6> format "/oracle/backups/sunday_level0_%t" 
7> (database); 
8> release channel dev1; 
9> } 
3. 
N 級備份的規劃
根據業務需求、數據量、恢復所需要的時間等方面考慮,制定合理的備份計劃。
例:一個典型的增量備份案例如下:
星期天晚上 
-level 0 backup performed 
星期一晚上 
-level 2 backup performed 
星期二晚上 
-level 2 backup performed 
星期三晚上 
-level 1 backup performed 
星期四晚上 
-level 2 backup performed 
星期五晚上 
-level 1 backup performed 
星期六晚上 
-level 2 backup performed 
星期天晚上 
-level 0 backup performed 
4.增量備份的恢復
同普通的完全恢復: 
restore recover 
RMAN自動確定和使用需要的備份集。 
4.7.7 RMAN備份的優化
可以在 
RMAN配置中設置備份的優化,如 
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
如果優化設置打開,將對備份的數據文件、歸檔日誌或備份集運行一個優化算法。 
RMAN備份操作主要是完成以下三個步驟
1、從磁盤上讀取數據 
2、在內存中處理數據塊 
3、寫入數據到磁盤或磁帶
以上的讀寫操作可以同步或異步的完成,在同步 
I/O操作中,一個時間只允許有一個 
IO
操作,但是在異步 
I/O操作中,一個時間允許有多個 
IO操作。因此,備份與恢復的調優主
要集中在以下幾個方面: 
1、提高同步或異步 
I/O操作能力
在支持異步操作的操作系統上,可以通過設置 
TAPE_AYSNCH_IO,DISK_ASYNCH_IO和 
BACKUP_TYPE_IO_SLAVES來支持異步操
作,提高寫的能力。 
2、提高磁盤讀能力
可以在 
backup命令後通過設置 
DISKRATIO來保證從多個磁盤上讀取數據,保證
連續的數據流。 
3、正確設置緩衝區與參數值
設置 
LARGE_POOL_SIZE,使備份可以使用連續的緩衝池,通過設置 
DB_FIL_DIRECT_IO_COUNT可以提高緩衝區的利用。如果使用磁帶備份,還可以設
置 
BACKUP_TYPE_IO_SLAVES來提高磁帶的寫能力。 
4、採用並行備份
開闢多個通道,可以實現並行備份與恢復 
4.7.8 DBMS_BACKUP_RESTORE 包
這個包是 
RMAN 備份與恢復的核心,在調試模式下,RMAN會輸出它調用的每一條命
令: 
C:/> rman debug target /@tlgaxz catalog rman/rman@reco trace=debug.txt
常用命令: 
restoreSetDataFile指示還原操作的開始(但是不會執行實際的還原操作) 
restoreSetDataFileTo定義要還原的數據文件和該文件的還原位置 
restoreControlFileTo定義控制文件的還原位置 
restoreSpfileTo定義要還原的 
spfile 的位置 
restorebackuppiece執行實際的還原操作,這個函數的一個參數是備份文件名 
devicedeallocate釋放 
deviceallocate函數所分配的設備 
deviceallocate分配用於連續 
I/O的設備 
applySetDataFile指示增量還原操作的開始 
applyDataFileTo定義數據文件的增量還原位置 
applybackuppiece執行實際的還原操作 
resetoreSetArchivelog指示歸檔日誌還原操作的開始 
restoreArchivelog定義要還原的歸檔的重做日誌序列和線程
例:使用 
dbms_backup_restore包恢復服務器參數文件:
在一些不常見的情況下,我們可能需要直接使用 
dbms_backup_restore 包來恢復 
spfile。
當然這個包也可以用來恢復其它數據,是常規辦法都沒有用的時候的一個利器。這個包可以
在數據庫 
NOMOUNT 狀態下使用。假設我們有一個自動備份文件
C-2600315304-20060829-02,我們需要從這裏恢復數據,那麼可以通過執行下面的腳本來完
成: 
SQL>DECLARE 
DEVTYPE VARCHAR2(256); 
DONE BOOLEAN; 
BEGIN 
DEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL); 
DBMS_BACKUP_RESTORE.restoresetdatafile; 
DBMS_BACKUP_RESTORE.restorespfileto('d:/spfile.ora'); 
DBMS_BACKUP_RESTORE.restorebackuppiece('d:/C-2600315304-20060829-00', 
DONE=>done); 
DBMS_BACKUP_RESTORE.devicedeallocate(NULL); 
END; 

. Flashback 
Flashback在開發環境(有時生產環境的特殊情況下)是很有用的一個工具, 
5.1 9i Flashback簡介 
5.1.1 原理
當數據 
update或 
delete時,原來的數據會保存在 
undo表空間中,保存的最少時間是 
UNDO_RETENTION。實際的保存時間與 
undo表空間的大小和數據更改的繁忙程度相關。 
UNDO_RETENTION的參數(單位爲秒)指定 
Oracle保存用於 
flashback查詢的 
undo映像
的時間。一般你可以將這個值設爲一整天(864000秒),這樣你就能看到前一天全天的映像。
當然,你的在線 
undo日誌必須足夠大,大到足以能保存一整天的 
undo日誌數據,對於繁忙
的 
Oracle系統,這個數值可以達到很大。 
5.1.2 一些限制 
.服務器必須配置成使用自動 
undo管理。 
.在使用 
Flashback查詢時不能使用 
DDL或者 
DML。 

Flashback不取消 
DDL操作,例如 
DROP命令。
數據庫管理員做一些必要的設置之後,一般用戶才能使用 
Flashback查詢功能: 
SQL> ALTER SYSTEM SET UNDO_MANAGEMENT=AUTO 
SQL> ALTER SYSTEM SET UNDO_RETENTION=86400 
SQL> GRANT EXECUTE ON DBMS_FLASHBACK TO USERNAME; 
5.1.3 獲得SCN或時間點
在 
Flashback時,可以嘗試多個 
SCN,獲取最佳值。
如果能得知具體時間,那麼可以獲得準確的數據閃回。 
SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'; 
SQL> select sysdate from v$database; 
捕捉提交的 
SCN: 
// 不知爲什麼,兩種方法獲得的 
SCN不一樣 
SQL> select dbms_flashback.get_system_change_number scn from dual; 
SQL> select max(ktuxescnw * power(2,32) + ktuxescnb) SCN from x$ktuxe; 
5.1.4 啓用或禁用flashback查詢
使用系統改變數(SCN)或者真實時間來指定 
flashback的時間點來獲取數據映象。
方法一: 
SQL> select * from [TABLE] as of scn 129292; 
SQL> select * from [TABLE] as of timestamp to_timestamp('時間', ’時間格式'); 
SQL> select * from saflog as of timestamp to_timestamp('2007-12-18 08:40:00', 
'YYYY-MM-DD HH24:MI:SS'); 
方法二:
啓用: 
SQL> exec dbms_flashback.enable_at_system_change_number(112112); 
SQL> exec dbms_Flashback.enable_at_time('28-AUG-02 11:00:00'); 
啓用後看到的只是閃回的結果,實際上並未恢復數據。且閃回狀態下不能做 
DML操作。可以先恢復到一個臨時表中。見示例。
禁用: 
SQL> execute dbms_flashback.disable(); 
5.1.5 示例: 
declare 
cursor c1 is select * from scott.emp_temp; 
r_c1 scott.e%rowtype; 
begin 
loop 
dbms_flashback.enable_at_system_change_number(49570); 
if c1%isopen=false then open c1;end if; 
fetch c1 into r_c1; 
dbms_flashback.disable(); 
exit when c1%notfound; 
update scott.emp_temp set sal=r_c1.sal where empno=r_c1.empno; 
commit; 
end loop; 
exec dbms_flashback.disable(); 
close c1; 
end; 

5.2 10g Flashback的增強 
10g的 
Flashback進行了增強和修改,通過回閃,用戶可以完成許多不可能恢復的
工作,目前 
oracle10g的回閃包括以下特性; 
1〉 
oracle falshback Database.
該特性允許 
oracle通過 
Flashback database語句,將數據庫會滾到前一個時間點或者 
scn上,而不需要作時間點的恢復工作! 
2〉oracle falshback table.
該特性允許 
oracle通過 
flashback table語句,將表會滾到前一個時間點或者 
scn上。
3〉oracle falshback drop.
該特性允許 
oracle把恢復 
drop掉的 
table或者索引。 
4〉oracle falshback version query.
該特性可以得到特定的表在某一個時間段內的任何修改記錄! 
5〉oracle falshback transaction query
該特性可以限制用戶在某一個事務級別上檢查數據庫的修改操作,適用於診斷問
題、分析性能、審計事務。 
(未完成,以後再更新吧) 
6. LogMiner 
6.1 LogMiner的用途 
Oracle LogMiner 是 
Oracle公司從產品 
8i以後提供的一個實際非常有用的分析工具,使
用該工具可以輕鬆獲得 
Oracle 重作日誌文件(歸檔日誌文件)中的具體內容,特別是,該
工具可以分析出所有對於數據庫操作的 
DML(insert、update、delete等)語句,9i後可以分
析 
DDL語句,另外還可分析得到一些必要的回滾 
SQL語句。其中一個最重要的用途就是不
用全部恢復數據庫就可以恢復數據庫的某個變化。該工具特別適用於調試、審計或者回退某
個特定的事務。 
LogMiner 工具即可以用來分析在線,也可以用來分析離線日誌文件,即可以分析本身
自己數據庫的重作日誌文件,也可以用來分析其他數據庫的重作日誌文件。
總的說來,LogMiner工具的主要用途有: 
1.跟蹤數據庫的變化:可以離線的跟蹤數據庫的變化,而不會影響在線系統的性能。 
2.回退數據庫的變化:回退特定的變化數據,減少 
point-in-time recovery的執行。 
3.優化和擴容計劃:可通過分析日誌文件中的數據以分析數據增長模式。 
4.確定數據庫的邏輯損壞時間:準確定位操作執行的時間和 
SCN ==> 基於時間和 
SCN的恢復 
5.確定事務級要執行的精細邏輯恢復操作 
//取得相應的 
UNDO操作 
6.執行後續審計 
//DML DDL DCL執行時間、用戶
注意事項: 
1. LogMiner可以幫你確定在某段時間所發的各種 
DML,DDL操作的具體時間和 
SCN
號,它所依據的是歸檔日誌文件及聯機日誌文件。 
2.它只能在 
Oracle8i及以後的版本中使用,不過它可以分析 
Oracle8的日誌。 
3. Oracle8i只能用於分析 
DML操作,到 
Oracle9i則可以分析 
DDL操作了。 
4. LogMiner不支持索引組織表、Long、LOB及集合類型。 
5.不支持 
MTS的環境 
6. LogMiner必須使用被分析數據庫實例產生的字典文件,而不是安裝 
LogMiner的數
據庫產生的字典文件,另外必須保證安裝 
LogMiner數據庫的字符集和被分析數據庫的
字符集相同。 
7. 源數據庫 
(Source Database)平臺必須和分析數據庫 
(Mining Database)平臺一樣 
6.2安裝 
LogMiner 
要安裝 
LogMiner工具,必須首先要運行下面這樣兩個腳本: 
l. $ORACLE_HOME/rdbms/admin/dbmslm.sql 
2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql 
這兩個腳本必須均以 
SYS用戶身份運行。其中第一個腳本用來創建
DBMS_LOGMNR包,該包用來分析日誌文件。第二個腳本用來創建 
DBMS_LOGMNR_D包,該包用來創建數據字典文件。 
6.3基本對象 
Source Database:日誌所屬的數據庫 
Mining Database:執行 
LogMiner操作要使用的數據庫,相同硬件平臺,相同字符集,
版本不低於 
Source Database 
LogMiner字典:將內部對象 
ID號和數據類型轉換爲對象名和外部數據格式,在 
Source 
Database上生成,有三種方式: 
1. 
使用源數據庫數據字典 
// 表結構無變化 
S-DB必須 
OPEN,只能跟蹤 
DML不能爲 
DDL 
SQL> exec DBMS_LOGMNR.START_LOGMNR( 
OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG ); 
2. 
摘取 
LogMiner字典到重做日誌 
// Source-DB必須 
OPEN, 
Archivelog模式 
SQL> exec DBMS_LOGMNR_D.BUILD( 
OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS ); 
3. 
摘取 
LogMiner字典到字典文件
配置字典文件所在目錄:靜態參數: UTL_FILE_DIR 
建立字典文件: 
SQL> exec dbms_logmnr_d.build ( 
dictionary_filename => 'logminer.dat', 
dictionary_location => 'F:/0_WorkSpace/1_Database/1_Oracle/Log_Miner' ); 
SQL> exec dbms_logmnr_d.build ('dict.ora''/xxx', OPTIONS=>DBMS_LOGMNR_D.STO(,) RE_IN_FLAT_FILE); 
與 
LogMiner相關的數據字典: 
v$loghist顯示歷史日誌文件的一些信息 
v$logmnr_dictionary因 
logmnr可以有多個字典文件,顯示字典文件信息 
v$logmnr_parameters顯示 
logmnr的參數 
v$logmnr_logs顯示用於分析的日誌列表信息 
v$logmnr_contents LogMiner結果 
6.4使用 
LogMiner進行分析 
6.4.1 
設定用於LogMiner分析的日誌文件存放的位置
設置 
UTL_FILE_DIR,需要重啓數據庫。
設置 
utl_file_dir=*表示你能操作任何目錄
在 
initsid.ora文件中加入 
utl_file_dir參數或者: 
SQL> alter system set utl_file_dir='d:' scope=spfile; 
SQL> shutdown immediate 
SQL> starup 
6.4.2 生成數據字典文件 
SQL> BEGIN 
2 dbms_logmnr_d.build( 
3 dictionary_filename => 'logminer_dict.dat', 
4 dictionary_location => '/u01/arch' 
5 ); 
6 END; 
7/ 
dictionary_location指的是 
Logminer數據字典文件存放的位置,它必須匹配 
utl_file_dir的
設定。 
dictionary_filename指的是放於存放位置的字典文件的名字,名字可以任意取。 
6.4.3 建立日誌分析表
建立日誌分析表數據庫必須在 
mount或 
nomount狀態
建立日誌分析表,使用 
dbms_logmnr.add_logfile() 
SQL> BEGIN 
2 dbms_logmnr.add_logfile( 
3 options => dbms_logmnr.new, 
4 logfilename => '/u01/arch/arc_ctc_0503.arc' 
5 ); 
6 END; 
7/
其中的 
options有三種取值, 
dbms_logmnr.new用於建一個日誌分析表 
dbms_logmnr.addfile用於加入用於分析的的日誌文件 
dbms_logmnr.removefile用於移出用於分析的日誌文件 
6.4.4 添加用於分析的日誌文件 
SQL> BEGIN 
2 dbms_logmnr.add_logfile( 
3 options => dbms_logmnr.addfile, 
4 logfilename => '/u01/arch/arc_ctc_0504.arc' 
5 ); 
6 END; 
7/
可以用以下方法查詢分析的日誌文件包含的 
scn範圍和日期範圍: 
SQL> select low_time,high_time,low_scn,next_scn from v$logmnr_logs; 
6.4.5 啓動 
LogMiner進行分析 
SQL> BEGIN 
2 dbms_logmnr.start_logmnr( 
3 dictfilename => '/u01/arch/logminer_dict.dat', 
4 starttime => to_date('20030501 12:15:00''yyyymmdd hh24:mi:ss'), 
5 endtime => to_date('20030501 15:40:30','y(,) yyymmdd hh24:mi:ss') 
6 ); 
7 END; 
8/
即分析 
2003年 
5月 
1日這天 
12:15至 
15:40這段時間,並把分析結果放到數據字典中
以用於查詢。
還有兩個參數 
startscn (起始 
SCN號) 及 
endscn (終止 
SCN) 號。 
6.4.6 查看日誌分析的結果
查看 
DML操作: 
SELECT operation, sql_redo, sql_undo 
FROM V$logmnr_contents WHERE seg_name = 'QIUYB'; 
OPERATION SQL_REDO SQL_UNDO 
INSERT inser into qiuyb.qiuyb ... delete from qiuyb.qiuyb... 
其中 
operation指的是操作,sql_redo指的是實際的操作,sql_undo指的是用於取消的相
反的操作。
查看 
DDL操作: 
SELECT timstamp, sql_redo FROM v$logmnr_contents 
WHERE upper(sql_redo) like '%TRUNCATE%'; 
6.4.7結束LogMiner的分析 
SQL>BEGIN 
2 dbms_logmnr.end_logmnr(); 
3 end; 
4/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章