前言
這篇文章主要介紹RMAN的常用方法,其中包含了作者一些自己的經驗,裏面的實驗也基本全在WIN 2K和ORACLE 8.1.6環境下測試成功(因爲這個環境比較容易實現)。
RMAN可以用來備份和還原數據庫文件、歸檔日誌和控制文件。它也可以用來執行完全或不完全的數據庫恢復。
2.1. Backup sets備份集合
備份集合有下面的特性:
包括一個或多個數據文件或歸檔日誌
以oracle專有的格式保存
有一個完全的所有的備份片集合構成
構成一個完全備份或增量備份
一個備份集由若干個備份片組成。每個備份片是一個單獨的輸出文件。一個備份片的大小是有限制的;如果沒有大小的限制, 備份集就只由一個備份片構成。備份片的大小不能大於使用的文件系統所支持的文件長度的最大值。
鏡像備份是獨立文件(數據文件、歸檔日誌、控制文件)的備份。它很類似操作系統級的文件備份。它不是備份集或備份片,也沒有被壓縮。
全備份是一個或多個數據文件中使用過的數據塊的的備份。沒有使用過的數據塊是不被備份的,也就是說,oracle 進行備份集合的壓縮。
增量備份是指備份一個或多個數據文件的自從上一次同一級別的或更低級別的備份以來被修改過的數據塊。 與完全備份相同,增量備份也進行壓縮。
不同的多個數據文件的數據塊可以混合備份在一個備份集中。
使用恢復管理器執行backup、copy、restore或者switch命令時,恢復目錄自動進行更新,但是有關日誌與歸檔日誌信息沒有自動記入恢復目錄。需要進行目錄同步。使用resync catalog命令進行同步。
RMAN-03023:正在執行命令:resync
RMAN-08002:正在啓動全部恢復目錄的 resync
RMAN-08004:完成全部 resync
3. 恢復目錄
3.1.恢復目錄的概念
恢復目錄是由RMAN使用、維護的用來放置備份信息的倉庫。RMAN利用恢復目錄記載的信息去判斷如何執行需要的備份恢復操作。
第一步,在目錄數據庫中創建恢復目錄所用表空間:
第二步,在目錄數據庫中創建RMAN 用戶並授權:
tablespace temp quota unlimited on rman_ts;
RMAN-06428:未安裝恢復目錄
注意:雖然使用RMAN不一定必需恢復目錄,但是推薦使用。因爲恢復目錄記載的信息大部分可以通過控制文件來記載,RMAN在恢復數據庫時使用這些信息。不使用恢復目錄將會對備份恢復操作有限制。
可以存儲腳本;
RMAN爲交互式命令行處理界面,也可以從企業管理器中運行。
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)
NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS
設置目標數據庫的 ORACLE_SID ,執行:
RMAN> connect target
RMAN> connect target internal/<PASSWORD>@his
4.2.使用帶恢復目錄的RMAN
% rman rman_ts rman/rman@rman
RMAN> connect target
4.3.使用RMAN
一旦連接到目標數據庫,可以通過交互界面或者事先存儲的腳本執行指定RMAN命令,下面是一個使用RMAN交互界面的實例:
RMAN-03022:正在編譯命令:resync
RMAN-03023:正在執行命令:resync
RMAN-08002:正在啓動全部恢復目錄的 resync
RMAN-08004:完成全部 resync
使用腳本的實例:
創建或者替代存儲的腳本:
2> allocate channel d1 type disk;
3> }
5.註冊或者註銷目標數據庫
恢復管理器:版本8.1.6.0.0 - Production
RMAN-06005:連接到目標數據庫:HIS (DBID=3021445076)
RMAN-06008:連接到恢復目錄數據庫
第二步,註冊數據庫:
RMAN-03022:正在編譯命令:register
RMAN-03023:正在執行命令:register
RMAN-08006:註冊在恢復目錄中的數據庫
RMAN-03023:正在執行命令:full resync
RMAN-08002:正在啓動全部恢復目錄的resync
RMAN-08004:完成全部resync
恢復管理器:版本8.1.6.0.0 - Production
RMAN-06005:連接到目標數據庫:HIS (DBID=3021445076)
RMAN-06008:連接到恢復目錄數據庫
其中DBID=3021445076,利用DBID=3021445076查詢數據庫鍵值碼,連接到目標數據庫,查詢db表:
---------- ---------- --------------
1 3021445076 2
獲得DB_KEY=1,這樣,該目標數據庫DB_KEY=1,DBID=3021445076,利用兩個值使用DBMS_RCVCAT工具包就可以註銷數據庫:
PL/SQL 過程已成功完成。
至此,註銷數據庫操作完成。
6.1.加入目錄數據庫
數據庫狀態:
使用如下命令顯示恢復目錄中包含的文件
6.2.從目錄數據庫中刪除
RMAN-03022:正在編譯命令:list
備份集列表
------- ---------- ---------- -- ---------- ---------- ----------------------
1104 2 501364455 0 501364446 2 06-8月 -03
備份段列表
------- --- --- ----------- ---------------------- ------------------------
1106 1 1 AVAILABLE 06-8月 -03 D:/ORACLE/ORA81/DATABASE/02EU4DMU_1_1
數據文件包括列表
---- ------------------------------------- -- ---- ---------- -------------
3 D:/ORACLE/ORADATA/HIS/USERS01.DBF 0 Full 160052 06-8月 -03
備份集的關鍵字爲1104。
RMAN-03022:正在編譯命令:allocate
RMAN-03023:正在執行命令:allocate
RMAN-08030:分配的通道:delete
RMAN-08500:通道 delete:sid=19 devtype=DISK
第三步:刪除backupset備份集
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
注意:部分執行刪除備份集、備份片或者維護恢復目錄的命令,需要先指定通道,如:
7.在非歸檔模式下備份
數據庫狀態:
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表明備份所有數據文件包括控制文件
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> }
使用下列命令來顯示恢復目錄中該表的備份信息:
假設USERS表空間在備份後被置爲READ ONLY表空間,以後的全庫備份就可以不用備份該表空間,爲了達到這個目的,可以在以後的備份中指定"skip readonly"。
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;
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> 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> }
注意:數據庫完全備份將自動備份控制文件。
數據庫狀態:
下面的腳本備份歸檔日誌:
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:
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小時內產生的歸檔日誌,在備份完成後會自動刪除歸檔日誌。如果備份失敗,歸檔日誌不會被刪除。
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找到歸檔日誌後會備份指定日誌,如果無法找到日誌,它也不會返回錯誤信息。
聯機日誌不能用RMAN來備份,必須先將其歸檔。
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> }
上面的腳本可以在執行完一個完整的聯機數據庫備份後執行,確保所有的重做日誌可以將數據庫恢復到一個一致性的狀態。
N級別增量備份備份從最近的N級別或者更小級別以來的所有更改過的數據塊內容。增量備份分爲兩種,一種是累積增量備份,一種是非累積增量備份。
Level 0 是增量備份策略的基礎--the basis of the incremental backup strategy
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 的最大文件數
一個典型的增量備份案例如下:
星期天晚上 - 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
恢復案例如下:
數據文件在數據庫打開時被刪除。有兩種方法可以對打開的數據庫進行恢復:還原數據文件或者表空間。下面兩個實例顯示了該方法:
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 表空間恢復
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> }
注意:如果還原系統表空間文件,數據庫必須關閉,因爲系統表空間不可以脫機。
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指定的控制文件。
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. 腳本
創建或者取代腳本:
2> # Allocates one disk
3> allocate channel dev1 type disk;
4> setlimit channel dev1 kbytes 2097150 maxopenfiles 32 readrate 200;
5> }
2> # releases disk
3> release channel dev1;
5> }
2> # Performs a complete backup
3> execute script alloc_disk;
4> backup
5> .....
6> execute script rel_disk;
7> }
前兩個腳本分別用來分配和回收通道。
2> execute script backup_db_full;
3> }
注意:存儲的腳本必須在{ .... execute <script>; ....}命令中調用。
RMAN可以備份包含損壞數據塊的數據文件,查詢視圖V$BACK_CORRUPTION和V$COPY_CORRUPTION可以獲得有關壞數據的信息。
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中發現,上面的腳本執行就會失敗。
一個通道是RMAN和目標數據庫之間的一個連接,"allocate channel"命令在目標數據庫啓動一個服務器進程,同時必須定義服務器進程執行備份或者恢復操作使用的I/O類型
控制RMAN使用的O/S資源
影響並行度
指定I/O帶寬的限制值(設置limit read rate參數)
定義備份片大小的限制(設置limit kbytes)
指定當前打開文件的限制值(設置limit maxopenfiles)
14.1. List
list命令查詢恢復目錄並且產生格式化的查詢內容:
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-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
經常同步恢復目錄
rman作爲oracle備份最爲方便的工具,以下就總結幾條常用的命令,希望能方便大家,也希望可以申請授權:
1、首先使用rman前,需要建一個目錄數據庫
2、create tablespce rman datafile '/data/oradata/test/rman.dbf' size 20m;
3、create user rman identified by rman default tablespace rman temporary tablespace temp;
4、grant connect,resource,recovery_catalog_ower to rman;
以上建庫和建用戶基本成功,接着:
1、rman target sys/manager@ora8 catalog rman/rman@rman
2、register database (同步數據庫,如果數據庫做了alter database open resetlogs,就需要reset database,如果有庫結構變化,就需要
3、create script back {
allocate channel n1 type disk;
backup database
format '/data/backup/ora8_%d_%s_%p';
release channel n1;}
4、如果是備份固定的文件或表空間也可以
create script back_file{
allocate channel n1 type disk;
copy
datafile 4 to '/data/backup/users.dbf';
release channel n1;}
create script back_tablespace{
allocate channel m1 type disk;
backup tablespace users
format '/data/backup/users_%t_%s_%p';
release channel n1;}
使用copy就是文件鏡像保存,使用backup就是用oracle專有的格式保存,支持壓縮等等,此處就不細說了!
5、執行備份
run{execute script back;}
等等!
以上說了備份數據庫,下面是恢復數據庫
1、rman target sys/manager@ora8 catalog rman/rman@rman
2、run{
allcote channel n1 type disk;
sql "alter tablespce users offline immediate";
restore tablespace users;
recover tablespace users;
sql "alter tablespace user online";
release channel n1;}
3、run{
allocate channel n1 type disk;
restore database;
recover database;
sql "alter database open resetlogs";
release channel n1;}
4、run{
allocate channel n1 type disk;
restore datafile 4;
release channel n1;}