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

删除 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+ 的速度运行,我真的希望避免停机。

有没有办法删除文件句柄并释放占用的磁盘空间?

答案1

显而易见的解决方案是终止(或重新启动)持有文件描述符的进程(lsof输出中显示的进程 ID 38115)。

如果您不想这样做,您可以截断文件(即使已删除)以释放磁盘空间。您可以尝试以下操作:

$ :> /proc/38115/fd/11

其中38115是进程 ID,11是文件描述符。需要时请不要忘记以 root 身份执行。

相关内容