现在的位置: 首页 > 综合 > 正文

下厨房事故认识Linux文件句柄(fd)

2013年10月30日 ⁄ 综合 ⁄ 共 1388字 ⁄ 字号 评论关闭
以下内容摘自下厨房对公众的致歉信:
"
先使用了rm -f方式删除备份节点分区上的所有文件,5分钟后
发现刚才删除的是数据库主节点的分区,为防止硬盘继续写入,就马上把mysql进程停止了

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

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


但是,"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最大线程数限制


有些服务器上跑了MySQL,Apache,Oracle,,,,比较夸张,这时就很有必要对打开的文件数作修改

而且,直接或间接使用mysqld_safe启动MySQL时,其实是在启动mysqld之前,调用了ulimit -n $open_files来实现文件描述符的限制

有2个层面上的修改:

/etc/security/limits.conf针对单个应用程序,如MySQL

/proc/sys/fs/file-max针对整个Linux系统,比如MySQL+Oracle+Apache代数和

对于单个应用程序,例子如下:

cat /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576 

而对于永久修改整个Linux系统打开文件数的限制

可以往/etc/sysctl.conf追加一个值:fs.file-max=1048567然后sysctl -p

再sysctl fs.file-max做确认



参考文章:

http://cherry.world.edoors.com/CPZKoGkpxfbQ
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

抱歉!评论已关闭.