实验环境:
CentOS 6.4
Oracle 11.2.0.3.0
1.模拟误删除了Oracle的数据文件
下面是Oracle的数据文件目录
删除所有的文件.
[oracle@master orcl]$ rm -rf *
[oracle@master orcl]$ ls
[oracle@master orcl]$
这个时候千万不要关闭数据库实例
2.恢复数据文件
首先找到dbwn的进程号(PID),可以看到pid是3030
[oracle@master orcl]$ ps -ef | grep ora_dbw | grep -v grep
oracle 3030 1 0 09:14 ? 00:00:01 ora_dbw0_orcl
进入这个进程的目录
[root@master fd]# cd /proc/3030/fd
可以看到相关的文件都已经删除
现在只需要将删除的文件拷贝回原位置即可.
如cp 256 /home/oracle/app/oracle/oradata/orcl/control01.ctl
但是文件数量较大,可以使用AWK拼接命令
[root@master fd]# ll | awk '/deleted/{print "cp "$9" "$11}' > /tmp/test.sh
[root@master fd]# source /tmp/test.sh
3.同理,恢复日志文件
[root@master fd]# ps -ef | grep ora_lgwr | grep -v grep
oracle 3032 1 0 09:14 ? 00:00:09 ora_lgwr_orcl
进入lgwr进程的目录
[root@master fd]# cd /proc/3032/fd
恢复redolog
[root@master fd]# ll | awk '/deleted/{print "cp "$9" "$11}' | grep redo > /tmp/test.sh
[root@master fd]# source /tmp/test.sh
其中/tmp/test.sh的内容如下
cp 258 /home/oracle/app/oracle/oradata/orcl/redo01.log
cp 259 /home/oracle/app/oracle/oradata/orcl/redo02.log
cp 260 /home/oracle/app/oracle/oradata/orcl/redo03.log
4.重启数据库实例
文件恢复之后,停止数据库实例,重新设置文件的属主和属组(一般使用root恢复,需要重新设置为原用户)
重启数据库实例,发现控制文件不一致,用其他控制文件覆盖即可(多路复用控制文件的好处).
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup open;
ORACLE instance started.
Total System Global Area 784998400 bytes
Fixed Size 2232472 bytes
Variable Size 478154600 bytes
Database Buffers 297795584 bytes
Redo Buffers 6815744 bytes
ORA-00214: control file
'/home/oracle/app/oracle/fast_recovery_area/orcl/control02.ctl' version 1946
inconsistent with file '/home/oracle/app/oracle/oradata/orcl/control01.ctl'
version 1939
总结:
1.
在误删除发生的时候,千万不要停止数据库
实例.只要进程还握有文件句柄,还是有可能恢复的.
2.直接查找lgwr的进程比查找dbwn要好.因为lgwr除了握有数据文件的句柄还握有日志文件的句柄.
3.经过实验,MySQL数据库不能使用这种方式恢复.因为MySQL进程不会握有所有文件的句柄,即使使用这种方式恢复了部分文件,也不能启动数据库实例.
参考:
http://www.xifenfei.com/5640.html
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-1408521/,如需转载,请注明出处,否则将追究法律责任。