大型Innodb表进行变更表

问题描述:

我最近被推入到我们的服务器数据库管理员的位置,所以我不得不学习,因为我去。我们最近发现,其中一个表已经超出了id列,需要迁移到bigint。 这是一个INNODB表,其中大约有大约301GB的数据。我们正在运行mysql版本5.5.38。我正在运行的迁移表的命令是大型Innodb表进行变更表

ALTER TABLE tb_name CHANGE id id BIGINT NOT NULL;

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

拷贝到tmp下表

有没有人有任何意见或知道我在做什么错误?请询问您是否需要更多信息。

+0

此外,除了alter table,还有没有对数据库运行的进程 – mcsoup

+1

[更改大型MySQL InnoDB表](http://*.com/questions/11450089/changing-large-mysql-innodb-tables) –

+0

我检查过,并且有足够的磁盘空间分配。 – mcsoup

是的,这将需要一个looooong时间。磁盘可能会尽可能快地旋转。 (SSD使用速度更快的仓鼠)

您可以杀死ALTER,因为它所做的只是正如它所说的,“复制到tmp表”,之后它会将tmp表重命名为真正的表并且放下旧的副本。

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

pt-online-schema-change是一种替代方案。它仍然需要一段时间(有一个额外的'o',因为它会稍微慢一些)。它会在不阻碍其他活动的情况下完成工作。

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

  • 可能一些在INT变成MEDIUMINT或更小的东西?
  • 是否有部分INDEX未使用?
  • 如何规范化一些VARCHAR?
  • 也许甚至分区(但不是没有一个很好的理由)?时间序列是数据仓库的典型用途。
  • 总结数据,并至少抛弃较旧的数据?

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