这个问题分为两部分。我试图“简单地”将一列添加到一个相当大的表中。当前表有大约2亿行和大约10列,大小约为80 GB,有2个键(主键和另外一个键),并且不断写入(它是实时的)。
我正在尝试按如下方式添加列:
ALTER TABLE my_large_busy_table ADD new_column BIGINT(20);
我遇到的第一个问题是它所花费的时间。在我的最后一次尝试中,我在100分钟后计时。我想确保这是合理的,因为它似乎很长一段时间。我正在考虑的一个选项是关闭所有传入的查询到表,以防止任何类型的阻塞问题,并重新运行没有任何超时限制。
下一个问题是在我之前的查询超时之后,我检查了AWS CloudWatch并注意到我的数据库实例通过另一个~160 GB的可用空间吃了。其中大部分来自ALTER TABLE
命令。根据我的理解,在添加表时,MySQL会将数据复制到新表中。如果是这样的话不应该花费~80 GB(表的大小)?此外,在超时后,空间没有被释放,所以现在我有160 GB的数据,我似乎无法访问,查找或删除。
我正在尝试释放160 GB的空间,并实际将我的列添加到表中。
更新
显然,如果MySQL在更改期间崩溃,InnoDB可能会导致孤立的表,这导致了我的空间问题。请参阅:http://dev.mysql.com/doc/refman/5.0/en/innodb-troubleshooting-datadict.html
我最终通过在MySQL中使用SHOW PROCESSLIST
然后KILL
来修复它。
我没有改变表格,而是创建了一个包含新列的新表格,我将数据复制到更小的块中,这似乎更好。