oracle 删除了 /oradata 下一些dbf文件,实例还在运行,怎么恢复?

linux系统上,如果不小心删除了oracle数据库的/oradata目录下一些dbf文件,实例还在运行的情况下,可以尝试cp命令进行恢复。

简要过程

由于实例还存在,对这些文件读写的ckpt、lgwr、dbw等进程的句柄还没释放,可以用root检查一下

lsof |grep  deleted | grep oradata

输出信息类似如下:在这里插入图片描述可能会有多个进程访问同一文件,所以会看到多条信息。
以sysaux01.dbf 为例,进入到/proc/<dbw进程号>/fd目录下,看到句柄号(蓝色箭头所指) 在这里插入图片描述 可以 cp /proc/进程号/fd/文件句柄号<蓝框> <红框中对应的文件名> 将数据文件恢复回来。

cp /proc/120453/fd/259 /u01/app/oracle/oradata/ORCL/sysaux01.dbf
在这里插入图片描述
关键脚本

因为这些信息会重复,用以下脚本更省力些,建议分步执行,检查无误后再执行最后的cp.sh

LANG=C
rm -fr /tmp/df.txt
for i in  `ps -ef | grep ora_ | grep  -v  grep | awk '{print  $2 }'`
do
ls -l /proc/$i/fd | grep deleted | awk -v id=$i '{print "cp /proc/"id"/fd/"$9,$11}' >> /tmp/df.txt
done
awk '!a [$3]++{print}' /tmp/df.txt > /tmp/cp.sh
sh  /tmp/cp.sh

剩下就等待cp完成吧,如果所有被删除文件小于100G,那么半小时能够恢复出来(省心省力)。

最后

此案例面对场景是:
1、归档模式下,非归档应该也行;
2、已经提前设置了

alter system set  "_datafile_write_errors_crash_instance" =false;

否则删掉1个文件,实例会自己宕机;
3、删除部分dbf文件,如果删除了全部,实例会自己宕机;
4、实例还在运行中,这是关键的前提条件
由于文件被多个进程读写,因此lsof看到的信息重复,上面的脚本就能够简化筛选过程。如果上来就关闭实例,那就只能考虑恢复了。
另外:文章标题应该是《一种去重lsof后恢复误删oracle文件的方法》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值