Linux 下Oracle 数据文件被物理误删除的恢复



不同于从Oracle中drop掉数据文件,在某些情况下,可能会遇到数据库在运行时数据文件在操作系统级别被删除,而此时Oracle实例并未崩溃,仍然处于open状态。此时就要求尽量在最小的影响下最高效率地完成恢复。现将恢复过程整理出来,以备不时之需。


以下是在Linux下大致演示一下恢复的过程,恢复的步骤与数据库版本没有太大关系,与操作系统的不同会有所不同。
<<过程模拟>>
<STEP 1>模拟删除
SQL> select name from v$datafile;


NAME
--------------------------------------------------------------------------------
/storage/oradata/ORCL/datafile/o1_mf_system_7f53s8hn_.dbf
/storage/oradata/ORCL/datafile/o1_mf_undotbs1_7f53s8qp_.dbf
/storage/oradata/ORCL/datafile/o1_mf_sysaux_7f53s8jk_.dbf
/storage/oradata/ORCL/datafile/o1_mf_users_7f53s8tq_.dbf


SQL> ho rm /storage/oradata/ORCL/datafile/o1_mf_users_7f53s8tq_.dbf   --删除用户数据文件;


SQL> create table a tablespace users as select * from dual --尝试在被删除数据文件的表空间上写数据出错
                                                 *
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4:
'/storage/oradata/ORCL/datafile/o1_mf_users_7f53s8tq_.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
<STEP 2>通过句柄恢复数据文件
SQL> ho
[oracle@oel ~]$ ps -ef|grep dbw0|grep -v grep  --先找出db writer所对应的PID(1907)
oracle    1907     1  0 07:42 ?        00:00:00 ora_dbw0_orcl
[oracle@oel ~]$ ll /proc/1907/fd |grep deleted --再找出被进程所删除文件的句柄(24)
lrwx------. 1 oracle oinstall 64 Mar  5 08:05 24 -> /storage/oradata/ORCL/datafile/o1_mf_users_7f53s8tq_.dbf (deleted)
lrwx------. 1 oracle oinstall 64 Mar  5 07:52 7 -> /oradata/app/oracle/product/10.2.0/db_1/dbs/lkinstorcl (deleted)


[oracle@oel ~]$ cp /proc/1907/fd/24 /storage/oradata/ORCL/datafile/o1_mf_users_7f53s8tq_.dbf --将被删数据文件的句柄拷贝回数据文件
[oracle@oel ~]$ ll /storage/oradata/ORCL/datafile/ --通过前面操作,数据文件已经被恢复到原来的目录下
total 763772
-rw-r-----. 1 oracle oinstall 241180672 Mar  5 07:58 o1_mf_sysaux_7f53s8jk_.dbf
-rw-r-----. 1 oracle oinstall 503324672 Mar  5 08:08 o1_mf_system_7f53s8hn_.dbf
-rw-r-----. 1 oracle oinstall  20979712 Nov 28 03:29 o1_mf_temp_7f53wqdm_.tmp
-rw-r-----. 1 oracle oinstall  26222592 Mar  5 08:08 o1_mf_undotbs1_7f53s8qp_.dbf
-rw-r-----. 1 oracle oinstall   5251072 Mar  5 08:10 o1_mf_users_7f53s8tq_.dbf
-rw-r-----. 1 oracle oinstall   5251072 Mar  5 07:41 o1_mf_users_7f53s8tq_.dbf.bak
[oracle@oel ~]$exit
<STEP 3>通过日志恢复事务
接下来便是事务的恢复操作,分为两种情况:
1)对于归档模式,只需简单offline掉数据文件,进行recover最后再将数据文件online即可,如:
SQL> alter database datafile 4 offline;
Database altered.
 
SQL> recover datafile 4;
Media recovery complete.
SQL> alter database datafile 4 online;
Database altered.


2)如果是非归档,那么作offline datafile的时候会遇到ORA-01145错误,但是可以在copy完文件句柄之后,尝试offline tablespace,然后再online tablespace,这时候会要求恢复之前误删除的文件,如果日志组还没有切换到全部覆盖,那么recover是可以成功的。
SQL> alter tablespace users offline;
Tablespace altered.


SQL> recover datafile 4 ;          
Media recovery complete.
SQL> alter tablespace users online;
Tablespace altered.
至此恢复完成!


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


参考自:KAMUS—“How to Recover Datafile Which Deleted Accidentally in Linux”






E.O.F
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值