记一次mysql执行optimize table时中断导致产生巨大文件问题

时间: | 分类: MySQL笔记

笔者是某个minecraft服务器的管理,其中有个插件每个月大约会生成1亿条记录,需要定期清理,于是先执行了delete命令删除了部分无用数据。

数据库类型:innodb
版本:5.7

清理后为了释放空间,执行了optimize table,但是执行到一半超时了,重新连接后发现磁盘空间莫名其妙少了几十G,使用show tables 也看不出来在哪里。笔者以为是表的问题,将表dump出来后再导入回去问题依旧。

于是笔者使用了以下命令,发现了问题的文件:

find / -type f -size +500M

列出所有大于500M的文件

/var/lib/mysql/coreprotect/co_cz_block.ibd
/var/lib/mysql/coreprotect/co_sc_entity.ibd
/var/lib/mysql/coreprotect/co_sc_container.ibd
/var/lib/mysql/coreprotect/co_sc_block.ibd
/var/lib/mysql/coreprotect/#sql-ib101-778893620.ibd
/var/lib/mysql/ibdata1

其中的#sql-ib101-778893620.ibd 就是问题的文件,经过查询发现一些信息:

If MySQL crashes in the middle of an ALTER TABLE operation, you may end up with an orphaned temporary table inside the InnoDB tablespace. Using the Table Monitor, you can see listed a table with a name that begins with #sql-. You can perform SQL statements on tables whose name contains the character “#” if you enclose the name within backticks. Thus, you can drop such an orphaned table like any other orphaned table using the method described earlier. To copy or rename a file in the Unix shell, you need to put the file name in double quotation marks if the file name contains “#”.

大意就是这个是在alter table时未执行完毕才会产生的表

注意:不应该直接删除,而需要使用drop tables删除,否则会产生孤立表

参考网址

但笔者将其移动到另一个目录后重启mysql,并没有报错,可能是新版本修复了这个问题?


MySQL



白咲美绘瑠's blog