非常大的MySQL数据库,删除了一列,并且数据库的大小增加了50%

时间:2014-07-03 02:28:20

标签: mysql database phpmyadmin

我有一个20GB的MySQL数据库,在一个表中包含大约3000万行数据。我想删除该表中的一列以清理一些空间。

我通过phpMyAdmin删除了这个列,花了大约15分钟,检查了我服务器中的磁盘使用情况。在删除填充数据的列后,它从20gb变为28gb。

我做错了什么吗?我错过了一些明显的东西吗?

我在尝试删除列时没有做任何其他事情。

更新:实际上,当我转到列出phpMyAdmin中的表的数据库摘要页面时,它还列出了它们的大小。表的大小最多只能增加10GB。

当我通过df -h检查我的服务器上使用的大小时,它说/ dev / vda使用28gb。

服务器上唯一的其他文件是一些小的PHP文件。什么是这个18gb的差距?

1 个答案:

答案 0 :(得分:2)

最有可能的解释是您没有使用每表文件模式,并且在ALTER TABLE期间包含所有表和索引的ibdata1文件增加了。删除列时,MySQL必须创建表的新副本,将所有数据移入其中(减去您删除的列),然后删除原始表。在此过程结束时,需要同时存储表的两个副本(减去您在一个副本中删除的列)。然后,当它完成时,它会删除原始副本,并且该空间可以在将来重复使用。

不幸的是,有no way to shrink the ibdata1。它的大小与其高水位相当。要恢复磁盘空间,您必须:

  1. 转储所有InnoDB表(或暂时将其转换为MyISAM)
  2. 关闭MySQL服务器
  3. 删除ibdata1和ib_logfile *
  4. 在my.cnf
  5. 中设置innodb_file_per_table=1
  6. 重新启动。缺少的ibdata1将以初始默认大小创建。
  7. 导入您的数据。
  8. 现在这些表将占用每个表的单独文件。当你改变或优化它们时,它们将恢复空间。默认情况下,在MySQL 5.6中启用此模式。