我有一个20GB的MySQL数据库,在一个表中包含大约3000万行数据。我想删除该表中的一列以清理一些空间。
我通过phpMyAdmin删除了这个列,花了大约15分钟,检查了我服务器中的磁盘使用情况。在删除填充数据的列后,它从20gb变为28gb。
我做错了什么吗?我错过了一些明显的东西吗?
我在尝试删除列时没有做任何其他事情。
更新:实际上,当我转到列出phpMyAdmin中的表的数据库摘要页面时,它还列出了它们的大小。表的大小最多只能增加10GB。
当我通过df -h检查我的服务器上使用的大小时,它说/ dev / vda使用28gb。
服务器上唯一的其他文件是一些小的PHP文件。什么是这个18gb的差距?
答案 0 :(得分:2)
最有可能的解释是您没有使用每表文件模式,并且在ALTER TABLE期间包含所有表和索引的ibdata1
文件增加了。删除列时,MySQL必须创建表的新副本,将所有数据移入其中(减去您删除的列),然后删除原始表。在此过程结束时,需要同时存储表的两个副本(减去您在一个副本中删除的列)。然后,当它完成时,它会删除原始副本,并且该空间可以在将来重复使用。
不幸的是,有no way to shrink the ibdata1。它的大小与其高水位相当。要恢复磁盘空间,您必须:
innodb_file_per_table=1
现在这些表将占用每个表的单独文件。当你改变或优化它们时,它们将恢复空间。默认情况下,在MySQL 5.6中启用此模式。