在大型Innodb表上执行更改表

时间:2015-06-19 19:25:50

标签: mysql innodb alter

我最近被推到了服务器的数据库管理员的位置,所以我不得不学习。我们最近发现我们的一个表已经最大化了id列,需要迁移到bigint。 这是针对INNODB表,大约有大约301GB的数据。我们正在运行mysql版本5.5.38。我正在运行的用于迁移表的命令是

  

ALTER TABLE tb_name CHANGE id id BIGINT NOT NULL;

我启动了迁移,现在我们已经进入了迁移18个小时,但是我没有看到服务器上的磁盘空间发生变化,这让我觉得没有任何事情发生。我们有足够的内存,所以没关注,但是当我运行“show processlist;”时它仍然显示以下消息状态

  

复制到tmp表

有没有人有任何想法或知道我做错了什么?请询问您是否需要更多信息。

1 个答案:

答案 0 :(得分:0)

是的,这需要花费很多时间。磁盘可能会尽可能快地旋转。 (SSD使用更快的仓鼠。)

你可以杀死ALTER,因为它正在做的就是“复制到tmp表”,之后它会将tmp表重命名为真实表并删除旧副本。

我希望您在innodb_file_per_table = ON开始时ALTER。否则它将扩展ibdata1,之后不会缩小。

pt-online-schema-change是另一种选择。它仍然需要一个loooooong时间(一个额外的'o'因为它会稍微慢一点)。它将在不阻止其他活动的情况下完成工作。

这可能是检查表中所有列和索引的好时机:

  • 是否可以将某些INT转换为MEDIUMINT或更小的内容?
  • 是否有一些INDEX未使用?
  • 如何规范化某些VARCHAR?
  • 甚至可能是PARTITIONing(但并非没有充分理由)?时间序列是数据仓库的典型用法。
  • 汇总数据,至少抛出较旧的数据?

如果您需要进一步的指导,请提供SHOW CREATE TABLE

相关问题