Oracle数据恢复 - Linux / Unix 误删除的文件恢复

转载 2011年12月23日 13:03:16

今天有客户的数据库意外被删除了整个目录中的数据文件,操作系统级别的删除,然而幸运的是这个数据库没有崩溃,仍然处于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 as select * 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该句柄文件名回原位置。

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,因此还有其它更复杂的操作,不在这里描述。

Oracle数据库数据文件rm -rf误删除后恢复

Oracle数据库中表空间的数据文件在基于OS系统级别被rm -rf 删除后,只要数据库在删除后一直未被shutdown,那么就可以手动恢复,恢复的前提是Oracle安装在Linux系统下,下面是一个...
  • a58457432
  • a58457432
  • 2014年05月30日 15:00
  • 1222

oracle数据库delete删除数据恢复的方法

本文我是在论坛上看过收集整理测试过。  SCN(系统改变号),它的英文全拼为:System Change Number ,它是数据库中非常重要的一个数据结构。   SCN提供了Oracle的内部时...
  • wangdinghai365
  • wangdinghai365
  • 2013年02月20日 11:51
  • 16399

ext2文件系统下rm-rf * 误删数据恢复

如果你不小心执行了rm -rf * 或者 rm -rf XXX,在ext2系统并不是不可以恢复的。 一. 首先需要明确几个基本概念:磁盘设备文件(简称硬盘)、分区、文件系统、目录&文件 磁...
  • doris_crazy
  • doris_crazy
  • 2016年05月14日 16:55
  • 844

Linux文件误删除恢复操作

本文参考http://write.blog.csdn.net/postedit?ticket=ST-491405-OGjDDusZeyMgVQ7bHW7f-passport.csdn.net 前言 作...
  • xiaoshunzi111
  • xiaoshunzi111
  • 2017年06月21日 13:51
  • 5312

linux系统rm误删文件恢复 ext4

系统:oracle linux OEL6.5 分区格式:ext4
  • xwl145
  • xwl145
  • 2014年08月28日 13:29
  • 2283

人工误删除innodb ibdata数据文件,如何恢复

1.用sysbench模拟数据写入 sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=1000000 --max-r...
  • zengxuewen2045
  • zengxuewen2045
  • 2016年08月27日 07:03
  • 807

Linux命令行删除文件恢复(Ubuntu)

在Linux系统下,通过命令“rm -rf”可以将任何数据直接从硬盘删除,并且没有任何提示,同时Linux下也没有与Windows下回收站类似的功能,也就意味着,数据在删除后通过常 规的手段是无法恢复...
  • j_d_c
  • j_d_c
  • 2015年11月21日 12:28
  • 2538

使用文件句柄方式恢复误删除的Oracle数据文件

环境说明: 操作系统:Linux 数据库版本:11.2.0.4begin~ 创建表空间test_tb SQL> create tablespace test_tb datafile '/u01/a...
  • yitu1314
  • yitu1314
  • 2017年05月26日 10:25
  • 307

oracle数据闪回功能(恢复误删除的表信息)

1  ORACLE用PL/SQL提交数据后执行回滚的方法 SELECT * FROM TABLE_1 AS OF TIMESTAMP TO_TIMESTAMP('20080606 20:00:00'...
  • zhousenshan
  • zhousenshan
  • 2016年02月22日 19:24
  • 1961

利用Percona xtrabackup恢复误删除数据

在利用Percona xtrabackup做了一个全备及两个增量备份后,一个表的部分数据被误删除了,怎样恢复误删除数据呢?   思路:将全备及增量备份,最新的备份后产生的二进制日志全部拷贝到测试环...
  • YABIGNSHI
  • YABIGNSHI
  • 2016年03月27日 02:36
  • 561
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle数据恢复 - Linux / Unix 误删除的文件恢复
举报原因:
原因补充:

(最多只允许输入30个字)