中午解决温饱问题的时候右眼狂跳,凶兆! 果不其然, 一回到公司开发就告知:数据文件被误操作删除了!! 问其原因,答曰,操作的时候手抖了一下。。。。。靠
登上去检查,由于删除的是一个非关键性的数据文件,所以没有导致业务中断,数据库也很正常的跑着,这是好事,不过丢失的那个文件还是得恢复。
ps -ef |grep ora 得到DBW0的PID 38818, 再通过 lsof -a -p 38818 查出当前DBW0 所操作的所有相关文件,包括被删除的! 在LINUX中,当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录条目。
lsof -a -p 38818
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
oracle 15910 oracle 48uW REG 8 ,2 209723392 9061757 /home/oracle/oradata/cul.dbf
在显示的结果中查找目标文件,LINUX中被删除的文件会被标记为(delete), LUCKY !丢失的数据文件还在打开状态,然后在 /proc/15910/fd/ 找到FD对应的值 48, 这个连接就是对应丢失的文件, 最后通过 cat 48 > /home/oracle/oradata/cul.dbf 重建datafile, 登陆sqlplus ,
alter database create datafile '/home/oracle/oradata/cul.dbf' as '/home/oracle/oradata/cul.dbf' ;
recover datafile '/home/oracle/oradata/cul.dbf' ;
alter datafile '/home/oracle/oradata/cul.dbf' online;
OK~搞定。 这次是运气好,文件丢失的时候估计有脏数据没有commit 所以DBW0一直保持在打开此文件的状态,如果不幸的 在lsof中找不到丢失的文件,那么就只有用backup来恢复了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13351439/viewspace-434737/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13351439/viewspace-434737/