Oracle数据文件误删除(没开归档,无备份,闪回也没有开之开启数据库方法)

碰到了一件悲催的事情,数据库没开归档,没开备份误删除了一个数据文件。开启数据库报错,datafile丢失,需要介质恢复。不过幸好只是测试环境,只要能正常开启就行,数据文件啥的不重要了。不过就算想恢复数据文件也不可能了,因为发现已经是5天后了,日志早就刷新到哪里去都不知道了。
1.定位丢失的数据文件
可以看到SWA_LOB表空间的数据文件5异常,大小,自动扩展都是空。

select FILE_NAME,TABLESPACE_NAME,bytes/1024/1024,AUTOEXTENSIBLE,MAXBYTES/1024/1024 from dba_data_files;
Oracle数据文件误删除(没开归档,无备份,闪回也没有开之开启数据库方法)
文章图片

2.关闭数据库
shutdown immediate
3.启动数据库到mount状态
startup mount
4.删除刚才的数据文件
alter database datafile ‘/oracle/oradata02/***/swa_lob_05.dbf’ offline drop;
5.打开数据库
alter database open
6.查看数据文件的状态,发现还是一样。
Oracle数据文件误删除(没开归档,无备份,闪回也没有开之开启数据库方法)
文章图片

7.删除表空间,报错,提示还有相关的表,视图没删除
drop tablespace swa_lob INCLUDING CONTENTS and datafiles;
Oracle数据文件误删除(没开归档,无备份,闪回也没有开之开启数据库方法)
文章图片

7.因为是大字段表,所以要删除所有该用户相关的表和视图
SELECT * FROM DBA_TAB_COLUMNS WHERE DATA_TYPE LIKE ‘%LOB%’ AND OWNER=‘SWALOB’;
8.查询出来的结果一一删除。
删除之前用将需要删除的表和视图的ddl语句备份,用sqldeveloper选中对象表快速DDL保存到文件。
drop user.table table_name;
drop user.viewer view_name;
9.再次删除表空间,成功。
drop tablespace swa_lob INCLUDING CONTENTS and datafiles;
10.重建表空间
create tablespace SWA_LOB datafile ‘/oracle/oradata02/***/swa_lob_01.dbf’ size 1G AUTOEXTEND ON MAXSIZE 30G;
11.通过执行刚才备份的DDL文件,恢复刚才删除的表
12.确认失效的同义词,视图等等
select * from all_objects where status <> ‘VALID’ and owner not in (‘SYS’,‘PUBLIC’,‘WMSYS’,‘APEX_030200’) order by owner;
13.重新编译失效的同义词和视图,或者存储过程。
alter view user.view_name compile; 编译视图
alter synonym user.synonym_name compile.编译同义词
alter package user.package_name compile; 编译package
alter package user.package_name compile body; 编译package body
【Oracle数据文件误删除(没开归档,无备份,闪回也没有开之开启数据库方法)】14.编译时可能会报权限错误,根据错误提示进行授权。
grant select on user.table_name to user;
OK,到此为止异常的表空间恢复了,再从正式环境导入数据即可。
*以上经验都是自己测试所得,如有错误请指正,谢谢!
数据无价,建议清理之前备份需要清理的表空间!实际操作应先在测试环境测试完成后,再在生产环境执行。

    推荐阅读