MySQL - 向大型活动表添加列很慢且存储密集

时间:2015-02-12 20:04:55

标签: mysql sql database innodb amazon-rds

这个问题分为两部分。我试图“简单地”将一列添加到一个相当大的表中。当前表有大约2亿行和大约10列,大小约为80 GB,有2个键(主键和另外一个键),并且不断写入(它是实时的)。

我正在尝试按如下方式添加列:

ALTER TABLE my_large_busy_table ADD new_column BIGINT(20);

  1. 我遇到的第一个问题是它所花费的时间。在我的最后一次尝试中,我在100分钟后计时。我想确保这是合理的,因为它似乎很长一段时间。我正在考虑的一个选项是关闭所有传入的查询到表,以防止任何类型的阻塞问题,并重新运行没有任何超时限制。

  2. 下一个问题是在我之前的查询超时之后,我检查了AWS CloudWatch并注意到我的数据库实例通过另一个~160 GB的可用空间吃了。其中大部分来自ALTER TABLE命令。根据我的理解,在添加表时,MySQL会将数据复制到新表中。如果是这样的话不应该花费~80 GB(表的大小)?此外,在超时后,空间没有被释放,所以现在我有160 GB的数据,我似乎无法访问,查找或删除。

  3. 我正在尝试释放160 GB的空间,并实际将我的列添加到表中。

    更新

    显然,如果MySQL在更改期间崩溃,InnoDB可能会导致孤立的表,这导致了我的空间问题。请参阅:http://dev.mysql.com/doc/refman/5.0/en/innodb-troubleshooting-datadict.html

    我最终通过在MySQL中使用SHOW PROCESSLIST然后KILL来修复它。

    我没有改变表格,而是创建了一个包含新列的新表格,我将数据复制到更小的块中,这似乎更好。

0 个答案:

没有答案