--====================
-- RMAN 還原與恢復
--====================
?
??? 在 Oracle 中,三大文件即控制文件,數(shù)據(jù)文件,日志文件的丟失與破壞都將需要使用還原或恢復來使數(shù)據(jù)庫正常化。而 RMAN 還原與恢復
是實現(xiàn)數(shù)據(jù)庫完整性、可靠性必不可少的手段之一。還原簡言之即是將所需的文件從備份中復制到原來文件所在的路徑。還原通常可以包括
數(shù)據(jù)庫、表空間、數(shù)據(jù)文件級別的還原。通常還原后的內容會滯后于最新的數(shù)據(jù)庫 SCN ,因此將歸檔日志、聯(lián)機重做日志文件中的內容更新到
還原的數(shù)據(jù)文件中,這個過程稱之為恢復。
?
??? 恢復的幾種情形
??????? 1. 在 mount 或 open 階段完成的災難恢復
??????????? 非系統(tǒng)表空間, undo 表空間,所有的數(shù)據(jù)文件
??????? 2. 在 nomount 階段完成的災難恢復
??????????? 控制文件 (controlfile)
??????? 3. 在 mount 階段完成的災難恢復
??????????? 系統(tǒng)表空間,聯(lián)機重做日志文件
???
??? 有關恢復、介質恢復、一致性或非一致性恢復的詳細概念請參考: Oracle 基于用戶管理恢復的處理
???
一、 RMAN 在歸檔模式下的還原與恢復的簡化例子
??? RMAN > connect target /
??? RMAN > startup mount ;
??? RMAN > restore database ;
??? RMAN > recover database ;
??? RMAN > alter database open ;
?
二、使用 RMAN 進行還原與恢復 ( 非 catalog 方式 ) ??
?
??? 1. 數(shù)據(jù)文件丟失的恢復處理
??????? -- 設定客戶端環(huán)境變量并連接到數(shù)據(jù)庫
??????????? C : / > set NLS_LANG = AMERICAN_AMERICA . AL32UTF8
?
??????????? C : / > rman target sys / redhat@dedicated nocatalog
???????
??????? -- 對數(shù)據(jù)庫做全備
??????????? RMAN > backup as backupset ????????????????
??????????? 2 > format ? '/u01/bk/rmbk/wb_%U'
??????????? 3 > tag = Whole_bak database ;
?
??????????? RMAN > sql ? 'alter system archive log current' ;
???????????
??????? -- 對數(shù)據(jù)庫做級增量備份
??????????? RMAN > run{ ?????????????????????????????????
??????????? 2 > allocate channel ch1 type disk ;
??????????? 3 > backup incremental level 0 database
??????????? 4 > format '/u01/bk/rmbk/Inc_0_%U'
??????????? 5 > tag = Inc_0 ;
??????????? 6 > release channel ch1 ;}
?
??????? -- 對表插入新記錄并切換日志
??????????? SQL > select * from tb2 ;
?
??????????????????? ID NAME
??????????? ---------- ---------------------------------------------
??????????????????? ? 1 Robinson
??????????????????? ? 2 Henry
?
??????????? SQL > insert into tb2 select 3 , 'Danny' from dual ;
?
??????????? SQL > commit ;
?
??????????? SQL > alter system checkpoint ;
?
??????????? SQL > alter system switch logfile ;
???????????
??????? -- 對數(shù)據(jù)庫做級增量備份
??????????? RMAN > run{ ?????????????????????????????
??????????? 2 > ? allocate channel ch1 type disk ;
??????????? 3 > ? backup incremental level 1 database
??????????? 4 > ? format '/u01/bk/rmbk/Inc_1%U'
??????????? 5 > ? tag = Inc_1 ;
??????????? 6 > ? release channel ch1 ;}
?
??????????? SQL > shutdown immediate ; ?? -- 關閉數(shù)據(jù)庫
?
??????????? SQL > ho rm $ORACLE_BASE / oradata / orcl /*.dbf ? -- 刪除所有的數(shù)據(jù)文件 */
?
??????????? SQL > startup mount
?
??????? -- 使用 RMAN 連接到未 mount 狀態(tài)的數(shù)據(jù)庫
??????????? RMAN > connect target sys / redhat@dedicated
?
??????????? connected to target database : ORCL ( DBID = 1257415066 , not open )
?
??????? -- 執(zhí)行數(shù)據(jù)庫還原
??????? -- 注意當存在完整備份也同時存在級增量備份時, Oracle 會自動使用級增量備份來還原數(shù)據(jù)庫
??????????? RMAN > restore database ; ?
??????????? piece handle =/ u01 / bk / rmbk / Inc_0_0alqu132_1_1 tag = INC_0 ?? -- 下面可以看出還原的數(shù)據(jù)來自級增量備份
?
??????? -- 執(zhí)行數(shù)據(jù)庫恢復
??????????? RMAN > recover database ;
??????????? piece handle =/ u01 / bk / rmbk / Inc_10clqu1fe_1_1 tag = INC_1
?
??????? -- 打開數(shù)據(jù)庫驗證恢復
??????????? RMAN > alter database open ;
?
??????????? SQL > select * from bk . tb2 ;
?
??????????????????? ID NAME
??????????? ---------- ---------------------------------------------
??????????????????? ? 1 Robinson
??????????????????? ? 2 Henry
??????????????????? ? 3 Danny
???
??? 2. 磁盤損壞導致數(shù)據(jù)文件無法恢復到原始位置或不想恢復到原始位置的處理
??????? 使用 set newname 命令將數(shù)據(jù)文件還原到新路徑
??????????? set newname for datafile 1 to '<newdir>/system01.dbf' ; -- 為恢復的數(shù)據(jù)文件指定新路徑或重命名
??????? 使用 switch 命令將變更更新到控制文件
??????????? switch datafile n | all ; ????? -- 等同于 alter database rename file 命令,該命令將恢復的數(shù)據(jù)文件重命名更新到控制文件
???????
??????? -- 下面的示例首先刪除 tbs01.dbf ,接下來將其恢復到 oradata 目錄中
???????
??????????? SQL > ho rm $ORACLE_BASE / oradata / orcl / tbs01 . dbf
?
??????????? SQL > startup mount force ;
?
??????????? RMAN > connect target sys / redhat@dedicated
?
??????????? connected to target database : ORCL ( DBID = 1257415066 , not open )
?
??????????? RMAN > run{
??????????? 2 > set newname for datafile 6 to '/u01/app/oracle/oradata/tbs01.dbf' ;
??????????? 3 > restore database ;
??????????? 4 > switch datafile all;
??????????? 5 > recover database ;
??????????? 6 > alter database open ;}
?
??????????? SQL > select file# , name , status from v$datafile where file# = 6 ;
?
??????????????? ? FILE# NAME ??????????????????????????????? ??????????????? STATUS
??????????? ---------- -------------------------------------------------- -------
??????????????????? ? 6 / u01 / app / oracle / oradata / tbs01 . dbf ????????????????? ONLINE
??????????????????? ?
??????????? SQL > select count ( 1 ) from bk . tb2 ; ? -- 表 tb2 位于 tbs01.dbf 內
?
??????????? ? COUNT ( 1 )
??????????? ----------
??????????????????? ? 3
?
??? 3. 恢復表空間
???????
??????? -- 刪除表空間內的數(shù)據(jù)文件,刪除后在針對位于該表空間的表進行插入記錄以及實施檢查點進程
??????????? SQL > ho rm $ORACLE_BASE / oradata / tbs01 . dbf
?
??????????? SQL > insert into bk . tb2 select 4 , 'Jackson' from dual ;
?
??????????? SQL > commit ;
?
??????????? SQL > alter system checkpoint ;
???????
??????? -- 強制檢查點后,告警日志出現(xiàn)錯誤提示,視圖 v$recover_file 給出了故障數(shù)據(jù)文件
??????????? [oracle@oradb ~]$ tail - n 50 $ORACLE_BASE / admin / orcl / bdump / alert_orcl . log
??????????? Errors in file / u01 / app / oracle / admin / orcl / bdump / orcl_ckpt_4724 . trc :
??????????? ORA - 01110 : data file 6 : '/u01/app/oracle/oradata/tbs01.dbf'
??????????? ORA - 01116 : error in opening database file 6
??????????? ORA - 01110 : data file 6 : '/u01/app/oracle/oradata/tbs01.dbf'
??????????? ORA - 27041 : unable to open file
??????????? Linux Error : 2 : No such file or directory
???????????
??????????? SQL > select * from v$recover_file ;
?
??????????????? ? FILE# ONLINE ? ONLINE_ ERROR ???????????????? CHANGE# TIME
??????????? ---------- ------- ------- ------------------ ---------- ---------
??????????????????? ? 6 OFFLINE OFFLINE FILE NOT FOUND ????????????? 0
?
??????????? SQL > select name , status from v$datafile where file# = 6 ;
?
??????????? NAME ????????? ????????????????????????????????????? STATUS
??????????? -------------------------------------------------- -------
??????????? / u01 / app / oracle / oradata / tbs01 . dbf ????????????????? RECOVER
???????
??????? -- 使用 RMAN 命令恢復數(shù)據(jù)文件,此時數(shù)據(jù)庫處于 OPEN 狀態(tài),因此首先需要將表空間脫機,恢復完成之后再將其聯(lián)機
??????????? RMAN > run{
??????????? 2 > sql 'alter tablespace tbs1 offline immediate' ;
??????????? 3 > set newname for datafile 6 to '/u01/app/oracle/oradata/orcl/tbs01.dbf' ;
??????????? 4 > restore tablespace tbs1 ;
??????????? 5 > switch datafile all;
??????????? 6 > recover tablespace tbs1 ;
??????????? 7 > sql 'alter tablespace tbs1 online' ;}
?
??????????? SQL > select name , status from v$datafile where file# = 6 ; ? -- 位置變動到 orcl 子目錄下,狀態(tài)變?yōu)? online
?
??????????? NAME ?????????????????????????????????????????????? STATUS
??????????? -------------------------------------------------- -------
??????????? / u01 / app / oracle / oradata / orcl / tbs01 . dbf ???????????? ONLINE
?
??????? -- 也可以使用下面的命令完成同樣的功能
??????? -- 注意如果表空間內有多個數(shù)據(jù)文件,而僅有單個數(shù)據(jù)文件損壞則采用下面的方式處理更為妥當
??????????? RMAN > run{
??????????? 2 > sql 'alter database datafile 6 offline immediate' ;
??????????? 3 > set newname for datafile 6 to '/u01/app/oracle/oradata/tbs01.dbf' ;
??????????? 4 > restore datafile 6 ;
??????????? 5 > switch datafile all;
??????????? 6 > recover datafile 6 ;
??????????? 7 > sql 'alter databaes datafile 6 online' ;}
?
??? 4.RMAN 實現(xiàn)不完全恢復
??????? 對于 RMAN 的不完全恢復,使用 Oracle 的閃回特性的處理有更多的優(yōu)勢。關于閃回請參考: Oracle 閃回特性
??????? 步驟
??????????? a . 加載數(shù)據(jù)到 mount 狀態(tài) ( 建議恢復前先做備份 )
??????????? b . 為高并發(fā)分配多個通道
??????????? c . 還原所有 ( 所需 ) 的數(shù)據(jù)文件
??????????? d. 使用 until time,until sequence,until scn 來恢復數(shù)據(jù)庫
??????????? e. 使用 resetlogs 打開數(shù)據(jù)庫
??????????? f . 全備數(shù)據(jù)庫
???????
??????? 演示 RMAN 基于 until time 的例子
??????????? SQL > show user ;
??????????? USER is "BK"
??????????? SQL > create table tb1 ( id int , name varchar2 ( 10 ));
?
??????????? SQL > insert into tb1 select 1 , 'Lancy' from dual ;
?
??????????? SQL > ho strings $ORACLE_BASE / oradata / orcl / redo02 . log | grep Lancy ? -- 查看聯(lián)機日志文件中不存在剛剛插入的記錄
?
??????????? SQL > commit ; ?????????????????????????????????????????????????????? -- 注意 commit 是將日志緩沖內容寫入到日志文件
?
??????????? SQL > ho strings $ORACLE_BASE / oradata / orcl / redo02 . log | grep Lancy ? -- 提交后聯(lián)機日志文件中才有新增的記錄
??????????? Lancy
?
??????????? SQL > alter system switch logfile ;
?
??????????? SQL > ho ls $ORACLE_BASE / oradata / arch
??????????? log_1_1_732989230 . arc ? log_1_1_732989889 . arc
?
??????????? RMAN > run{
??????????? 2 > allocate channel ch1 type disk ;
??????????? 3 > allocate channel ch2 type disk ;
??????????? 4 > backup as compressed backupset database plus archivelog delete input
??????????? 5 > format '/u01/bk/rmbk/wh_lg_%U'
??????????? 6 > tag = 'Wholebak_Pluslog' ;
??????????? 7 > release channel ch1 ;
??????????? 8 > release channel ch2 ;}
?
??????????? 18 : 10 : 36 SQL > drop table tb1 ;
?
??????????? RMAN > run{
??????????? 2 > allocate channel ch1 type disk ;
??????????? 3 > allocate channel ch2 type disk ;
??????????? 4 > set until time "to_date('2010-10-21 18:10:36','yyyy-mm-dd hh24:mi:ss')" ;
??????????? 5 > restore database ;
??????????? 6 > recover database ;
??????????? 7 > alter database open resetlogs ;
??????????? 8 > release channel ch1 ;
??????????? 9 > release channel ch2 ;}
?
??????????? SQL > select * from tb1 ;
?
??????????????????? ID NAME
??????????? ---------- ----------
??????????????????? ? 1 Lancy
?
??? 5. SPFILE 文件丟失的恢復
??????? SPFILE 參數(shù)文件可以在 RMAN 中進行備份,因此可以使用 RMAN 來恢復 SPFILE 文件。可以自動備份 SPFILE 。
??????? SPFILE 的自動備份是隨著控制文件的備份一起被完成的,因此可以通過自動備份控制文件來實現(xiàn)自動備份 SPFILE 文件的目的
??????? 其次,在備份系統(tǒng)表空間時將引發(fā)控制文件的自動備份,而不論是否設置自動備份參數(shù)為 ON ,此時同樣也備份 SPFILE 文件
???????
???????
??????? 有關 SPFILE 文件請參考: Oracle 參數(shù)文件
??????????????????????? ? ?? ? SPFILE 錯誤導致數(shù)據(jù)庫無法啟動(ORA-01565)
???????
??????? SPFILE 文件恢復步驟
??????????? a. startup nomount [force];
??????????? b. set dbid=dbid_no;
??????????? c. restore spfile from autobackup | '<dir>'
??????????? d. startup force; ?? 如果 d 執(zhí)行失敗則轉到 e , f ,否則不用執(zhí)行 e , f 。
??????????? e. set dbid=dbid_no;
??????????? f. startup;
???????
??????? 下面設定控制文件的自動備份以及設置其備份路徑 ( 注意要預先知道目標數(shù)據(jù)庫的 DBID ,此次演示的 DBID 為 )
???????
??????????? RMAN > configure controlfile autobackup on ;
??????????? RMAN > configure controlfile autobackup format for device type disk to '/u01/bk/rmbk/auto_ctl_%d_%F' ;
???????????
??????????? RMAN > exit
??????????? sys@ORCL > alter tablespace users add datafile '$ORACLE_BASE/oradata/orcl/users02.dbf' size 5m ;
??????????? [oracle@oradb rmbk]$ ls auto * ????? -- 執(zhí)行上一條 alter tablespace users add datafile 語句將引發(fā)控制文件的自動備份
??????????? auto_ctl_ORCL_c - 1263182651 - 20101124 - 00
??????????? sys@ORCL > shutdown immediate ;
???????????
??????????? [oracle@oradb dbs]$ mv spfileorcl . ora spfileorcl . ora . bak ?? -- 將原來的 spfile 文件重命名
???????????
??????????? [oracle@oradb ~]$ rman target / nocatalog
??????????? RMAN > startup nomount force ;
??????????? RMAN > set dbid = 1263182651 ;
??????????? RMAN > restore spfile from autobackup ; ?? -- 此處并沒有找到文件路徑,按 Oracle 聯(lián)機文檔,在 nomount 狀態(tài)應該可以找到
??????????? RMAN - 06172 : no autobackup found or specified handle is not a valid copy or piece
??????????? RMAN > restore spfile from '/u01/bk/rmbk/auto_ctl_ORCL_c-1263182651-20101124-00' ; ??? -- 手動指定路徑
??????????? RMAN > startup force ;
???
??? 6. 聯(lián)機重做日志文件丟失的恢復請參考:
??????? 基于 catalog 的 RMAN 備份與恢復
??????? Oracle 聯(lián)機重做日志文件(ONLINE LOG FILE)
???
??? 7. 控制文件的恢復處理
??????? 控制文件中描述了數(shù)據(jù)庫的相關物理信息,如創(chuàng)建時間、 DBID 、數(shù)據(jù)文件、日志文件等相關信息,因此一旦控制文件丟失數(shù)據(jù)庫將
??? 不能啟動,鑒于其重要性,控制文件的備份與恢復將單獨列出。有關控制文件請參考下列
??????? 基于 catalog 的 RMAN 備份與恢復
??????? Oracle 控制文件的備份與恢復
???
三、更多參考 ???
有關基于用戶管理的備份和備份恢復的概念請參考:
??????? Oracle 冷備份
??????? Oracle 熱備份
??????? Oracle 備份恢復概念
??????? Oracle 實例恢復
??????? Oracle 基于用戶管理恢復的處理 ( 詳細描述了介質恢復及其處理 )
???????
??? 有關 RMAN 的恢復與管理請參考:
??????? RMAN 概述及其體系結構
??????? RMAN 配置、監(jiān)控與管理
??????? RMAN 備份詳解
??????? RMAN 還原與恢復
???????
??? 有關 Oracle 體系結構請參考:
??????? Oracle 實例和Oracle 數(shù)據(jù)庫(Oracle 體系結構)
??????? Oracle 表空間與數(shù)據(jù)文件
??????? Oracle 密碼文件
??????? Oracle 參數(shù)文件
??????? Oracle 聯(lián)機重做日志文件(ONLINE LOG FILE)
??????? Oracle 控制文件(CONTROLFILE)
??????? Oracle 歸檔日志
?
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
