Oracle数据文件误删除(没开归档,无备份,闪回也没有开之开启数据库方法)
碰到了一件悲催的事情,数据库没开归档,没开备份误删除了一个数据文件。开启数据库报错,datafile丢失,需要介质恢复。不过幸好只是测试环境,只要能正常开启就行,数据文件啥的不重要了。不过就算想恢复数据文件也不可能了,因为发现已经是5天后了,日志早就刷新到哪里去都不知道了。
1.定位丢失的数据文件
可以看到SWA_LOB表空间的数据文件5异常,大小,自动扩展都是空。
select FILE_NAME,TABLESPACE_NAME,bytes/1024/1024,AUTOEXTENSIBLE,MAXBYTES/1024/1024 from dba_data_files;2.关闭数据库
文章图片
shutdown immediate3.启动数据库到mount状态
startup mount4.删除刚才的数据文件
alter database datafile ‘/oracle/oradata02/***/swa_lob_05.dbf’ offline drop;5.打开数据库
alter database open6.查看数据文件的状态,发现还是一样。
文章图片
7.删除表空间,报错,提示还有相关的表,视图没删除
drop tablespace swa_lob INCLUDING CONTENTS and datafiles;
文章图片
7.因为是大字段表,所以要删除所有该用户相关的表和视图
SELECT * FROM DBA_TAB_COLUMNS WHERE DATA_TYPE LIKE ‘%LOB%’ AND OWNER=‘SWALOB’;8.查询出来的结果一一删除。
删除之前用将需要删除的表和视图的ddl语句备份,用sqldeveloper选中对象表快速DDL保存到文件。
drop user.table table_name;9.再次删除表空间,成功。
drop user.viewer view_name;
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;【Oracle数据文件误删除(没开归档,无备份,闪回也没有开之开启数据库方法)】14.编译时可能会报权限错误,根据错误提示进行授权。编译视图
alter synonym user.synonym_name compile.编译同义词
alter package user.package_name compile;编译package
alter package user.package_name compile body;编译package body
grant select on user.table_name to user;OK,到此为止异常的表空间恢复了,再从正式环境导入数据即可。
*以上经验都是自己测试所得,如有错误请指正,谢谢!
数据无价,建议清理之前备份需要清理的表空间!实际操作应先在测试环境测试完成后,再在生产环境执行。
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- django-前后端交互
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 使用composer自动加载类文件
- 使用协程爬取网页,计算网页数据大小
- Java|Java基础——数组
- Python数据分析(一)(Matplotlib使用)
- Jsr303做前端数据校验
- Spark|Spark 数据倾斜及其解决方案
- 数据库设计与优化