删除1TB Mysql表后如何从MySql中删除文件句柄以释放磁盘空间?

在我们的生产系统上,我们最近丢了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身份执行。