Oracle意外删除数据文件恢复方法

来源:互联网 发布:有组织犯罪知乎 编辑:程序博客网 时间:2024/05/21 10:48
Oracle意外删除数据文件恢复方法
本文http://www.itpub.net/thread-2063564-1-1.html

一、  恢复原理
在Linux操作系统中,如果文件从操作系统级别被rm掉,之前打开该文件的进程仍然持有相应的文件句柄,所指向的文件仍然可以读写,并且该文件的文件描述符可以从/proc目录中获得。但是要注意的是,此时如果关闭数据库,则此句柄会消失,那么除了扫描磁盘进行文件恢复之外就没有其它方法了,因此在数据库出现问题的时候,如果不确认情况的复杂程度,千万不要随便关闭数据库。重启数据库往往是没有意义的,甚至是致命的。
二、  测试环境
操作系统:redhat6
数据库版本:oracle 11
三、   恢复步骤
          i.           创建测试表空间、用户
1、创建表空间
SYS@orcl>createtablespace test datafile '/u01/app/oracle/oradata/orcl/test.dbf' size 50m;
Tablespacecreated.
2、创建test用户
SYS@orcl>createuser test identified by test default tablespace test;
User created.
3、授权
SYS@orcl>grantconnect,resource to test;
Grantsucceeded.
         ii.           删除数据文件测试
TEST@orcl>host rm /u01/app/oracle/oradata/orcl/test.dbf
TEST@orcl>createtable test(t int);
Tablecreated.
TEST@orcl>insertinto test values(1);
insertinto test values(1)
           *
ERRORat line 1:
ORA-01116:error in opening database file 36
ORA-01110:data file 36:   '/u01/app/oracle/oradata/orcl/test.dbf'
ORA-27041:unable to open file
Linux-x86_64Error: 2: No such file or directory
Additional information: 3
建表成功,但是,插入操作报错,数据文件不存在。
       iii.            检查dbwr的进程PID
ps -ef|grep dbw0|grep-v grep
oracle    5745     1  0Jul14 ?        00:00:00 ora_dbw0_orcl
       iv.           dbwr会打开所有数据文件的句柄。在proc目录中可以查到,目录名是进程PID,fd表示文件描述符。
cd /proc/5745/fd
ll
……..
lrwx------ 1 oracle oinstall64 7月  15 00:51 300 ->/u01/app/oracle/oradata/orcl/test.dbf (deleted)
……
可以看到“/u01/app/oracle/oradata/orcl/test.dbf (deleted)”字样,表名改文件已经被删除
         v.           直接拷贝该句柄文件回原位置
cp 300 /u01/app/oracle/oradata/orcl/test.dbf
       vi.           进行数据文件恢复
1、将数据文件/u01/app/oracle/oradata/orcl/test.dbf置于离线状态。
SYS@orcl>alter database datafile '/u01/app/oracle/oradata/orcl/test.dbf'offline;
Database altered.
2、介质恢复
SYS@orcl>recoverdatafile '/u01/app/oracle/oradata/orcl/test.dbf';
Media recovery complete.
3、将数据文件/u01/app/oracle/oradata/orcl/test.dbf置于在线状态
SYS@orcl>alter database datafile '/u01/app/oracle/oradata/orcl/test.dbf'online;
Database altered.
4、测试
TEST@orcl>insertinto test values(1);
1 row created.
发现已经可以向表中插入数据。

0 0