在我们的生产系统上,我们最近丢了1TB的表。 删除完成后,表消失在mysql中,但文件仍然存在于/ lib / mysql / dbname /文件夹中。 (我们使用每个表设置一个文件)我删除了与表关联的文件。
所以我查了一下
lsof | grep crawl_link | grep deleted
发现mysql进程仍然有打开的句柄
mysqld 38115 mysql 11uW REG 8,3 1016938364928 182524780 /var/lib/mysql/seobility/_crawl_links_new.ibd (deleted) mysqld 38115 2110 mysql 11uW REG 8,3 1016938364928 182524780 /var/lib/mysql/seobility/_crawl_links_new.ibd (deleted) mysqld 38115 4530 mysql 11uW REG 8,3 1016938364928 182524780 /var/lib/mysql/seobility/_crawl_links_new.ibd (deleted) mysqld 38115 8192 mysql 11uW REG 8,3 1016938364928 182524780 /var/lib/mysql/seobility/_crawl_links_new.ibd (deleted) (Total 120 Lines)
我知道这个问题将通过重新启动MySql来解决,但我们的数据库运行在2TB +,我真的想避免宕机。
有没有办法删除文件句柄,并释放磁盘空间占用?
显而易见的解决scheme是杀死(或重启)持有文件描述符的进程(进程ID 38115,如lsof
输出所示)。
如果你不想这样做,你可以截断文件(即使它被删除)来释放磁盘空间。 您可以尝试以下方法:
$ :> /proc/38115/fd/11
其中38115
是进程ID, 11
是文件描述符。 不要忘记在需要时以root身份执行。