Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3551966
  • 博文数量: 715
  • 博客积分: 1860
  • 博客等级: 上尉
  • 技术积分: 7745
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-07 08:51
个人简介

偶尔有空上来看看

文章分类

全部博文(715)

文章存档

2023年(75)

2022年(134)

2021年(238)

2020年(115)

2019年(11)

2018年(9)

2017年(9)

2016年(17)

2015年(7)

2014年(4)

2013年(1)

2012年(11)

2011年(27)

2010年(35)

2009年(11)

2008年(11)

最近访客

分类: Oracle

2021-04-28 16:21:16


要冷静

今日遇到一个案例,数据库没了,检查/oradata下,空空如也
再看实例
ps -ef|grep ora_
数据库进程都在
检查alert.log,不断提示找不到redo文件

明白了,可能是某人执行了rm -fr /oradata,把所有文件删除了,但是实例还在运行着。

此时的处理办法
ps -ef|grep ckpt 找到ckpt的进程号,例如25671
cd /proc/25671/fd
ls -l |grep delete
会看到很多被删除的文件号及对应的文件名,直接复制这些编号为对应的文件名
cp 256   /oradata/system01.dbf
cp 254   /oradata/users01.dbf
...
有的被删文件可能在smon的进程号下,或者在lgwr的进程号下能看到。

小技巧:
一个一个进程找全所有文件比较麻烦,可以这样:


  1. 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




都复制出来后,直接执行alter system switch logfile; 都不报错。
此刻最好做一次全库逻辑导出,因为关库再启动可能会有问题。

由于测试库,胆大操作时直接关闭实例,然后重启,启动后报错
ORA-00600: 内部错误代码, 参数: [kcratr_scan_lastbwr]

执行recover database;  
alter database open;
数据库打开了,皆大欢喜!

阅读(1326) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~