![删除 1TB Mysql 表以释放磁盘空间后,如何从 MySql 中删除文件句柄?](https://linux22.com/image/691132/%E5%88%A0%E9%99%A4%201TB%20Mysql%20%E8%A1%A8%E4%BB%A5%E9%87%8A%E6%94%BE%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4%E5%90%8E%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BB%8E%20MySql%20%E4%B8%AD%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%8F%A5%E6%9F%84%EF%BC%9F.png)
在我们的生产系统中,我们最近删除了一个 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 身份执行。