背景
在Linux系统下执行rm,将非系统表空间的数据文件删除后。当该表空间没有DML或DDL的情况下,数据库的alert日志并不会及时输出错误。当alert日志中出现该问题时,也就是影响业务正常运行的时候。
宕机时间
无,不影响其它用户正常使用。但是该数据文件对应的表空间文件有短暂的不可使用时间。
解决方向
1、如果有备份,可以通过备份还原指定表空间
2、Oracle 11g开始支持DRA方式进行自动诊断,快速恢复指定表空间。但是其必须存在Rman全备(0级)
3、没有备份,通过Oracle Recover结合Linux的方式进行恢复 – 当前主要以该方式进行讲解
具体分析
1、前提条件
数据库或者服务器在未恢复数据文件之前一定不能关闭或重启。一旦重启或者关闭,所有进程信息将被清空,就无法执行数据文件恢复。
2、何为Linux方式?
Linux对于每个进程都会PID记录,而每个PID都会存在一个文件夹,该文件夹下记载了当前进程操作的细节信息。其中最重要的就是句柄编号。我们将使用句柄编号进行恢复数据库
3、Recovery
Oracle Recover主要是通过归档日志和redo日志进行恢复备份后的数据。而此处仅需要恢复指定误删除的数据文件即可
4、DBWR进程
DBWR进程是Oracle数据库用来写数据的进程。前端用户执行DML、DDL等SQL操作,相关操作会落盘到高速缓冲区。DBWR进程将高速缓冲区的脏块数据写到数据文件中。
具体操作
1、查询DBWR进程PID
$ ps -ef|grep dbw
2、通过PID进入进程的文件夹中
cd /proc/[pid]/fd
3、查看相关进程信息
ll
4、执行CP
注意:当前文件夹中记录了dbwr进程的操作细节。如果执行了操作系统级别的rm,在句柄对应的文件后系统会追加(delete)标识符。针对该标识符进行cp
cp [句柄编号] [被标识的delete动作的文件]
5、数据库下线数据文件
$ sqlplus / as sysdba
SQL>alter database datafile [file_number] offline;
6、数据库执行恢复
$ sqlplus / as sysdba
SQL> recover datafile [file_number];
7、数据库上线数据文件
$ sqlplus / as sysdba
SQL>alter database datafile [file_number] online;
8、添加系统检查点
$ sqlplus / as sysdba
SQL> alter system checkpoint;
9、校验
注意:此处需要针对误删除的数据文件进行校验。插入数据到数据文件对应的表空间中。如果插入成功就意味着此次恢复成功
SQL> create table [] as select * from dba_objects;




