在做系统具体运行的时候,如果存储系统不稳定就会经常出现数据库文件丢失的问题,如果是数据文件丢失,相对来讲比较好解决,但如果是控制文件丢失,就会很麻烦,是重新生成呢?还是从备份系统恢复?但是从备份系统的恢复风险也很大, 下面就是针对控制文件丢失情况下的具体实验,可以一般测试一边理解。
1、在数据库运行中,删除某一个控制文件。
将数据库down掉,shutdown/shutdown abort
在操作系统级,cp 存在的控制文件名 丢失的控制文件名
重启数据库
2、在数据库运行中,删除所有控制文件。
create controlfile reuse set database train
logfile '/data1/oracle8/mnt1/oradata/train/redotrain01.log' size 500k,
'/data1/oracle8/mnt2/oradata/train/redotrain02.log' size 500k
resetlogs
datafile '/data1/oracle8/mnt1/oradata/train/system01.dbf' size 50m,
'/data1/oracle8/mnt1/oradata/train/users01.dbf' size 100m,
'/data1/oracle8/mnt1/oradata/train/temp01.dbf' size 50m,
'/data1/oracle8/mnt1/oradata/train/rbs01.dbf' size 50m;
reuse:说明有初始化参数CONTROL_FILE所标识的控制文件可被重用,删除其当前所包含的全部信息。如果忽略改选项,而任何的控制文件已存在,oracle将返回错误。
set database:修改数据库的名字
resetlogs:使用该选项,用ALTER DATABASE命令打开数据库时,必须使用resetlogs选项。
上述试验成功的前提条件是数据文件没有损坏。
不完全恢复的案例(备份为冷备,即关库备份)
1、系统有一asia表空间,表空间上有一张test表。
create tablespace asia
create table test (n1 number(2)) tablespace asia;
2、将数据库正常关闭,并且备份所有数据文件、控制文件。
shutdown;
cp
3、将数据库置于归档模式下
startup mount;
alter database archivelog;
alter database open;
4、在某一时刻点上将表空间删除。(删除之前记住时间,或到alert_sid.log文件中查找)
“d r o p tablespace asia including contents; ”
5、正常关机
shutdown
6、将备份的数据文件、控制文件拷回原目录
7、启动数据库
startup
8、报错:ORA-00338: log 1 of thread 1 is more recent than controlfile
ORA-00312: online log 1 thread 1: '/data1/oracle8/mnt1/oradata/train/redotrain01.log'
9、检查是否有脱机的数据文件
select * from v$recover_file;
10、 recover database until time '2000-08-24:16:17:40' using backup controlfile;
(若告知时间不对,可使用命令alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS'; 不用该命令)
11、提供日志文件,若没有归档的日志文件可用,输入联机日志文件。
12、将数据库打开。
alter database open resetlogs;
不完全恢复的案例(备份为热备,即联机备份)
1、将数据库置于归档模式下
startup mount;
alter database archivelog;
alter database open;
2、进行联机表空间和控制文件的热备份。(alter tablespace asia begin backup等)
3、删除表空间
4、将数据库关闭
5、将备份的数据文件和控制文件恢复(cp)
6、启动数据库,报错:需要用nosetlogs和setlogs打开数据库
7、执行命令: recover database until time '' using backup controlfile;(输入其中一联机日志文件)
8、恢复成功,用alter database open resetlogs;