繁体   English   中英

在大型Innodb表上执行更改表

[英]Performing Alter Table on Large Innodb table

我最近被迫进入服务器的db admin位置,所以我必须不断学习。 最近,我们发现我们的一个表已使id列最大化,需要将其迁移到bigint。 这用于具有大约301GB数据的INNODB表。 我们正在运行MySQL版本5.5.38。 我正在迁移表的命令是

ALTER TABLE tb_name更改ID id BIGINT不为NULL;

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

复制到tmp表

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

是的,这需要很长时间。 磁盘可能正在尽可能快地旋转。 (SSD使用更快的仓鼠。)

您可以杀死ALTER,因为它所做的只是“复制到tmp表”,然后将tmp表重命名为真实表并删除旧副本。

我希望您在启动ALTER时拥有innodb_file_per_table = ON 否则它将扩展ibdata1 ,此后不会收缩。

pt-online-schema-change是一种替代方法。 仍然会花很长的时间(加上一个额外的“ o”,因为它会稍微慢一些)。 它将完成这项工作,而不会阻止其他活动。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM