此文讲述如何恢复未备份的数据文件,在归档日志模式,如果dba增加了新的数据文件,当没有备份新的数据文件,那么该文件出现损坏时,可以恢复该数据文件。前提是 从建立新的数据文件到丢失为止的所有归档日志必须全部存在。
一 模拟实验环境。在数据文件test 里建立t1表 并插入数据,提交,归档日志文件。
SQL> create table t(num number) tablespace test;
表已创建。
SQL> insert into t values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into t values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into t values(3);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into t values(4);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
模拟数据文件丢失。
SQL> host del f:\lib\test.dbf
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
二 实施恢复。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 130024340 bytes
Database Buffers 398458880 bytes
Redo Buffers 5844992 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'F:\LIB\TEST.DBF'
2)使数据文件脱机。
SQL> alter database datafile 6 offline;
数据库已更改。
3)打开数据库。
SQL> alter database open;
数据库已更改。
4)重建数据文件,在执行恢复命令之前,首先需要复制数据文件的备份,但该文件没有备份,所以只能用alter database create datafile命令重建数据文件。
SQL> alter database create datafile 'f:\lib\test.dbf';
数据库已更改。
5)恢复数据文件。
SQL> recover datafile 'f:\lib\test.dbf';--也可以用recover datafile 6;
ORA-00279: 更改 2325010 (在 05/09/2010 21:06:57 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:\APP\YANG\ARCHIVE2\53_1_715961434.LOG
ORA-00280: 更改 2325010 (用于线程 1) 在序列 #53 中
指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 2326948 (在 05/09/2010 21:27:02 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:\APP\YANG\ARCHIVE2\54_1_715961434.LOG
ORA-00280: 更改 2326948 (用于线程 1) 在序列 #54 中
ORA-00279: 更改 2328241 (在 05/09/2010 21:40:37 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:\APP\YANG\ARCHIVE2\55_1_715961434.LOG
ORA-00280: 更改 2328241 (用于线程 1) 在序列 #55 中
ORA-00279: 更改 2329131 (在 05/09/2010 21:48:01 生成) 对于线程 1 是必需的
ORA-00289: 建议: F:\APP\YANG\ARCHIVE2\56_1_715961434.LOG
ORA-00280: 更改 2329131 (用于线程 1) 在序列 #56 中
已应用的日志。
完成介质恢复。---意味着恢复成功了
最后,验证一下。
SQL> alter database datafile 6 online;
数据库已更改。
SQL> select * from t;
NUM
----------
1
2
3
4
恢复成功,,,,
需要注意的是 此情况只适用于归档模式。