這篇文章主要介紹了rman恢復方案和oracle異機恢復,須要的朋友能夠參考下
注:
①恢復的前提是已經作好備份
②徹底恢復數據庫是數據庫遇到故障,在恢復時候沒有丟失任何已經提交事物數據的恢復
不徹底恢復數據庫是數據庫遇到故障,在恢復時候丟失部分數據的恢復
③在linux下須要設置環境變量,即須要恢復的oracle數據庫的實例名:export ORACLE_SID=orcl
④當用resetlogs啓動數據庫時,應該要對數據庫進行一次全備份
1、恢復方案
一、丟失數據文件,進行徹底恢復
複製代碼 代碼以下:
RMAN>startup mount;
RMAN>restore database;
RMAN>recover database;
RMAn>sql 'alter database open';
二、丟失重作日誌文件,進行不徹底恢復
複製代碼 代碼以下:
SQL>startup mount;
SQL>recover database until cancel;
SQL>alter database open resetlogs;
三、丟失數據文件、控制文件和重作日誌文件,進行不徹底恢復
複製代碼 代碼以下:
RMAN>startup nomount;
RMAN>restore controfile from autobackup;
RMAN>alter database mount;
RMAN>restore database;
SQL>recover database using backup controlfile until cancel;
SQL>alter database open resetlogs;
四、丟失初始化文件、控制文件數據文件和重作日誌文件,進行不徹底恢復
複製代碼 代碼以下:
SQL>startup nomount pfile='D:\oracle\product\10.2.0\db_1\admin\orcl\pfile\init.ora.27201414210'; #pfile的路徑
RMAN>restore spfile from autobackup;
SQL>shutdown immediate;
SQL>startup nomount;
RMAN>restore controlfile from autobackup;
RMAN>alter database mount;
RMAN>restore database;
SQL>recover database using backup controlfile until cancel;
SQL>alter database open resetlogs;
五、基於時間點的恢復(經常使用)
複製代碼 代碼以下:
RMAN>startup mount;
RMAN>restore database;
RMAN>sql 'alter session set nls_date_format="yyyymmdd hh24:mi:ss"'; #設置顯示時間格式
RMAN>recover database until time '20140312 17:07:00'; #把數據庫恢復到2014-03-12 17:07:00這一時間點上
RMAN>sql 'alter database open resetlogs';
六、基於SCN的恢復
複製代碼 代碼以下:
RMAN>startup mount;
RMAN>restore database;
RMAN>recover database until scn 963915;
RMAN>sql 'alter database open resetlogs';
①查詢當前SCN號:
複製代碼 代碼以下:
SQL>select dbms_flashback.get_system_change_number from dual;
②根據SCN號查詢時間:
複製代碼 代碼以下:
SQL>select to_char(scn_to_timestamp(963959),'yyyymmdd hh24:mi:si') from dual;
③根據時間查詢SCN號:
複製代碼 代碼以下:
SQL>select timestamp_to_scn(to_date('20140309 17:55:10','yyyymmdd hh24:mi:ss')) from dual;
④查詢一段時間內的SCN號:
複製代碼 代碼以下:
SQL>select * from (select time_dp,scn from smon_scn_time order by time_dp desc) where rownum<20;
七、深刻理解incarnation:就是能夠跨越resetlogs進行數據恢復
①每一次resetlogs就會使incarnation + 1;若是想要恢復到以前incarnation的scn,就須要先恢復到以前的incarnation;
②Incarnation 11 and 12都包括scn 900000 的spot,因此當incarnation 12 作 until scn的時候,是恢復到當前incarcation 的 scn;可是根據咱們的須要,咱們須要的是incarnation 11的scn 900000;因此就須要切換incarnation到incarnation 11,才能找回咱們須要的數據。
RMAN>reset database to incarnation 11;
八、recover database的四條語句區別
① SQL>recover database using backup controlfile
若是丟失當前控制文件,用冷備份的控制文件恢復的時候,用來告訴oracle,不要以controlfile中的scn做爲恢復的終點。
②SQL>recover database until cancel
若是丟失current/active redo的時候,手動指定終點。
③SQL>recover database using backup controlfile until cancel;
若是丟失當前controlfile而且current/active redo都丟失,會先去自動應用歸檔日誌,能夠實現最大的恢復;
④SQL>recover database until cancel using backup controlfile;
若是丟失當前controlfile而且current/active redo都丟失,以舊的redo中的scn爲恢復終點,由於沒有應用歸檔日誌,全部會丟失數據。
要理解recover database using backup controlfile,先理解 recover database;在普通的recover database 或者 recover tablespace, recover datafile時, Oracle會以當前controlfile所紀錄的SCN爲準,利用archive log和 redo log的redo entry, 把相關的datafile 的 block恢復到「當前controlfile所紀錄的SCN」;而某些狀況下,Oracle須要把數據恢復到比當前controlfile所紀錄的SCN還要靠後的位置(好比說,control file是backup controlfile , 或者 controlfile是根據trace create的。),這時候,就須要用using backup controlfile. 恢復就不會受「當前controlfile所記錄的SCN」的限制。這時候的限制就來自於你的語句(until time , until scn),或者可用的archive log(until cancel) 。若是控制文件丟失,restore備份的控制文件後,則必須使用using backup controlfile選項。而until cancel則是不徹底恢復,即current/active redo丟失,或者從restore數據庫後某個歸檔文件缺失,則終止。
結論:
若是有舊的數據庫備份,在歸檔日誌和在線日誌所有保存無缺的狀況下,使用recover database或recover database using backup controlfile,則不丟失數據
若是存在備份數據文件restore後,歸檔日誌或者在線日誌(active、current)丟失狀況下,使用recover database using backup controlfile until cancel,則能夠實現最大恢復。
2、RMAN異機恢復(源數據庫和目標數據庫的實例名要一致)
一、對源數據庫進行備份
複製代碼 代碼以下:
RMAN>backup database plus archivelog;
RMAN>backup current controlfile;
二、生成源數據庫的參數文件,修改後傳至目標數據庫
三、在windows平臺下進行恢復
複製代碼 代碼以下:
C:\>oradim -new -sid orcl #建立一個orcl服務
C:\>set ORACLE_SID=orcl
C:\>sqlplus "/as sysdba";
SQL>startup nomount pfile='C:\INITorcl.ORA';
SQL> create spfile from pfile='C:\INITorcl.ORA';
SQL> shutdown immediate;
SQL>exit;
C:\>set ORACLE_SID=orcl
C:\>rman target/
RMAN>startup nomount;
RMAN>restore controlfile to '目標數據庫控制文件放置的位置及名稱' from '備份控制文件放置的位置';
RMAN>alter database mount;
RMAN>catalog start with '備份集放置的位置'; #向控制文件中添加備份集
RMAN>crosscheck backup;
RMAN>report schema;
編寫下邊腳本並運行
複製代碼 代碼以下:
run
{
set newname for datafile 1
to 'C:\oracle\product\10.2.0\oradata\orcl\SYSTEM.DBF'; #實例中SYSTEM.DBF放置的位置
set newname for datafile 2
to 'C:\oracle\product\10.2.0\oradata\orcl\UNDOTBS1.DBF';
set newname for datafile 3
to 'C:\oracle\product\10.2.0\oradata\orcl\SYSAUX.DBF';
set newname for datafile 4
to 'C:\oracle\product\10.2.0\oradata\orcl\USERS.DBF';
set newname for datafile 5
to 'C:\oracle\product\10.2.0\oradata\orcl\BANK_DATA02.DBF';
restore database;
switch datafile all;
}
RMAN>recover database;
RMAN>sql 'alter database open resetlogs';
恢復成功linux