正在看的ORACLE教程是:Oracle RMAN快速入門手冊。
前言:
這篇文章主要介紹RMAN的常用方法,其中包含了作者一些自己的經驗,裡面的實驗也基本全在WIN 2K和ORACLE 8.1.6環境下測試成功(因為這個環境比較容易實現)。
本文借鑒了網上一些高手的相關文章,希望大俠們不要見怪,此處一併謝過。
這篇文章主要是在北京出差期間寫的,回到家後整理修改了一下,時間比較倉促,同時因為篇幅有限,一些技術細節不能一一覆蓋了,只希望能夠協助新手入門的作用,想真正熟練掌握RMAN,必須經過較長時間的實踐磨練才可以,尤其需要在工程中獲得寶貴的故障解決經驗。
1.什麼是RMAN?
RMAN可以用來備份與還原資料庫檔案、歸檔日誌和控制檔案。它也可以用來執行完全或不完全的資料庫恢複。
注意:RMAN不能用於備份初始化參數檔案和口令檔案。
RMAN啟動資料庫上的Oracle伺服器處理序來進行備份或還原。備份、還原、恢複是由這些進程驅動的。
RMAN可以由OEM的Backup Manager GUI來控制,但在本文章裡不作重點討論。
2. Terminology 專業詞彙解釋
2.1. Backup sets 備份組合
備份組合有下面的特性:
包括一個或多個資料檔案或歸檔日誌
以oracle專有的格式儲存
有一個完全的所有的備份片集合構成
構成一個完全備份或增量備份
2.2. Backup pieces 備份片
一個備份組由若干個備份片組成。每個備份片是一個單獨的輸出檔案。一個備份片的大小是有限制的;如果沒有大小的限制, 備份組就只由一個備份片構成。備份片的大小不能大於使用的檔案系統所支援的檔案長度的最大值。
2.3. Image copies 鏡像備份
鏡像備份是獨立檔案(資料檔案、歸檔日誌、控制檔案)的備份。它很類似作業系統級的檔案備份。它不是備份組或 備份片,也沒有被壓縮。
2.4. Full backup sets 全備份組合
全備份是一個或多個資料檔案中使用過的資料區塊的的備份。沒有使用過的資料區塊是不被備份的,也就是說,oracle 進行備份組合的壓縮。
2.5. Incremental backup sets 增量備份集合
增量備份是指備份一個或多個資料檔案的自從上一次同一層級的或更低層級的備份以來被修改過的資料區塊。 與完全備份相同,增量備份也進行壓縮。
2.6. File multiplexing
不同的多個資料檔案的資料區塊可以混合備份在一個備份組中。
2.7. Recovery catalog resyncing 恢複目錄同步
使用復原管理員執行backup、copy、restore或者switch命令時,恢複目錄自動進行更新,但是有關日誌與歸檔日誌資訊沒有自動記入恢複目錄。需要進行目錄同步。使用resync catalog命令進行同步。
RMAN>resync catalog;
RMAN-03022:正在編譯命令:resync
RMAN-03023:正在執行命令:resync
RMAN-08002:正在啟動全部恢複目錄的 resync
RMAN-08004:完成全部 resync
[NextPage]
3. 恢複目錄
3.1.恢複目錄的概念
恢複目錄是由RMAN使用、維護的用來放置備份資訊的倉庫。RMAN利用恢複目錄記載的資訊去判斷如何執行需要的備份恢複操作。
恢複目錄可以存在於ORACLE資料庫的計劃中。
雖然恢複目錄可以用來備份多個資料庫,建議為恢複目錄資料庫建立一個單獨的資料庫。
恢複目錄資料庫不能使用恢複目錄備份自身。
3.2.建立恢複目錄
第一步,在目錄資料庫中建立恢複目錄所用資料表空間:
SQL> create tablespace rman_ts datafile 'd:\oracle\oradata\rman\rman_ts.dbf' size 20M;
資料表空間已建立。
第二步,在目錄資料庫中建立RMAN 使用者並授權:
SQL> create user rman identified by rman default tablespace rman_ts temporary tablespace temp quota unlimited on rman_ts;
使用者已建立。
SQL> grant recovery_catalog_owner to rman ;
授權成功。
SQL> grant connect, resource to rman ;
授權成功。
第三步,在目錄資料庫中建立恢複目錄
C:\>rman catalog rman/rman
復原管理員:版本8.1.6.0.0 - Production
RMAN-06008:串連到恢複目錄資料庫
RMAN-06428:未安裝恢複目錄
RMAN>create catalog tablespace rman_ts;
RMAN-06431:恢複目錄已建立
注意:雖然使用RMAN不一定必需恢複目錄,但是推薦使用。因為恢複目錄記載的資訊大部分可以通過控制檔案來記載,RMAN在恢複資料庫時使用這些資訊。不使用恢複目錄將會對備份恢複操作有限制。
3.3.使用恢複目錄的優勢
可以儲存指令碼;
記載較長時間的備份恢複操作;
4. 啟動RMAN
RMAN為互動式命令列處理介面,也可以從企業管理器中運行。
為了使用下面的執行個體,先檢查環境符合:
the target database is called "his" and has the same TNS alias
user rman has been granted "recovery_catalog_owner "privileges
目標資料庫的串連使用者為internal帳號,或者以其他SYSDBA類型帳號串連
the recovery catalog database is called "rman" and has the same TNS alias
the schema containing the recovery catalog is "rman" (same password)
在使用RMAN前,設定NLS_DATE_FORMAT 和NLS_LANG環境變數,很多RMAN LIST命令的輸出結果是與日期時間相關的,這點在使用者希望執行以時間為基準的恢複工作也很重要。
[1] [2] [3] [4] [5] [6] 下一頁
正在看的ORACLE教程是:Oracle RMAN快速入門手冊。 下例是環境變數的示範:
NLS_LANG= SIMPLIFIED CHINESE_CHINA.ZHS16GBK
NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS
為了保證RMAN使用時能串連恢複目錄,恢複目錄資料庫必須開啟,目標資料庫至少要STARTED(unmount),否則RMAN會返回一個錯誤,目標資料庫必須置于歸檔模式下。
4.1.使用不帶恢複目錄的RMAN
設定目標資料庫的 ORACLE_SID ,執行:
% rman nocatalog
RMAN> connect target
RMAN> connect target internal/<password>@his
4.2.使用帶恢複目錄的RMAN
% rman rman_ts rman/rman@rman
RMAN> connect target
% rman rman_ts rman/rman@rman target internal/<password>@his
4.3.使用RMAN
一旦串連到目標資料庫,可以通過互動介面或者事先儲存的指令碼執行指定RMAN命令, 下面是一個使用RMAN互動介面的執行個體:
RMAN> resync catalog;
RMAN-03022:正在編譯命令:resync
RMAN-03023:正在執行命令:resync
RMAN-08002:正在啟動全部恢複目錄的 resync
RMAN-08004:完成全部 resync
使用指令碼的執行個體:
RMAN> execute script alloc_1_disk;
建立或者替代儲存的指令碼:
RMAN> replace script alloc_1_disk {
2> allocate channel d1 type disk;
3> }
5.註冊或者登出目標資料庫
5.1.註冊目標資料庫
資料庫狀態:
恢複目錄狀態:開啟
目標資料庫:載入或者開啟
目標資料庫在第一次使用RMAN之前必須在恢複目錄中註冊:
第一步,啟動復原管理員,並且串連目標資料庫:
C:\>rman target internal/oracle@his catalog rman/rman@rman
復原管理員:版本8.1.6.0.0 - Production
RMAN-06005:串連到目標資料庫:HIS (DBID=3021445076)
RMAN-06008:串連到恢複目錄資料庫
第二步,註冊資料庫:
RMAN> register database;
RMAN-03022:正在編譯命令:register
RMAN-03023:正在執行命令:register
RMAN-08006:註冊在恢複目錄中的資料庫
RMAN-03023:正在執行命令:full resync
RMAN-08002:正在啟動全部恢複目錄的resync
RMAN-08004:完成全部resync
5.2.登出目標資料庫
RMAN提供了一個登出工具,叫DBMS_RCVCAT工具包,請注意一旦登出了該目標資料庫,就不可以使用恢複目錄中含有的備份組來恢複資料庫了。
為了能登出資料庫,需要獲得資料庫的標識碼(DB_ID)和資料庫索引值(DB_KEY)。其中串連目標資料庫時將會獲得DB_ID。
C:\>rman target internal/oracle@his catalog rman/rman@rman
復原管理員:版本8.1.6.0.0 - Production
RMAN-06005:串連到目標資料庫:HIS (DBID=3021445076)
RMAN-06008:串連到恢複目錄資料庫
其中DBID=3021445076,利用DBID=3021445076查詢資料庫索引值碼:
串連到目標資料庫,查詢db表:
SQL> select * from db;
DB_KEY DB_ID CURR_DBINC_KEY
---------- ---------- --------------
1 3021445076 2
獲得DB_KEY=1,這樣,該目標資料庫DB_KEY=1,DBID=3021445076,利用兩個值使用DBMS_RCVCAT工具包就可以登出資料庫:
SQL> execute dbms_rcvcat.unregisterdatabase(1,3021445076);
PL/SQL 過程已成功完成。
至此,登出資料庫操作完成。
[NextPage]
6.操作已有的備份
6.1.加入目錄資料庫
資料庫狀態:
恢複目錄:開啟
目標資料庫:載入或者開啟
如果存在8.x版本以前建立的備份資料想註冊到目標資料庫,可以採用如下手工方式加入到恢複目錄中,
RMAN> catalog datafilecopy '/oracle/ .... /system01.dbf';
使用如下命令顯示恢複目錄中包含的檔案
RMAN> list copy of database;
6.2.從目錄資料庫中刪除
第一步:查看備份資訊:
RMAN>list backup;
RMAN-03022:正在編譯命令:list
備份組列表
關鍵字 Recid 標記 LV 集合標記 集合計數 完成時間
------- ---------- ---------- -- ---------- ---------- ----------------------
1104 2 501364455 0 501364446 2 06-8月 -03
備份段列表
關鍵字 Pc# Cp# 狀態 完成時間 段名
------- --- --- ----------- ---------------------- ------------------------
1106 1 1 AVAILABLE 06-8月 -03 D:\ORACLE\ORA81\DATABASE\
02EU4DMU_1_1
資料檔案包括列表
檔案 名稱 LV 類型 檢查點SCN 檢查點時間
---- ------------------------------------- -- ---- ----------&
上一頁 [1] [2] [3] [4] [5] [6] 下一頁
正在看的ORACLE教程是:Oracle RMAN快速入門手冊。nbsp;-------------
3 D:\ORACLE\ORADATA\HIS\USERS01.DBF 0 Full 160052 06-8月 -03
備份組的關鍵字為1104。
第二步:定義delete通道:
RMAN>allocate channel for delete type disk;
RMAN-03022:正在編譯命令:allocate
RMAN-03023:正在執行命令:allocate
RMAN-08030:分配的通道:delete
RMAN-08500:通道 delete:sid=19 devtype=DISK
第三步:刪除backupset備份組
RMAN>change backupset 1104 delete;
RMAN-03022:正在編譯命令:change
RMAN-08073:已刪除備份段
RMAN-08517:備份段 handle=D:\ORACLE\ORA81\DATABASE\02EU4DMU_1_1 recid=2 stamp=50
1364447
RMAN-03023:正在執行命令:partial resync
RMAN-08003:啟動部分恢複目錄的 resync
RMAN-08005:完成部分 resync
注意:部分執行刪除備份組、備份片或者維護恢複目錄的命令,需要先指定通道,如:
RMAN>allocate channel for delete type disk;
或者RMAN>allocate channel for maintenance type disk;
7.在非歸檔模式下備份
資料庫狀態:
恢複目錄: 開啟
目標資料庫:常式啟動或者資料庫載入
恢複目錄資料庫需要開啟,目標資料庫必須啟動(或者載入)。因為目標資料庫不在歸檔模式下,所以當進行備份恢複操作的時候資料庫無法開啟。不可以將資料表空間置於熱備份模式上進行等同於檔案系統級的拷貝,如果在非歸檔模式,資料庫開啟的狀態下不能進行資料檔案的備份。
7.1.資料庫完全備份
RMAN> run {
2> # backup the complete database to disk
3> allocate channel dev1 type disk;
4> backup
5> full
6> tag full_db_backup
7> format '/oracle/backups/db_t%t_s%s_p%p'
8> (database);
9> release channel dev1;
10> }
行#
2: 表明該行為注釋行(#是注釋符)
3&9: See section 15 - Channels通道定義
5: Full backup (default if full or incremental not specified)完全備份模式(預設模式)
6: Meaningful string (<=30 chars)(備份組標識,<=30個字元)
7: Filename to use for backup pieces, including substitution variables. 備份片使用的檔案名稱,可以包含代替變數。
8: Indicates all files including controlfiles are to be backed up表明備份所有資料檔案包括控制檔案
通過下面的命令顯示恢複目錄中記載的備份組資訊:
RMAN> list backupset of database;
7.2.備份資料表空間
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;
假設USERS資料表空間在備份後被置為READ ONLY資料表空間,以後的全庫備份就可以不用備份該資料表空間,為了達到這個目的,可以在以後的備份中指定'skip readonly'。
注意,目標資料庫不需要一定開啟,只要載入就可以,因為資料表空間的資訊儲存在控制檔案中。
7.3.備份單獨資料檔案
RMAN> run {
2> allocate channel dev1 type 'SBT_TAPE';
3> backup
4> format '%d_%u'
5> (datafile '/oracle/dbs/sysbigdb.dbf');
6> release channel dev1;
7> }
行#
2: 使用MML(media manager layer)分配磁帶磁碟機,必須指定類型為SBT_TAPE;
注意因為沒有指定標識,所以標識為空白;
使用下面的命令顯示恢複目錄中備份的資料表空間:
RMAN> list backupset of datafile 1;
7.4.備份資料檔案
RMAN> run {
2> allocate channel dev1 type 'SBT_TAPE';
3> copy datafile '/oracle/dbs/temp.dbf' to '/oracle/backups/temp.dbf';
4> release channel dev1;
5> }
使用下面的命令顯示恢複目錄中的檔案拷貝:
RMAN> list copy of datafile '/oracle/dbs/temp.dbf';
拷貝資料檔案和備份資料檔案是不一樣的,資料檔案拷貝是一個該檔案的鏡像。檔案的備份產生一個備份組。
7.5.備份控制檔案
RMAN> run {
2>
上一頁 [1] [2] [3] [4] [5] [6] 下一頁
正在看的ORACLE教程是:Oracle RMAN快速入門手冊。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> }
注意:資料庫完全備份將自動備份控制檔案。
[NextPage]
8.歸檔模式下的備份
資料庫狀態:
恢複目錄:開啟
目標資料庫:常式啟動,資料庫載入或者開啟
備份操作使用的命令與非歸檔模式下基本一樣。
8.1. Backing up archived logs 備份歸檔日誌
下面的指令碼備份歸檔日誌:
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> format '/oracle/backups/log_t%t_s%s_p%p'
5> (archivelog all);
6> release channel dev1;
7> }
下面的指令碼歸檔日誌從# 90 to 100:
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> format '/oracle/backups/log_t%t_s%s_p%p'
5> (archivelog from logseq=90 until logseq=100 thread 1);
6> release channel dev1;
7> }
下面的指令碼備份在24小時內產生的歸檔日誌,在備份完成後會自動刪除歸檔日誌。如果備份失敗,歸檔日誌不會被刪除。
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> format '/oracle/backups/log_t%t_s%s_p%p'
5> (archivelog from time 'sysdate-1' all delete input);
6> release channel dev1;
7> }
使用下面的命令顯示恢複目錄中的歸檔日誌:
RMAN> list backupset of archivelog all;
注意:RMAN找到歸檔日誌後會備份指定日誌,如果無法找到日誌,它也不會返回錯誤資訊。
8.2. Backing up the online logs 備份聯機日誌
聯機日誌不能用RMAN來備份,必須先將其歸檔。
為了實現這點,必須在RMAN中執行如下SQL語句:
RMAN> run {
2> allocate channel dev1 type disk;
3> sql "alter system archive log current";
4> backup
5> format '/oracle/backups/log_t%t_s%s_p%p'
6> (archivelog from time 'sysdate-1' all delete input);
7> release channel dev1;
8> }
上面的指令碼可以在執行完一個完整的線上資料庫備份後執行,確保所有的重做日誌可以將資料庫恢複到一個一致性的狀態。
注意:不可以標識歸檔記錄備份集。
9. 增量備份
N層級增量備份備份從最近的N層級或者更小層級以來的所有更改過的資料區塊內容。增量備份分為兩種,一種是累積增量備份,一種是非累積增量備份。
累積增量備份包括自最後一次在更低層級進行備份以來所有改動過的資料區塊。
非累積增量備份包括自前一次在同級或者更低層級進行備份以來改動過的資料區塊。
9.1. Level 0--增量備份策略的基礎
Level 0 是增量備份策略的基礎--the basis of the incremental backup strategy
RMAN> run {
2> allocate channel dev1 type disk;
3> backup
4> incremental level 0
5> filesperset 4
6> format '/oracle/backups/sunday_level0_%t'
7> (database);
8> release channel dev1;
9> }
Line#
4: 0級備份
5: 定義每個backupset 的最大檔案數
使用LIST語句查看,Database Backup集的列表顯示中, 'type' 將顯示 'Incremental','LV'列將顯示'0' 。
9.2. 使用增量備份的案例
一個典型的增量備份案例如下:
星期天晚上 - level 0 backup performed
星期一晚上 - level 2 backup performed
星期二晚上 - level 2 backup performed
星期三晚上 - level 1 backup performed
星期四晚上 - level 2 backup performed
星期五晚上 - level 2 backup performed
星期六晚上 - level 2 backup performed
星期天晚上 - l
上一頁 [1] [2] [3] [4] [5] [6] 下一頁
正在看的ORACLE教程是:Oracle RMAN快速入門手冊。evel 0 backup performed
10. 恢複
恢複案例如下:
10.1. Database open,datafile deleted 資料庫開啟時,檔案被刪除
資料檔案在資料庫開啟時被刪除。有兩種方法可以對開啟的資料庫進行恢複:還原資料檔案或者資料表空間。下面兩個執行個體顯示了該方法:
(a) Datafile recovery 資料檔案恢複
RMAN> run {
2> allocate channel dev1 type disk;
3> sql "alter tablespace users offline immediate";
4> restore datafile 4;
5> recover datafile 4;
6> sql "alter tablespace users online";
7> release channel dev1;
8> }
(b) Tablespace recovery 資料表空間恢複
RMAN> run {
2> allocate channel dev1 type disk;
3> sql "alter tablespace users offline immediate";
4> restore tablespace users;
5> recover tablespace users;
6> sql "alter tablespace users online";
7> release channel dev1;
8> }
注意:如果還原系統資料表空間檔案,資料庫必須關閉,因為系統資料表空間不可以離線。
10.2. Complete restore (lost online redo) and rollforward - database closed 完全還原(丟失聯機日誌)並且前滾 - 資料庫關閉
RMAN> run {
2> allocate channel dev1 type disk;
3> set until logseq=105 thread=1;
4> restore controlfile to '/oracle/dbs/ctrltargdb.ctl';
5> replicate controlfile from '/oracle/dbs/ctrltargdb.ctl';
6> restore database;
7> sql "alter database mount";
8> recover database;
9> sql "alter database open resetlogs";
10> release channel dev1;
11> }
Notes:
'set until' 命令指明恢複到指定的記錄檔。這一點在資料檔案恢複時很重要,否則RMAN將試圖恢複最近的資料檔案,該資料檔案可能在指定的日誌以前。
'replicate controlfile' 複製還原的控制檔案到INIT.ORA指定的控制檔案。
如果資料庫使用WITH RESETLOGS開啟,則需要使用RESET DATABASE命令註冊改變後的資料庫。在使用RESETLOGS命令開啟資料庫後強烈建議做一個完全的Database Backup。
10.3. 還原資料檔案的子集,完全恢複
RMAN> run {
2> allocate channel dev1 type disk;
3> sql "alter database mount";
4> restore datafile 2;
5> restore datafile 3;
6> restore archivelog all;
7> recover database;
8> sql "alter database open";
9> release channel dev1;
10> }
5
[NextPage]
11. 指令碼
建立或者取代指令碼:
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> replace script backup_db_full {
2> # Performs a complete backup
3> execute script alloc_disk;
4> backup
5> .....<backup commands here>
6> execute script rel_disk;
7> }
前兩個指令碼分別用來分配和回收通道。
alloc_disk 指令碼還額外指定了備份片的最大MB數,備份時可以同時開啟的輸入檔案的最大數目,以及每秒鐘讀每個輸入檔案的資料緩衝區的最大數目。
第三個指令碼調用先前儲存的兩個指令碼進行Database Backup。
運行儲存指令碼的示範:
RMAN> run {
2> execute scri
上一頁 [1] [2] [3] [4] [5] [6] 下一頁
正在看的ORACLE教程是:Oracle RMAN快速入門手冊。pt backup_db_full;
3> }
注意:儲存的指令碼必須在{ .... execute <script>; ....}命令中調用。
12. Corruption detection
RMAN可以備份包含損壞資料區塊的資料檔案,查詢檢視V$BACK_CORRUPTION和V$COPY_CORRUPTION可以獲得有關壞資料的資訊。
通過設定 set maxcorrupt 可以跳過指定個數的壞塊來避免備份失敗。
RMAN> replace script backup_db_full {
2> # Performs a complete backup
3> execute script alloc_disk;
4> set maxcorrupt for datafile 1 to 0;
5> backup
6> .....<backup commands here>
7> execute script rel_disk;
8> }
上面的指令碼maxcorrupt for datafile 1 to 0設定為0,所以如果有錯誤資料區塊在資料檔案1中發現,上面的指令碼執行就會失敗。
13. 通道
一個通道是RMAN和目標資料庫之間的一個串連,'allocate channel'命令在目標資料庫啟動一個伺服器處理序,同時必須定義伺服器處理序執行備份或者恢複操作使用的I/O類型
通道控制命令可以用來:
控制RMAN使用的O/S資源
影響並行度
指定I/O頻寬的限制值(設定limit read rate參數)
定義備份片大小的限制(設定limit kbytes)
指定當前開啟檔案的限制值(設定limit maxopenfiles)
14. Report & list commands
14.1. List
list命令查詢恢複目錄並且產生格式化的查詢內容:
RMAN> list backupset of datafile 1;
Key File Type LV Completion_time Ckp SCN Ckp Time
------- ---- ------------ -- --------------- ---------- --------
165 1 Full Oct 03 11:24 32022 Oct 03 11:24
208 1 Full Oct 24 14:27 52059 Oct 24 14:26
219 1 Full Oct 24 14:31 52061 Oct 24 14:31
<< other entries here >>
RMAN> list backupset of archivelog all;
Key Thrd Seq Completion time
------- ---- ------- ---------------
179 1 94 Oct 03 11:26
179 1 95 Oct 03 11:26
<< other entries here >>
14.2. Report
REPORT命令同樣可以查詢恢複目錄,但是REPORT命令文法可以構建獲得更為有用的資訊的指令,REPORT命令輸出可以儲存到訊息記錄檔中,但是必須在串連恢複目錄時指定MSGLOG或者LOG選項。
可以列出所有資料庫中不能恢複的檔案清單:
RMAN> report unrecoverable database;
顯示全部資料檔案:
RMAN>report schema;
RMAN-03022:正在編譯命令:report
資料庫模式報表
15. 小提示
經常同步恢複目錄
確認刪除不需要的歸檔日誌
備份策略簡單原則
上一頁
上一頁 [1] [2] [3] [4] [5] [6]