(轉)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

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命令的輸出結果是與日期時間相關的,這點在用戶希望執行以時間爲基準的恢復工作也很重要。

下例是環境變量的示範:

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 過程已成功完成。

至此,註銷數據庫操作完成。

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 檢查點時間 ---- ------------------------------------- -- ---- ---------- ------------- 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> 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 <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> ..... 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 數據庫模式報表 文件 千字節 表空間 RB segs 名稱 1 121472 SYSTEM YES D:/ORACLE/ORADATA/HIS/SYSTEM01.DBF 2 327680 RBS YES D:/ORACLE/ORADATA/HIS/RBS01.DBF 3 110592 USERS NO D:/ORACLE/ORADATA/HIS/USERS01.DBF 4 73728 TEMP NO D:/ORACLE/ORADATA/HIS/TEMP01.DBF 5 12288 TOOLS NO D:/ORACLE/ORADATA/HIS/TOOLS01.DBF 6 59392 INDX NO D:/ORACLE/ORADATA/HIS/INDX01.DBF 

15. 小提示

經常同步恢復目錄

確認刪除不需要的歸檔日誌

備份策略簡單原則


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章