Ubuntu系统中MySQL的/var/lib/mysql/table文件是什么?如何缩小其体积?
那个50GB的
table文件到底是什么? 首先,大概率这是InnoDB共享表空间的遗留文件——说不定你之前修改过MySQL的配置,把默认的ibdata1共享表空间文件名改成了table。为啥它能涨到50GB,但你所有数据库加起来才几百MB?核心原因是InnoDB的共享表空间有个“抠门”的特性:当你删除大表或者大量数据后,它不会把空出来的磁盘空间还给操作系统,而是留着给未来的数据使用,所以文件体积会一直保持在曾经的最大值。
当然也有小概率是以下情况:
- 某个已经被删除的大表的表空间文件(比如你删了表,但文件没被MySQL自动清理)
- MySQL执行大查询/排序操作时生成的临时文件(比如内存不够用,写到磁盘上的临时表,但正常情况下进程结束后会自动删除,除非MySQL意外崩溃了)
怎么把它缩小体积?
这个操作有风险,一定要先备份所有数据! 步骤如下:
全量备份你的数据库
用mysqldump把所有数据导出来,这是兜底的关键:mysqldump -u root -p --all-databases --flush-privileges --routines --events > full_backup.sql输入MySQL root密码后等待完成,确保备份文件能正常打开。
停止MySQL服务
sudo systemctl stop mysql清理旧的大文件和日志
- 先确认
table是不是共享表空间:打开MySQL的配置文件(一般是/etc/mysql/my.cnf或者/etc/mysql/mysql.conf.d/mysqld.cnf),找到innodb_data_file_path配置项,如果写的是table:10M:autoextend,那百分百就是它了。 - 删除这个大文件:
sudo rm /var/lib/mysql/table - 顺便把InnoDB的日志文件也删了,不然重启可能报错:
sudo rm /var/lib/mysql/ib_logfile*
- 先确认
(可选)配置独立表空间,避免以后再踩坑
要是不想以后再出现这种“删了数据文件还不缩水”的情况,就在配置文件里添加一行:innodb_file_per_table = 1这样每个表会生成单独的
.ibd文件,删除表的时候会自动释放磁盘空间,省心很多。重启MySQL并恢复数据
- 启动MySQL,它会自动生成新的、小巧的
table文件和日志文件:sudo systemctl start mysql - 导入之前的备份:
mysql -u root -p < full_backup.sql
- 启动MySQL,它会自动生成新的、小巧的
检查结果
去/var/lib/mysql目录下看看table的大小,现在应该和你数据库的实际总大小匹配了,再确认下所有表和数据都正常能用。
如果这个table只是临时文件(比如MySQL崩溃留下的),那直接停服务删文件再重启就行,但这种情况比较少见,还是按上面的共享表空间处理更稳妥。
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

