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/@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> select name from v$datafile;NAME -------------------------------------------------------------------------------- /u02/oradata/db01/system01.dbf /u02/oradata/db01/undotbs01.dbf /u02/oradata/db01/sysaux01.dbf /u02/oradata/db01/users01.dbfSQL> select name from v$controlfile;NAME -------------------------------------------------------------------------------- /u02/oradata/db01/control01.ctl /u02/oradata/db01/control02.ctl /u02/oradata/db01/control03.ctl /u01/app/oracle/bak/control04.ctl<2>以DBA用戶或特權用戶關閉數據庫。SQL> conn / as sysdba; Connected. SQL> shutdown normal Database closed. Database dismounted. ORACLE instance shut down.<3>複製數據文件,複製時應該將文件複製到單獨的一個硬盤或者磁盤上。控制文件是相互鏡像的,所以只需複製一個控制文件便可。cp /u02/oradata/db01/*.dbf /u01/app/oracle/bakcp /u02/oradata/db01/*.ctl /u01/app/oracle/bak<4>啓動例程打開數據庫。SQL> conn / as sysdba; Connected to an idle instance. SQL> startup ORACLE instance started.Total System Global Area 285212672 bytes Fixed Size 1218992 bytes Variable Size 83887696 bytes Database Buffers 197132288 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL>
SQL> alter database open;Database altered.<5>將數據庫設置成自動歸檔,使用如下命令:SQL> alter system set log_archive_start=true scope=spfile;System altered.<6>肯定數據庫處於歸檔模式下,而且設置自動存檔:SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 1 Next log sequence to archive 2 Current log sequence 2上面的Archive destination所定義的具體位置,能夠查看$ORACLE_HOME/dbs/spfile<dbname>.ora文件中的db_recovery_file_dest參數的值。
SQL> select file_name from dba_data_files where tablespace_name='USERS';FILE_NAME -------------------------------------------------------------------------------- /u02/oradata/db01/users01.dbf<2>設置表空間爲備份模式,在複製表空間的數據文件以前必須將表空間設置成爲備份模式:SQL> alter tablespace users begin backup;Tablespace altered.<3>複製users數據文件到備份目錄:[oracle@server1 bak]$ cp /u02/oradata/db01/users01.dbf /bak<4>複製後表空間就不須要設置成爲備份模式了,所以能夠將其返回正常模式:SQL> alter tablespace users end backup;Tablespace altered.
SQL> select file_name from dba_data_files where tablespace_name='USERS';FILE_NAME -------------------------------------------------------------------------------- /u02/oradata/db01/users01.dbf<2>設置表空間爲脫機狀態,將表空間設置爲脫機狀態後用戶將不能訪問該表空間上的任何對象,所以也能夠確保OFFLINE的表空間的數據文件不會發生改變。SQL> alter tablespace users offline;Tablespace altered.SQL> select tablespace_name,online_status from dba_data_files;TABLESPACE_NAME ONLINE_ ------------------------------ ------- USERS OFFLINE SYSAUX ONLINE UNDOTBS1 ONLINE SYSTEM SYSTEM<3>複製users數據文件到備份目錄:[oracle@server1 bak]$ cp /u02/oradata/db01/users01.dbf /bak<4>複製完後將表空間置於online狀態:SQL> alter tablespace users online;Tablespace altered.SQL> select tablespace_name,online_status from dba_data_files;TABLESPACE_NAME ONLINE_ ------------------------------ ------- USERS ONLINE SYSAUX ONLINE UNDOTBS1 ONLINE SYSTEM SYSTEM