Oracle 意外删除数据文件的恢复

本文介绍了一种在Linux环境下,当Oracle数据库的数据文件被意外删除时,如何通过保留的文件句柄进行数据恢复的方法。具体步骤包括定位已删除文件的句柄、复制句柄文件并进行数据恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章转自:   http://www.dbform.com/html/2011/1761.html

链接:点击打开链接

今天有客户的数据库意外被删除了整个目录中的数据文件,操作系统级别的删除,然而幸运的是这个数据库没有崩溃,仍然处于open状态的时候,客户就发现了问题,求助到我们,最终完整地恢复了所有数据文件。

 

在Linux下大致重新演示一下恢复的过程,恢复的步骤与数据库版本没有太大关系,与操作系统的不同会有所不同。

 

1. 在数据库open的时候,直接删除users表空间中的数据文件。

 

SQL> select name from v$datafile;

 

NAME

--------------------------------------------------------------------------------

/app/oracle/oradata/ORCL/datafile/o1_mf_system_555wqbnk_.dbf

/app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_555wqxgl_.dbf

/app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_555wr5p6_.dbf

/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf

 

SQL> host rm/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf

2. 尝试在users表空间中创建表,开始报错。

 

SQL> create table t tablespace users asselect * from dual;

create table t tablespace users as select *from dual

                                                *

ERROR at line 1:

ORA-01116: error in opening database file 4

ORA-01110: data file 4:

'/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf'

ORA-27041: unable to open file

Linux Error: 2: No such file or directory

Additional information: 3

在告警日志中,同样也可以看到类似信息。

 

Mon Dec 19 21:48:17 CST 2011

Errors in file/app/oracle/admin/orcl/bdump/orcl_m000_3897.trc:

ORA-01116: error in opening database file 4

ORA-01110: data file 4:'/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf'

ORA-27041: unable to open file

Linux Error: 2: No such file or directory

Additional information: 3

3. 检查dbwr的进程PID

 

$ ps -ef|grep dbw0|grep -v grep

oracle   2879     1  0 21:38 ?        00:00:00 ora_dbw0_orcl

4. dbwr会打开所有数据文件的句柄。在proc目录中可以查到,目录名是进程PID,fd表示文件描述符。

 

$ cd /proc/2879/fd

$ ls -l

total 0

lr-x------ 1 oracle dba 64 Dec 19 21:50 0-> /dev/null

lr-x------ 1 oracle dba 64 Dec 19 21:50 1-> /dev/null

lr-x------ 1 oracle dba 64 Dec 19 21:50 10-> /dev/zero

lr-x------ 1 oracle dba 64 Dec 19 21:50 11-> /dev/zero

lr-x------ 1 oracle dba 64 Dec 19 21:50 12-> /app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb

lrwx------ 1 oracle dba 64 Dec 19 21:50 13-> /app/oracle/product/10.2.0/db_1/dbs/hc_orcl.dat

lrwx------ 1 oracle dba 64 Dec 19 21:50 14-> /app/oracle/product/10.2.0/db_1/dbs/lkORCL

lrwx------ 1 oracle dba 64 Dec 19 21:50 15-> /app/oracle/oradata/ORCL/controlfile/o1_mf_555wq3ng_.ctl

lrwx------ 1 oracle dba 64 Dec 19 21:50 16-> /app/oracle/oradata/ORCL/datafile/o1_mf_system_555wqbnk_.dbf

lrwx------ 1 oracle dba 64 Dec 19 21:50 17-> /app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_555wqxgl_.dbf

lrwx------ 1 oracle dba 64 Dec 19 21:50 18-> /app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_555wr5p6_.dbf

lrwx------ 1 oracle dba 64 Dec 19 21:50 19-> /app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf (deleted)

lr-x------ 1 oracle dba 64 Dec 19 21:50 2-> /dev/null

lrwx------ 1 oracle dba 64 Dec 19 21:50 20-> /app/oracle/oradata/ORCL/datafile/o1_mf_temp_555wrbnz_.tmp

lr-x------ 1 oracle dba 64 Dec 19 21:50 21-> /app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb

lr-x------ 1 oracle dba 64 Dec 19 21:50 3-> /dev/null

lr-x------ 1 oracle dba 64 Dec 19 21:50 4-> /dev/null

l-wx------ 1 oracle dba 64 Dec 19 21:50 5-> /app/oracle/admin/orcl/udump/orcl_ora_2871.trc

l-wx------ 1 oracle dba 64 Dec 19 21:50 6-> /app/oracle/admin/orcl/bdump/alert_orcl.log

lrwx------ 1 oracle dba 64 Dec 19 21:50 7-> /app/oracle/product/10.2.0/db_1/dbs/lkinstorcl (deleted)

l-wx------ 1 oracle dba 64 Dec 19 21:50 8-> /app/oracle/admin/orcl/bdump/alert_orcl.log

lrwx------ 1 oracle dba 64 Dec 19 21:50 9-> /app/oracle/product/10.2.0/db_1/dbs/hc_orcl.dat

注意其中“/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf(deleted)”字样,表示该文件已经被删除,如果是Solaris操作系统,ls命令不会有如此清晰的显示,为了在Solaris系统中确认哪个句柄对应哪个文件,则需要使用lsof程序。

 

5. 直接cp该句柄文件名回原位置。

ps -ef|grep dbw0|grep -v grep

oracle   2879     1  0 21:38 ?        00:00:00 ora_dbw0_orcl

$ cd /proc/2879/fd

cp 19  /app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf

6. 进行数据文件recover

 

SQL> alter database datafile 4 offline;

 

Database altered.

 

SQL> recover datafile 4;

Media recovery complete.

SQL> alter database datafile 4 online;

 

Database altered.

完成数据文件恢复。

 

恢复的原理是,在Linux操作系统中,如果文件从操作系统级别被rm掉,之前打开该文件的进程仍然持有相应的文件句柄,所指向的文件仍然可以读写,并且该文件的文件描述符可以从/proc目录中获得。但是要注意的是,此时如果关闭数据库,则此句柄会消失,那么除了扫描磁盘进行文件恢复之外就没有其它方法了,因此在数据库出现问题的时候,如果不确认情况的复杂程度,千万不要随便关闭数据库。重启数据库往往是没有意义的,甚至是致命的。

 

当然,客户的操作系统是Solaris,并且客户删除的文件还包括current online redo log,因此还有其它更复杂的操作,不在这里描述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值