首页 > 数据库 > Oracle > 控制文件快照和rman利用快照恢复
Oracle中有对控制文件快照,windows中默认的存储在oracle_homedatabasesncf
当rman需要同步控制文件信息或者备份当前控制文件时,控制文件快照会自动备份。
Rman target /
Rman>backup current controlfile format ‘d:control.ctl’;
可以查看具体的控制文件和控制文件快照备份信息
Windows下直接可以直接查看备份的控制文件属性查看和控制文件快照的默认位置查询。Linux下可以ls查看具体的控制文件备份集和会控制文件快照的文件信息,由于是在我的windows服务器下测试,发现此时控制文件快照的修改时间比控制文件备份的时间早,也正好验证:在rman备份控制文件后,rman进行更新控制文件的快照。(循序渐进中提到备份控制文件之前更新快照信息,但是测试发现快照的更新时间是在备份控制文件之后的。)
快照的生成还和rman设置有关,当configure controlfile autobackup off开启时
Rman>backup database;
。。。
Including current controlfile in backupset
Including current spfile in backupset
。。。
此时全备份数据库会把当前controlfile和spfile自动备份,由于controlfile的备份发生在备份集中,rman又会更新控制文件的快照,此时这个快照优先与备份集产生,因此无法作用于最后一次备份集的恢复。
Rman>Restore controlfile to ‘d:test.ctl’ from ‘oracle_homedatabasesncf
我们可以通过控制文件快照恢复一个控制文件,由于此时恢复的控制文件不包含上次的备份信息,因为快照的备份发生在全备份之前,没有记录数据库的全备份到快照中。
Rman>Restore database;
此时如果恢复的controlfile中有备份信息是可以恢复之前的备份集,如果没有当前rman什么都做不了了。
如果开启oracle的控制文件自动备份功能。此时当数据库发生变化,例如增加 删除表空间 数据文件等,发生数据库备份等oracle都会更新控制文件信息,此时又会发生控制文件自动备份。
Rman>configure controlfile autobackup on;
Rman>backup database;
。。。
Finish backup at
Starting controlfile file and spfile autobackup
。。。
Finish backup at
此时如果查看rman中的备份信息是可以发现oracle先对数据库进行全备份,但是此时并没有包括当前的控制文件和spfile。然后全库备份完毕后oracle又会对控制文件和spfile进行备份,此时备份的控制文件中就包含此次全库备份的信息。同样控制文件的备份又会触发控制文件快照的备份,且都是来自备份集之后,所以包含此次备份信息。
下面测试一下快照用于数据库的恢复。一下测试基本是按照eygle循序渐进中进行,经个人试验确实成功
1 首先创建测试表,编写存储过程insert ashuang
Sql>begin
for i in 1..4 loop
insert into ashuang values(i,sysdate,dbms_flashback.get_system_change_number);
commit;
execute immediate 'alter system switch logfile';
dbms_lock.sleep(3);
end loop;
end;
/*dbms_lock.sleep(n)程序暂停3秒,一般grant execute on dbms_lock to USERNAME让用户拥有此权限才能使用*/
2 查看ashuang中的scn用于以后不完全恢复
Select * from ashuang.;
Id edate escn
1 2011-8-30 13:51:00 344115
1 2011-8-30 13:51:47 344134
2 2011-8-30 13:51:50 344138
3 2011-8-30 13:51:53 344142
4 2011-8-30 13:52:01 344149
1 2011-8-30 13:50:01 344086
3 意外关闭数据库
Rman>Shutdown abort
然后删除所有的控制文件和数据文件
4 开始数据库恢复
Rman>startup nomount
如果连spfile也不见了,可以用rman target / 启动默认实例到nomount然后restore spfile from ‘X’指定备份集恢复spfile。
Rman>restore controlfile from ‘d:oracleproduct
指定快照用于恢复控制文件,当然也可以指定控制文件备份集restore controlfile from ‘Y’
Rman>alter database mount;
Rman>run{
Allocate channel d1 device type disk;
Set until scn 344145
Restore database;
Recover database;
}
5 resetlogs 打开数据库
因为使用备份的控制文件快照用于恢复控制文件
Rman>alter database open resetlogs
Select * from ashuang;
此次就完成了数据库的一次不完整恢复,当然如果当前log redo没有丢失,数据库是可以指定完成恢复的。也可以指定until time ‘
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1054571/ ,如需转载,请注明出处,否则将追究法律责任。