Oracle 資料庫備份與恢復總結-exp/imp (匯出與匯入裝庫與卸庫)

potoo發表於2011-04-26

1.1 基本命令

1. 獲取幫助

[@more@]$ exp help=y
$ imp help=y

2. 三種工作方式

(1)互動式方式
$ exp // 然後按提示輸入所需要的引數
(2)命令列方式
$ exp 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=ycommit=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/inct ype
其中:
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)或 cop y(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注意引數 p
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,C LOB,LONG 欄位的資料的顯示等有效。 ORACLE 的多國語言設定最主要的兩個特性就是國家語言設定與字符集設定,國家語 言設定決定了介面或提示使用的語言種類,字符集決定了資料庫儲存與字符集有關資料
(如文字)時候的編碼規則。
ORACLE 字符集設定,分為資料庫字符集和客戶端字符集環境設定。在資料庫端,

字符集在建立資料庫的時候設定,並儲存在資料庫 props$表中。
在客戶端的字符集環境比較簡單,主要就是環境變數或登錄檔項 NLS_ LANG,注 意 NLS_LANG的優先順序別為:引數檔案使用一點點技巧,就可以使匯出/匯入在不同的字符集的資料庫上轉換資料。這裡
需要一個 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換成 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.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 b y ‘|’
(
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 b y ',' 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 b y ',' 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 b y ',' 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;

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




使用者管理的備份與恢復也稱 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(,)達式*/ 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 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 &cp y '||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_lo
透過這兩個檢視可以瞭解詳細的需要恢復的資料檔案與需要使用到的歸檔日誌。
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,否則同 2

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;


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來進行備份與恢復。

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 catalogrman/rman
RMAN> connecttarget //連線本地資料庫作為目標資料庫
RMAN> connecttarget user/pwd>@db //連線遠端資料庫

$ rman catalogrman/rman targetuser/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_ownerto 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 t ype to disk; RMAN> configure default device t ype 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 redundancy3;
設定 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 archivelogbackup 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:backupdatafilecopyusers01.dbf.bak'; RMAN> copy datafile 'd:oracleoradataora9iusers01.dbf' to
'd:backupdatafilecop yusers01.dbf.bak';
生成控制檔案副本:
RMAN> copy current controlfile to … ;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP is ON;
備份 ARCHIVELOG 副本:
// 只能一個一個的來備份,而不能指定一個範圍
RMAN> copy archivelog 'd:oracleoradataarcming_351.arc' to
'd:oracleorabackuparcming_351.arc';
並行設定:
1. RMAN> configure device type ... parallelism = 3;
//only 2 channel, one for writting data to disk
2. 手工分配多個通道
3. 在命令中指定多個檔案
RMAN> cop y 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 datafilecop y 命令來從資料檔案副本中還原數 據檔案,然後再用 recover 命令來恢復。例如:
RMAN> sql "alter database datafile 5 offline"; RMAN> restore (datafile 5) from datafilecop y; 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 ARCHIVE LOG 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 skipinaccessible skipreadonly;

強制備份只讀的資料檔案

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:tempcontrol01.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:

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

相關文章