大型Innodb表进行变更表
问题描述:
我最近被推入到我们的服务器数据库管理员的位置,所以我不得不学习,因为我去。我们最近发现,其中一个表已经超出了id列,需要迁移到bigint。 这是一个INNODB表,其中大约有大约301GB的数据。我们正在运行mysql版本5.5.38。我正在运行的迁移表的命令是大型Innodb表进行变更表
ALTER TABLE tb_name CHANGE id id BIGINT NOT NULL;
我启动了迁移,现在我们进入迁移18个小时,但是我没有看到服务器上的磁盘空间发生了变化,这让我觉得没有任何事情发生。我们有足够的内存,所以不用担心,但是当我运行“show processlist;”时它仍然显示以下消息状态:
拷贝到tmp下表
有没有人有任何意见或知道我在做什么错误?请询问您是否需要更多信息。
答
是的,这将需要一个looooong时间。磁盘可能会尽可能快地旋转。 (SSD使用速度更快的仓鼠)
您可以杀死ALTER,因为它所做的只是正如它所说的,“复制到tmp表”,之后它会将tmp表重命名为真正的表并且放下旧的副本。
我希望你在开始ALTER
时有innodb_file_per_table = ON
。否则它将扩大ibdata1
,之后不会缩小。
pt-online-schema-change
是一种替代方案。它仍然需要一段时间(有一个额外的'o',因为它会稍微慢一些)。它会在不阻碍其他活动的情况下完成工作。
这可能是检查表中的所有列和索引的好时机:
- 可能一些在INT变成MEDIUMINT或更小的东西?
- 是否有部分INDEX未使用?
- 如何规范化一些VARCHAR?
- 也许甚至分区(但不是没有一个很好的理由)?时间序列是数据仓库的典型用途。
- 总结数据,并至少抛弃较旧的数据?
如果您需要进一步指导,请提供SHOW CREATE TABLE
。
此外,除了alter table,还有没有对数据库运行的进程 – mcsoup
[更改大型MySQL InnoDB表](http://stackoverflow.com/questions/11450089/changing-large-mysql-innodb-tables) –
我检查过,并且有足够的磁盘空间分配。 – mcsoup