无备份数据文件的恢复

流程:
1.  新建表空间及表,向表里插入一条数据;
2.  关闭数据库;
3.  在操作系统删除新建表空间的数据文件;
4.  重新启动数据库,报错;
5.  手动将数据文件下线;
6.  打开数据库,先让数据正常对外工作;
7.  recover datafile ..(前提是从数据文件诞生起日志文件都存在)
8.  手动将数据文件上线;


--新建测试环境

create tablespace test
datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEST01.DBF'
size 100m autoextend on next 10m maxsize unlimited
extent management local autoallocate
segment space management auto;


--新建测试表
create table t1
(
sid int not null primary key,
sname varchar2(10)
)
tablespace test;

 

 

--循环导入数据
declare
        maxrecords constant int:=20000;
        i int :=1;
    begin
        for i in 1..maxrecords loop
          insert into t1 values(i,'ocpyang');
        end loop;
    dbms_output.put_line(' 成功录入数据! ');
    commit;
    end;
/

 

--2.模拟删除文件
shutdown immediate;

host del E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEST01.DBF

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  843456512 bytes
Fixed Size                  2180424 bytes
Variable Size             629148344 bytes
Database Buffers          205520896 bytes
Redo Buffers                6606848 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 5 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 5: 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEST01.DBF'

 


alter database datafile 5 offline;


shutdown immediate;


startup;


SQL> select file#,status,name from v$datafile;

     FILE# STATUS  NAME
---------- ------- --------------------------------------------------
         1 SYSTEM  E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF
         2 ONLINE  E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF
         3 ONLINE  E:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF
         4 ONLINE  E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF
         5 OFFLINE E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEST01.DBF

 

 

 

recover datafile 5;

ORA-00283: 恢复会话因错误而取消
ORA-01110: 数据文件 5: 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEST01.DBF'
ORA-01157: 无法标识/锁定数据文件 5 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 5: 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEST01.DBF'

--重构数据文件
 alter database create datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEST01.DBF';

 

recover datafile 5;

完成介质恢复。

alter database datafile 5 online;

select count(*) from t1;