日期:2014-05-16  浏览次数:21004 次

下厨房事故认识Linux文件句柄(fd)
以下内容摘自下厨房对公众的致歉信:
"
先使用了rm -f方式删除备份节点分区上的所有文件,5分钟后
发现刚才删除的是数据库主节点的分区,为防止硬盘继续写入,就马上把mysql进程停止了

"
第一时间停止MySQL防止硬盘继续写入这个应急措施是错误的!
正常如果进程没有被关闭,进程所打开的文件是不会被删除的
可以通过从/proc文件系统拷贝的方式恢复出当前仍然打开的文件
诸如rm,drop...等存在误删除风险的命令,意识到之后的第一反应该是:

哪些进程依旧打开了这些文件,如果有,立即从其文件描述符恢复,recovering files from /proc


但是,"Every coin has two sides",以上是fd的优点,不过这也给Linux用户造成一个现象:
为啥有时候df -h看磁盘剩余空间很小,而du -shc看具体目录大小,又没有占用那么多呢?
也就是说,文件删除后,空间并没有得到释放
这很可能是有的文件删除了,但是还被某些进程占用着文件句柄
lsof | grep delete 看看,是不是有进程占用了被删除的文件句柄
重启下这些进程kill -HUP释放文件句柄即可
删除文件后应该释放文件句柄才能释放空间


至于名字,windows上叫文件句柄,Linux上叫文件描述符,英文缩写是fd
每个进程至少都会打开三个文件:标准输入,标准输出,标准错误输出
他们对应的文件句柄是:0,1,2
涉及到文件句柄,有2个命令比较常用:ulimit和lsof
感兴趣的朋友可以参考我之前写的文章:

lsof:lsof 应用实例分享以及Oracle 数据文件删除恢复测试

ulimit:Linux ulimit和动态修改MySQL最大线程数限制


参考文章:
http://www.hackinglinuxexposed.com/articles/20020507.html
http://tech.xiachufang.com/?p=18
http://www.orczhou.com/index.php/2013/07/how-to-recover-data-from-mysql-innodb-data-file-ibd-file/


By 迦夜
2013-10-3
Good Luck