模拟数据库数据文件丢失的情况下,通过丢失之前的数据文件物理备份做恢复;
说明:数据文件丢失前一刻的所有归档日志都存在。
环境:oracle10g +rhel5
1.关闭数据库,copy system01.dbf、user01.dbf 到同目录的bak目录下备份
注意:这一步要注意一个细节
cp -p system01.dbf bak
------一定要带-p参数,这样文件的属性就一同拷贝过去了。否则该文件的owner 是root,你后面恢复时,因为owner 原因,oracle不认。
2.为了能观察整个备份恢复的效果,创建一个表
startup
create table t(id int ,scn number)tablespace users;
插入数据
insert into t values(1,dbms_flashback.get_system_change_number);
insert into t values(2,dbms_flashback.get_system_change_number);
insert into t values(3,dbms_flashback.get_system_change_number);
commit;
alter system switch logfile;
insert into t values(4,dbms_flashback.get_system_change_number);
insert into t values(5,dbms_flashback.get_system_change_number);
commit;
alter system switch logfile;
3.关闭数据库 ,删除 system01.dbf、user01.dbf文件。
4.启动数据库
如图提示system01.dbf 不能打开,因为已经删除。
5. 从bak中恢复system01.dbf,再次open数据库
这次系统会提示你要media recovery,即从归档日志中恢复数据; enter即可。
如果从scn角度来看,你未恢复dbf之前,你可以通过
select file#,checkpoint_change# from v$datafile_header来查看数据文件scn的变化情况。
即此时,checkpoint_change#=0的。你recover后,,checkpoint_change#会恢复到最近的scn。
数据库正常启动的前提是:系统scn、数据文件头scn、控制文件scn 都必须一致。
6.再次open数据库
会提示user01.dbf 不存在,如上操作,从归档日志中恢复insert的数据。再次open数据库,正常启动了。
查看一下表数据是否丢失,恩,都恢复回来了。
这时你再次查看scn,就都一样的了。
至此,冷备份恢复完成。