1、首先,关闭数据库,然后备份所有的数据文件,注意,包括:system表空间的文件,用户表空间的文件、undo表空间的文件。
2、登录数据库,然后,创建一个表data01,并插入数据,提交,创建表data02、data03,并插入数据,提交,同时归档当前日志。
SQL> startup ORACLE 例程已经启动。 Total System Global Area 1068937216 bytes Fixed Size 2182592 bytes Variable Size 675283520 bytes Database Buffers 385875968 bytes Redo Buffers 5595136 bytes 数据库装载完毕。 数据库已经打开。 SQL> create table data01(v int) tablespace data01; 表已创建。 SQL> insert into data01 values(1); 已创建 1 行。 SQL> commit; 提交完成。 SQL> alter system switch logfile; 系统已更改。 SQL> create table data02 tablespace data01 as select * from dba_objects; 表已创建。 SQL> insert into data02 select * from dba_objects; 已创建12644行。 SQL> alter system switch logfile; 系统已更改。 SQL> create table data03 tablespace data01 as select * from dba_objects where 1=0; 表已创建。 SQL> insert into data03 select * from dba_objects; 已创建12645行。 SQL> alter system archive log current; 系统已更改。 SQL> commit; 提交完成。 SQL> alter system archive log current; 系统已更改。
3、关闭系统,删除存放data01、data02、data03数据的data01文件:
SQL> shutdown immediate; 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
4、启动到mount,发现文件4,也就是data01文件是需要恢复的:
SQL> startup mount; ORACLE 例程已经启动。 Total System Global Area 1068937216 bytes Fixed Size 2182592 bytes Variable Size 675283520 bytes Database Buffers 385875968 bytes Redo Buffers 5595136 bytes 数据库装载完毕。 SQL> select file#,error from v$recover_file; FILE# ERROR ---------- ----------------------------------------------------------------- 4 FILE NOT FOUND
5、把所有的数据文件复制到指定的目录,注意,不仅是data01文件,还有其他所有的文件。
6、进行基于cancel的恢复,并用resetlogs选项来打开数据库:
SQL> recover database until cancel ORA-00279: 更改 232570 (在 03/10/2014 21:03:03 生成) 对于线程 1 是必需的 ORA-00289: 建议: D:\DEMO\ARCHIVE3\ARC0000000015_0841612121.0001 ORA-00280: 更改 232570 (用于线程 1) 在序列 #15 中 指定日志: {<RET>=suggested | filename | AUTO | CANCEL} ORA-00279: 更改 232764 (在 03/11/2014 18:51:17 生成) 对于线程 1 是必需的 ORA-00289: 建议: D:\DEMO\ARCHIVE3\ARC0000000016_0841612121.0001 ORA-00280: 更改 232764 (用于线程 1) 在序列 #16 中 ORA-00278: 此恢复不再需要日志文件 ‘D:\DEMO\ARCHIVE3\ARC0000000015_0841612121.0001‘ 指定日志: {<RET>=suggested | filename | AUTO | CANCEL} ORA-00279: 更改 233240 (在 03/11/2014 19:36:19 生成) 对于线程 1 是必需的 ORA-00289: 建议: D:\DEMO\ARCHIVE3\ARC0000000017_0841612121.0001 ORA-00280: 更改 233240 (用于线程 1) 在序列 #17 中 ORA-00278: 此恢复不再需要日志文件 ‘D:\DEMO\ARCHIVE3\ARC0000000016_0841612121.0001‘ 指定日志: {<RET>=suggested | filename | AUTO | CANCEL} ORA-00279: 更改 233352 (在 03/11/2014 19:37:30 生成) 对于线程 1 是必需的 ORA-00289: 建议: D:\DEMO\ARCHIVE3\ARC0000000018_0841612121.0001 ORA-00280: 更改 233352 (用于线程 1) 在序列 #18 中 ORA-00278: 此恢复不再需要日志文件 ‘D:\DEMO\ARCHIVE3\ARC0000000017_0841612121.0001‘ 指定日志: {<RET>=suggested | filename | AUTO | CANCEL} ORA-00308: cannot open archived log ‘D:\DEMO\ARCHIVE3\ARC0000000018_0841612121.0001‘ ORA-27041: unable to open file OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 SQL> recover database until cancel ORA-00279: 更改 233352 (在 03/11/2014 19:37:30 生成) 对于线程 1 是必需的 ORA-00289: 建议: D:\DEMO\ARCHIVE3\ARC0000000018_0841612121.0001 ORA-00280: 更改 233352 (用于线程 1) 在序列 #18 中 指定日志: {<RET>=suggested | filename | AUTO | CANCEL} cancel 介质恢复已取消。 SQL> alter database open resetlogs;
7、测试发现data01、data02、data03都已经恢复,跳过了日志序号为18的归档日志,这个序号为18的归档日志是在归档了data03表的操作之后,也就是归档了序号日志为17后,再次归档的日志,也就是序号为18的归档日志,所以这3个表才都恢复了:
SQL> select * from data01; V ---------- 1 SQL> select count(*) from data02; COUNT(*) ---------- 25288 SQL> select count(*) from data03; COUNT(*) ---------- 0
日志序号已重置为1,resetlogs的意思就是重置日志:
SQL> archive log list; 数据库日志模式 存档模式 自动存档 启用 存档终点 d:\demo\archive3 最早的联机日志序列 1 下一个存档日志序列 1 当前日志序列 1
8、以resetlogs打开数据库后,过去的备份就不能直接使用,所以为了避免介质失败而无法恢复,必须要重新备份所有数据文件、控制文件:
SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- D:\DEMO\SYSTEM01.DBF D:\DEMO\SYSAUX01.DBF D:\DEMO\UNDOTBS1.DBF D:\DEMO\DATA01.DBF
SQL> alter database begin backup; 数据库已更改。 SQL> host copy d:\demo\system01.dbf d:\demo\backup1\system01.dbf; 已复制 1 个文件。 SQL> host copy d:\demo\sysaux01.dbf d:\demo\backup1\sysaux01.dbf; 已复制 1 个文件。 SQL> host copy d:\demo\undotbs01.dbf d:\demo\backup1\undotbs01.dbf; 系统找不到指定的文件。 SQL> host copy d:\demo\undotbs1.dbf d:\demo\backup1\undotbs1.dbf; 已复制 1 个文件。 SQL> host copy d:\demo\data01.dbf d:\demo\backup1\data01.dbf; 已复制 1 个文件。 SQL> alter database end backup; 数据库已更改。 SQL> alter database backup controlfile to ‘d:\demo\backup1\orcl.ctl‘ reuse; 数据库已更改。 SQL> alter system archive log current; 系统已更改。