Oracle RMAN快速入門指南

tonywi888發表於2007-05-16

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

3. 恢復目錄

3.1.恢復目錄的概念

恢復目錄是由RMAN使用、維護的用來放置備份資訊的倉庫。RMAN利用恢復目錄記載的資訊去判斷如何執行需要的備份恢復操作。

恢復目錄可以存在於ORACLE資料庫的計劃中。

雖然恢復目錄可以用來備份多個資料庫,建議為恢復目錄資料庫建立一個單獨的資料庫。

恢復目錄資料庫不能使用恢復目錄備份自身。

3.2.建立恢復目錄

第一步,在目錄資料庫中建立恢復目錄所用表空間:

SQL> create tablespace rman_ts datafile "d:oracleoradatarmanrman_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命令的輸出結果是與日期時間相關的,這點在使用者希望執行以時間為基準的恢復工作也很重要。

下例是環境變數的示範:

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/@his

4.2.使用帶恢復目錄的RMAN

% rman rman_ts rman/rman@rman
RMAN> connect target

% rman rman_ts rman/rman@rman target internal/@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 過程已成功完成。

至此,登出資料庫操作完成。

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:ORACLEORA81DATABASE2EU4DMU_1_1

資料檔案包括列表

檔案 名稱                                  LV 型別 檢查點SCN  檢查點時間
---- ------------------------------------- -- ---- ---------- -------------
   3 D:ORACLEORADATAHISUSERS01.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:ORACLEORA81DATABASE2EU4DMU_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)(備份集標識,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> 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> }

注意:資料庫完全備份將自動備份控制檔案。

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語句檢視,資料庫備份集的列表顯示中, "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
   星期天晚上 - level 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命令開啟資料庫後強烈建議做一個完全的資料庫備份。

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> }

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> .....
   6> execute script rel_disk;
   7> }

前兩個指令碼分別用來分配和回收通道。

alloc_disk 指令碼還額外指定了備份片的最大兆位元組數,備份時可以同時開啟的輸入檔案的最大數目,以及每秒鐘讀每個輸入檔案的資料緩衝區的最大數目。

第三個指令碼呼叫先前儲存的兩個指令碼進行資料庫備份。

執行儲存指令碼的示範:

RMAN> run {
   2> execute script backup_db_full;
   3> }

注意:儲存的指令碼必須在{ .... execute

相關文章