Oracle常規恢復的實驗測試
*********************************** 用戶管理恢復
</strong></span>
************************************
一、Oracle恢復的體系結構二、恢復類型:實例恢復、介質恢復
1、實例恢復的前提是數據文件、控制文件和在線日志均沒有損壞,完全自動
2、介質恢復:在文件有物理損壞的情況下,將其還原、恢復、最后使數據庫得以正常打開的操作稱為介質恢復,人工干預
三、恢復方式:完全恢復、不完全恢復
四、恢復技術:用戶管理恢復和RMAN恢復
五、完全恢復案例
v$recover_file //哪個文件需要恢復 select file#,change# from v$recover_file;
v$log //在線日志 select min(first_change#) from v$log where status!='INACTIVE';
v$archived_log //歸檔日志 select min(first_change#) from v$archived_log;
v$recovery_log //需要哪些archvielog做恢復
1、場景1:數據庫關閉時的恢復(system,sysaux,undo,whole database):system表空間為例(冷備)
select from v$dbfile;
shutdown immediate;
cp -rf /u01/app/oracle/oradata/ocp/ /backup/cold --冷備整個數據文件
startup
conn gyj/gyj
insert into t1 values(4,'gyj4');
commit;
alter system switch logfile; --切換日志
rm -rf system01.dbf --冊除system系統表空間
shutdown abort; --異常關機
cp /backup/cold/system01.dbf /u01/app/oracle/oradata/ocp/ --用備份先做還原
startup; --會報錯:ORA-01157,ORA-01110
recover datafile 1; --恢復
一直回車
alter database open;
2、場景2:數據庫打開時的恢復以用戶數據的表空間為例(熱備)
create tablespace tp5 datafile '/u01/app/oracle/oradata/ocp/tp5.dbf' size 10M;
conn gyj/gyj
create table t5 (id int,name varchar2(10)) tablespace tp5;
insert into t5 values(1,'gyj1');
commit;
alter tablespace tp5 begin backup; --熱備
!cp /u01/app/oracle/oradata/ocp/tp5.dbf /backup/hot
alter tablespace tp5 end backup;
conn gyj/gyj
insert into t5 values(2,'gyj2');
commit;
rm -rf tp5.dbf;
alter database datafile 9 offline;
!cp /backup/hot/tp5.dbf /u01/app/oracle/oradata/ocp/ --用備份先做還原
recover datafile 9; --恢復
alter database datafile 11 online;
3、控制文件的恢復
select controlfile_sequence# from v$database;--當前控件文件記錄的序列號
select hxfil as file#,FHCSQ from x$kcvfh;
select controlfile_change# from v$database; --控制自身的檢查點
select file#,checkpoint_change# from v$datafile_header;
select checkpoint_change# from v$database; --數據庫的檢查點
select file#,checkpoint_change# from v$datafile; --從控制文件中讀的scn
(1)場景1:控制文件沒有全壞,有一個是好的
rm -rf control02.ctl
shutdown abort;
cp control01.ctl control02.ctl
startup
(2)場景2:所有控制文件都壞了,但損壞前有備份(二進制)
alter database backup controlfile to '/backup/control/control.bin';
alter system checkpoint;
rm -rf control
shutdown abort;
cp /backup/control.bin control01.ctl
cp /backup/control.bin control02.ctl
cp /backup/control.bin control03.ctl
startup
select checkpoint_change# from v$database;
select checkpoint_change# from v$datafile;
select checkpoint_change# from v$datafile_header;
recover database using backup controlfile;
redologfile 一個個試
alter database open resetlogs;
(3)**場景3:所有控制文件都壞了,但損壞前有備份(文本)
alter database backup controlfile to trace as '/backup/control/control.txt';
rm -rf control
shutdown abort;
vi control.bak --重構一個新的控制文件
conn /as sysdba
@/backup/control/control.txt
recover database;
alter database open;
(4) **場景4:備份控制文件的恢復,控制文件中不包含數據文件,但聯機日志中有
alter database backup controlfile to '/backup/control/control.bin';
create tablespace tp6 datafile '/u01/app/oracle/oradata/ocp/tp6.dbf' size 10M;
conn gyj/gyj
create table t6(id int,name varchar2(10)) tablespace tp6;
insert into t6 values(1,'gyj1');
commit;
rm -rf control
shutdown abort;
cp /backup/control/control.bin control01.ctl
cp /backup/control/control.bin control02.ctl
cp /backup/control/control.bin control03.ctl
startup mount;
select file#,checkpoint_change# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;
alter database open; //提示控制文件舊了
recover database using backup controlfile;
輸入:/oradata/orcl/redo01.log --狀態是current
提示有一個文件不識別
select file#,name from v$datafile;
alter database rename file '/u01/app/oracle/product/11g/dbs/UNNAMED00005' to '/u01/app/oracle/oradata/ocp/tp6.dbf';
--看上面提示或 看alert.log日志
recover database using backup controlfile;
輸入:/oradata/orcl/redo01.log --一select from v$log;
alter database open resetlogs;
二、不完全恢復案例
1、不完全恢復的動因
(1)被動恢復:原計劃執行完全恢復,但是恢復的過程中發現recover命令需要的至少一個歸檔日志或未歸檔的ACTIVE/CURRENT在線日志損壞
(2)主動恢復:由于人為錯誤碼或惡意篡改破壞了數據庫內大量的信息(update,truncate)
2、不完全恢復:recover命令的四種情況
(1)精確到重做日志的基于日志序列號的“recover database until sequence”--僅適用RMAN
(2)精確到到重做日志的基于手動交互式的“recover database until cancel”--僅適用SQLPLUS
(3)精確到重做記錄的基于時間的 “recover database until time”--適用RMAN和SQLPLUS
(4)精確到重做記錄的基于SCN的“recover database until scn”--僅適用RMAN
3、基本時間的不完全恢復
(1)場景1:誤操作刪除表,控制文件沒損壞
shutdown immediate;
!cp /u01/app/oracle/oradata/ocp/ /backup/cold/ --做一個冷備
startup
conn gyj/gyj
insert into t1 values(3,'gyj3');
commit;
select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual;--恢復此時間之前的數據
insert into t1 values(4,'gyj4');
commit;
drop table t1; --模擬誤操作
shutdown immediate;
rm -rf /u01/app/oracle/oradata/ocp/.dbf --刪除所有數據(不刪控制文件和重做日志文件)
cp -rf /backup/cold/.dbf /u01/app/oracle/oradata/ocp/ --restore所有數據
startup mount;
recover database until time '2013-03-29 09:49:05'; ---基于時間的不完全恢復
alter database open resetlogs;
(2) *場景1:誤操作刪除表,控制文件也被損壞了
shutdown immediate;
!cp /u01/app/oracle/oradata/ocp/ /backup/cold/ --做一個冷備
startup
conn gyj/gyj
insert into t1 values(6,'gyj6');
commit;
select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual;--誤操作前的時間
2012-06-22:17:09:08
insert into t1 values(7,'gyj7');
commit;
drop table t1; --模擬誤操作
shutdown abort;
rm -rf /u01/app/oracle/oradata/ocp/.dbf --刪除數據文件
rm -rf /u01/app/oracle/oradata/ocp/.ctl --刪除控制文件,(不刪除重做日志文件)
cp -rf /backup/cold/.dbf /u01/app/oracle/oradata/ocp/ --還原所有數據
cp -rf /backup/cold/.ctl /u01/app/oracle/oradata/ocp/ --還原控制文件
startup mount;
recover database until time '2012-10-31:11:47:15' using backup controlfile; --用了備份的控制文件
alter database open resetlogs;
4、基本Cancel的不完全恢復
(1)**場景1:寫到數據文件,歸檔沒保留
shutdown immediate;
!cp -rf /u01/app/oracle/oradata/ocp/ /backup/cold/ --重生做一個冷備
startup
conn gyj/gyj
insert into t1 values(4,'gyj4');
commit;
alter system switch logfile;
insert into t1 values(5,'gyj5');
commit;
select group#,status from v$log;
alter system checkpoint; --寫到數據文件,歸檔沒保留
rm -rf /u01/app/oracle/oradata/ocp/ --把所有的/oradata/orcl/ 全部刪掉
shutdown abort;
cp /backup/cold/.dbf /u01/app/oracle/oradata/ocp/ --controlfile,redolog都沒了
cp /backup/cold/.ctl /u01/app/oracle/oradata/ocp/
startup mount;
; recover database using backup controlfile until cancel; --用了備份的控制文件
--如歸檔存在,直接回車
--如歸檔不存在,輸入cancel,因為redolog全刪了
alter database open resetlogs;
alter tablespace temp add tempfile '/u01/app/oracle/oradata/bxdb/temp.dbf' size 10M;
select from t; --數據少了一條
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' REUSE;
****************************************
RMAN恢復
****************************************
1、RMAN完全恢復
(1)***場景1:參數文件損壞
backup spfile;
--create pfile='/tmp/pfile.ora' from spfile;
shutdown immediate;
rm -rf $ORACLE_HOME/dbs/spfileocp.ora
startup pfile='/tmp/pfile.ora' nomount;
set dbid 43434343
restore spfile from autobackup;
restore spfile to '/temp/spfile.ora' from autobackup;
(2)***場景2:控制文件損壞
backup current controlfile;
rm -rf control*
startup nomount;
set dbid=2690543208;
restore controlfile from autobackup;--db_recovery_file_dest或$ORACLE_HOME/dbs(set dbid)
alter database mount;
recover database;
alter database open resetlogs;
(3) ***場景3 system表空間數據文件損壞
backup database;
rm -rf system01.dbf;
shutdown abort;
startup mount;
restore datafile 1;
recover datafile 1;
alter database open;
(4)***場景4 undo表空間損壞
startup mount;
restore tablespace UNDOTBS1;
recover database;
alter database open;
(5)***場景5:磁盤損壞
rm -rf tp1.dbf
select name,file# from v$datafile;
run{ shutdown abort;
startup mount;
set newname for datafile 6 to '/u01/app/oracle/oradata/ocm/tp1.dbf';
restore datafile 6;
switch datafile 6 ;
recover database;
alter database open;}
(6)***場景6:普通數據文件損壞
rm -rf tp1.dbf
方法一
run{
shutdown abort;
startup mount;
restore datafile 6;
recover datafile 6;
alter database open;}
方法二
run{
sql 'alter database datafile 6 offline';
restore datafile 6;
recover datafile 6;
sql 'alter database datafile 6 online';}
方法三
run{
shutdown abort;
startup mount;
sql 'alter database datafile 6 offline';
alter database open;
restore datafile 6;
recover datafile 6;
sql 'alter database datafile 6 online';}
(7)控制文件無損的情況下,只讀文件損壞
***場景1:只讀數據文件丟失
run{
shutdown abort;
startup mount;
restore datafile 5;
alter database open;}
***場景2:只讀數據文件在實例運行時丟失
run{
sql 'alter database datafile 5 offline';
restore datafile 5;
sql 'alter database datafile 5 online';}
***場景3:只讀數據文件內部數據塊損壞
run{
sql 'alter database datafile 5 offline';
restore datafile 5 force;
sql 'alter database datafile 5 online';}
***場景4:起先數據文件備份時是只讀狀態,后來其表空間改為讀寫狀態,但沒有備份,現數據文件壞了
run{
sql 'alter database datafile 6 offline';
restore datafile 6;
recover datafile 6;
sql 'alter database datafile 6 online';}
(8)控制文件損壞的情況下,只讀文件損壞
分析只讀表空間在控制文件的情況
alter database backup controlfile to trace as '/backup/control.bak01';
alter tablespace read only;
alter database backup controlfile to trace as '/backup/control.bak02';
diff control.bak01 control.bak02 --比較兩個備份的控制文件
alter database rename file '' to ''; --只讀表空間在重構時不考慮,要在數據庫打開后,重命名數據文件
alter database tp1 online;
***場景1:只讀數據文件連同控件文件一并損壞或丟失
run{
shutdown abort;
startup nomount;
restore controlfile from autobackup;
alter database mount;
restore datafile 6;
recover database;
alter database open resetlogs;}
***場景2:在數據文件為只讀狀態時,對該文件和控制文件進行了備份,隨且對該表空間改為讀寫狀態,但該文件和控制文件均未再有過備份,此時該數據文件連同控件文件一并損壞或丟失
run{
shutdown abort;
startup nomount;
restore controlfile from '/backup/rman/full_0cnnlmfd_1_1';
mount database;
restore datafile 6;
recover database;
recover database; --注意再次執行
alter database open resetlogs;}
二、RMAN不完全恢復
(1)***場景1:基本時間的不完全恢復
startup
conn gyj/gyj
insert into t1 values(6,'gyj6');
commit;
select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual;
insert into t1 values(9,'gyj9');
commit;
drop table t1; --誤操作
run{
shutdown abort;
startup mount;
set until time "to_date('2013-04-14:11:42:18','yyyy-mm-dd:hh24:mi:ss')";
restore database;
recover database;
alter database open resetlogs;}
(2)***場景2:基于sequence的不完全恢復
conn gyj/gyj
insert into t1 values(9,'gyj9');
commit;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
insert into t1 values(10,'gyj10');
commit;
alter system switch logfile;
alter system switch logfile;
insert into t1 values(11,'gyj11');
alter system switch logfile;
rman target /
run{
shutdown abort;
startup mount;
set until sequence 10 thread 1;
restore database;
recover database;
alter database open resetlogs;}
*******************************************
總結
*******************************************
一、關于recover database命令
(1)SQL>recover database;
該命令用來對所有數據文件進行恢復,并且只能使用保存在文件系統上的歸檔日志及在線日志。使用此命令的前提是控制文件不可以是還原或重建得來的。
Oracle會以當前controlfile所記錄的SCN為準,利用archive log和 redo log的redo entry, 把相關的datafile 的 block恢復到“當前controlfile所記錄的SCN”
(2)SQL>recover database using backup controlfile;
該命令用來對所有數據文件及控制文件進行恢復,并且只使用保存在文件系統上的歸檔及在線日志。
Oracle需要把數據恢復到比當前controlfile所記錄的SCN還要靠后的位置(比如說,control file是backup controlfile , 或者 controlfile是根據trace create的。),這時候,就需要用using backup controlfile. 恢復就不會受“當前controlfile所記錄的SCN”的限制。
(3)RMAN>recover database;
該命令用來對所有數據文件及控制文件進行恢復,并且可以使用增量備份、備份中的和文件系統上的歸檔日志,以及在線日志。
二、關于resetlogs命令
(1)用備份的控制文件做恢復必須要resetlogs,使用resetlogs的原因是recover命令只能修復控制文件中數據庫物理結構信息,而無法修改控制文件中的當前重做日志的序列號等信息
(2)不完全恢復的resetlogs
三、數據庫的化身--Incarnation
v$database_incarnation
RMAN>list incarnation
來自:http://blog.csdn.net/guoyjoe/article/details/8800924