要冷静
今日遇到一个案例,数据库没了,检查/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的进程号下能看到。
小技巧:
一个一个进程找全所有文件比较麻烦,可以这样:
-
-
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;
数据库打开了,皆大欢喜!
阅读(1375) | 评论(0) | 转发(0) |