在我们的生产系统中,我们最近删除了一个 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 身份执行。