RMAN 还原与恢复
為什么80%的碼農都做不了架構師?>>> ??
--====================
-- RMAN 還原與恢復
--====================
?
??? 在Oracle中,三大文件即控制文件,數據文件,日志文件的丟失與破壞都將需要使用還原或恢復來使數據庫正常化。而RMAN還原與恢復
是實現數據庫完整性、可靠性必不可少的手段之一。還原簡言之即是將所需的文件從備份中復制到原來文件所在的路徑。還原通常可以包括
數據庫、表空間、數據文件級別的還原。通常還原后的內容會滯后于最新的數據庫SCN,因此將歸檔日志、聯機重做日志文件中的內容更新到
還原的數據文件中,這個過程稱之為恢復。
?
??? 恢復的幾種情形
??????? 1.在mount 或open 階段完成的災難恢復
??????????? 非系統表空間,undo表空間,所有的數據文件
??????? 2.在nomount 階段完成的災難恢復
??????????? 控制文件(controlfile)
??????? 3.在mount 階段完成的災難恢復
??????????? 系統表空間,聯機重做日志文件
???
??? 有關恢復、介質恢復、一致性或非一致性恢復的詳細概念請參考:Oracle 基于用戶管理恢復的處理
???
一、RMAN在歸檔模式下的還原與恢復的簡化例子
??? RMAN> connect target /
??? RMAN> startup mount;
??? RMAN> restore database;
??? RMAN> recover database;
??? RMAN> alter database open;
?
二、使用RMAN進行還原與恢復(非catalog方式)??
?
??? 1.數據文件丟失的恢復處理
??????? --設定客戶端環境變量并連接到數據庫
??????????? C:/>set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
?
??????????? C:/>rman target sys/redhat@dedicated nocatalog
???????
??????? --對數據庫做全備
??????????? RMAN> backup as backupset????????????????
??????????? 2> format? '/u01/bk/rmbk/wb_%U'
??????????? 3> tag=Whole_bak database;
?
??????????? RMAN> sql? 'alter system archive log current';
???????????
??????? --對數據庫做級增量備份
??????????? 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;
???????????
??????? --對數據庫做級增量備份
??????????? 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;?? --關閉數據庫
?
??????????? SQL> ho rm $ORACLE_BASE/oradata/orcl/*.dbf? --刪除所有的數據文件 */
?
??????????? SQL> startup mount
?
??????? --使用RMAN連接到未mount狀態的數據庫
??????????? RMAN> connect target sys/redhat@dedicated
?
??????????? connected to target database: ORCL (DBID=1257415066, not open)
?
??????? --執行數據庫還原
??????? --注意當存在完整備份也同時存在級增量備份時,Oracle會自動使用級增量備份來還原數據庫
??????????? RMAN> restore database;?
??????????? piece handle=/u01/bk/rmbk/Inc_0_0alqu132_1_1 tag=INC_0?? --下面可以看出還原的數據來自級增量備份
?
??????? --執行數據庫恢復
??????????? RMAN> recover database;
??????????? piece handle=/u01/bk/rmbk/Inc_10clqu1fe_1_1 tag=INC_1
?
??????? --打開數據庫驗證恢復
??????????? RMAN> alter database open;
?
??????????? SQL> select * from bk.tb2;
?
??????????????????? ID NAME
??????????? ---------- ---------------------------------------------
??????????????????? ?1 Robinson
??????????????????? ?2 Henry
??????????????????? ?3 Danny
???
??? 2.磁盤損壞導致數據文件無法恢復到原始位置或不想恢復到原始位置的處理
??????? 使用set newname 命令將數據文件還原到新路徑
??????????? set newname for datafile 1 to '<newdir>/system01.dbf'; --為恢復的數據文件指定新路徑或重命名
??????? 使用switch命令將變更更新到控制文件
??????????? switch datafile n | all ;????? --等同于alter database rename file命令,該命令將恢復的數據文件重命名更新到控制文件
???????
??????? --下面的示例首先刪除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.恢復表空間
???????
??????? --刪除表空間內的數據文件,刪除后在針對位于該表空間的表進行插入記錄以及實施檢查點進程
??????????? SQL> ho rm $ORACLE_BASE/oradata/tbs01.dbf
?
??????????? SQL> insert into bk.tb2 select 4,'Jackson' from dual;
?
??????????? SQL> commit;
?
??????????? SQL> alter system checkpoint;
???????
??????? --強制檢查點后,告警日志出現錯誤提示,視圖v$recover_file給出了故障數據文件
??????????? [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?????????????
?
??????????? SQL> select name,status from v$datafile where file#=6;
?
??????????? NAME????????? ?????????????????????????????????????STATUS
??????????? -------------------------------------------------- -------
??????????? /u01/app/oracle/oradata/tbs01.dbf????????????????? RECOVER
???????
??????? --使用RMAN命令恢復數據文件,此時數據庫處于OPEN狀態,因此首先需要將表空間脫機,恢復完成之后再將其聯機
??????????? 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子目錄下,狀態變為online
?
??????????? NAME?????????????????????????????????????????????? STATUS
??????????? -------------------------------------------------- -------
??????????? /u01/app/oracle/oradata/orcl/tbs01.dbf???????????? ONLINE
?
??????? --也可以使用下面的命令完成同樣的功能
??????? --注意如果表空間內有多個數據文件,而僅有單個數據文件損壞則采用下面的方式處理更為妥當
??????????? 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實現不完全恢復
??????? 對于RMAN的不完全恢復,使用Oracle的閃回特性的處理有更多的優勢。關于閃回請參考:Oracle 閃回特性
??????? 步驟
??????????? a.加載數據到mount狀態(建議恢復前先做備份)
??????????? b.為高并發分配多個通道
??????????? c.還原所有(所需)的數據文件
??????????? d.使用until time,until sequence,until scn來恢復數據庫
??????????? e.使用resetlogs打開數據庫
??????????? f.全備數據庫
???????
??????? 演示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? --查看聯機日志文件中不存在剛剛插入的記錄
?
??????????? SQL> commit;?????????????????????????????????????????????????????? --注意commit是將日志緩沖內容寫入到日志文件
?
??????????? SQL> ho strings $ORACLE_BASE/oradata/orcl/redo02.log | grep Lancy? --提交后聯機日志文件中才有新增的記錄
??????????? 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參數文件可以在RMAN中進行備份,因此可以使用RMAN來恢復SPFILE文件。可以自動備份SPFILE。
??????? SPFILE的自動備份是隨著控制文件的備份一起被完成的,因此可以通過自動備份控制文件來實現自動備份SPFILE文件的目的
??????? 其次,在備份系統表空間時將引發控制文件的自動備份,而不論是否設置自動備份參數為ON,此時同樣也備份SPFILE文件
???????
???????
??????? 有關SPFILE文件請參考:Oracle 參數文件
??????????????????????? ? ???SPFILE 錯誤導致數據庫無法啟動(ORA-01565)
???????
??????? SPFILE文件恢復步驟
??????????? a. startup nomount [force];
??????????? b. set dbid=dbid_no;
??????????? c. restore spfile from autobackup | '<dir>'
??????????? d. startup force;?? 如果d執行失敗則轉到e,f,否則不用執行e,f。
??????????? e. set dbid=dbid_no;
??????????? f. startup;
???????
??????? 下面設定控制文件的自動備份以及設置其備份路徑(注意要預先知道目標數據庫的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*????? --執行上一條alter tablespace users add datafile 語句將引發控制文件的自動備份
??????????? 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聯機文檔,在nomount狀態應該可以找到
??????????? 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.聯機重做日志文件丟失的恢復請參考:
??????? 基于catalog 的RMAN 備份與恢復
??????? Oracle 聯機重做日志文件(ONLINE LOG FILE)
???
??? 7.控制文件的恢復處理
??????? 控制文件中描述了數據庫的相關物理信息,如創建時間、DBID、數據文件、日志文件等相關信息,因此一旦控制文件丟失數據庫將
??? 不能啟動,鑒于其重要性,控制文件的備份與恢復將單獨列出。有關控制文件請參考下列
??????? 基于catalog 的RMAN 備份與恢復
??????? Oracle 控制文件的備份與恢復
???
三、更多參考???
有關基于用戶管理的備份和備份恢復的概念請參考:
??????? Oracle 冷備份
??????? Oracle 熱備份
??????? Oracle 備份恢復概念
??????? Oracle 實例恢復
??????? Oracle 基于用戶管理恢復的處理(詳細描述了介質恢復及其處理)
???????
??? 有關RMAN的恢復與管理請參考:
??????? RMAN 概述及其體系結構
??????? RMAN 配置、監控與管理
??????? RMAN 備份詳解
??????? RMAN 還原與恢復
???????
??? 有關Oracle體系結構請參考:
??????? Oracle實例和Oracle數據庫(Oracle體系結構)
??????? Oracle 表空間與數據文件
??????? Oracle 密碼文件
??????? Oracle 參數文件
Oracle 數據庫實例啟動關閉過程
??????? Oracle 聯機重做日志文件(ONLINE LOG FILE)
??????? Oracle 控制文件(CONTROLFILE)
??????? Oracle 歸檔日志
?
原文鏈接: http://blog.csdn.net/robinson_0612/article/details/6041247
轉載于:https://my.oschina.net/dtec/blog/47387
總結
以上是生活随笔為你收集整理的RMAN 还原与恢复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: as3:sprite作为容器使用时,最好
- 下一篇: “街坊”×××数字平台,昔日的思想,曾经