为什么会使用备份的控制文件? 实际工作中主要有两种情况:
第一种:当前控制文件全部损坏,而数据文件备份,控制文件备份及当前日志处于不同SCN版本,它们之间又增加过表空间(数据文件)。
第二种:当前控制文件没有损坏,但想要恢复被删除的表空间。
实验3 :全备<老>--备份控制文件<次新>--删除表空间andy--日志文件<新>
情形:用户使用正常操作命令删除了表空间及其数据文件,但之后又希望恢复删除的表空间。全备里有这个表空间的数据文件。
分析:当用户使用drop tablesapce xxx including contents and datafiles 这条DDL语句后,数据库的结构发生了变更,涉及了三个地方。
a)控制文件
b)该表空间下的数据文件
c)系统表空间(数据字典)
特别提醒的是:当前的控制文件里已经没有该表空间的信息了,所以不能使用当前的控制文件做恢复。恢复这个表空间要满足三个条件:
a)要有该表空间的数据文件备份
b)使用不完全恢复(基于时间点或scn)
c)使用备份的控制文件,而这个控制文件是删除该表空间前的控制文件,不是当前的控制文件。这个非常重要,该控制文件中的内容记录了你需要恢复数据库结构,重要的这个控制文件必须包括有你要恢复的那个表空间的信息。
1)准备环境
--生成要备份的数据文件的命令
SQL> select 'ho cp ' || name || ' /home/oracle/coldbak' from vdatafile;′HOCP′||NAME||′/HOME/ORACLE/COLDBAK′−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−hocp/home/oracle/app/oradata/orcl/system01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/sysaux01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/undotbs01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/users01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/tbtb01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/ogg01.dbf/home/oracle/coldbak6rowsselected.SQL>shutdownimmediate;Databaseclosed.Databasedismounted.ORACLEinstanceshutdown.SQL>hocp/home/oracle/app/oradata/orcl/system01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/sysaux01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/undotbs01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/users01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/tbtb01.dbf/home/oracle/coldbakhocp/home/oracle/app/oradata/orcl/ogg01.dbf/home/oracle/coldbakSQL>startup;ORACLEinstancestarted.TotalSystemGlobalArea1068937216bytesFixedSize2220200bytesVariableSize729812824bytesDatabaseBuffers331350016bytesRedoBuffers5554176bytesDatabasemounted.Databaseopened.SQL>alterdatabasebackupcontrolfileto′/home/oracle/coldbak/ctl01.bak′;Databasealtered.SQL>selectnamefromvtablespace;
NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
USERS
TEMP
LZY
GOLDGATE
SQL> create tablespace andy datafile '/home/oracle/app/oradata/orcl/andy01.dbf' size 1m;
Tablespace created.
SQL> create table andy.andy(id int) tablespace andy;
Table created.
SQL> insert into andy.andy values (101);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from andy.andy;
ID
----------
101
SQL> select current_scn from vdatabase;CURRENTSCN−−−−−−−−−−−20426812)模拟正常删除表空间SQL>droptablespaceandyincludingcontentsanddatafiles;3)关闭数据库SQL>shutdownimmediate;4)还原所有数据文件,以老控制文件替换当前控制文件[oracle@11gorcl] rm -rf *.dbf
[oracle@11g orcl]rm−rf/home/oracle/app/oradata/orcl/control01.ctl[oracle@11gorcl] rm -rf /home/oracle/app/flash_recovery_area/orcl/control02.ctl
[oracle@11g coldbak]cpctl01.bak/home/oracle/app/oradata/orcl/control01.ctl[oracle@11gcoldbak] cp ctl01.bak /home/oracle/app/flash_recovery_area/orcl/control02.ctl
[oracle@11g coldbak]$ cp *.dbf /home/oracle/app/oradata/orcl/
5)启动数据库后,要做基于时间点(或SCN)的不完全恢复
SQL> startup;
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2220200 bytes
Variable Size 729812824 bytes
Database Buffers 331350016 bytes
Redo Buffers 5554176 bytes
Database mounted.
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选
SQL> recover database until change 2042681 using backup controlfile;
6)resetlogs打开数据库
SQL> alter database open resetlogs;
Database altered.
7)验证
SQL> select * from andy.andy;
ID
----------
101
OK,结束。 转载请标明出处。