Mysql 更改大型表中列的数据类型。性能问题

Mysql 更改大型表中列的数据类型。性能问题,mysql,alter,Mysql,Alter,我想在我的表上运行此操作: ALTER TABLE table_name MODIFY col_name VARCHAR(255) 但我的桌子很大,有6500多万行。现在当我执行时,执行这个命令需要将近50分钟。有没有更好的方法来更改表格?嗯,您需要 ALTER TABLE table_name CHANGE col_name new_name VARCHAR(255) 但是,你是对的,改变需要一段时间。在MySQL中确实没有更快的方法来更改表 您的问题是否在变更期间停机?如果是这样,这里

我想在我的表上运行此操作:

ALTER TABLE table_name MODIFY col_name VARCHAR(255)
但我的桌子很大,有6500多万行。现在当我执行时,执行这个命令需要将近50分钟。有没有更好的方法来更改表格?

嗯,您需要

 ALTER TABLE table_name CHANGE col_name new_name VARCHAR(255)
但是,你是对的,改变需要一段时间。在MySQL中确实没有更快的方法来更改表

您的问题是否在变更期间停机?如果是这样,这里有一种可能的方法:将表复制到新表,然后更改副本上的列名,然后重命名副本


您可能已经发现,在生产系统中定期更改表中的列名不是一个好主意。

您可以使用Oak处理模式更改,而不会停机

复制原始表的架构,应用更改,然后复制数据。当oak在原始表上放置一些触发器时,仍然可以调用CRUD操作,因此在操作过程中不会丢失任何数据


请参阅oak的作者对这一机制的详细解释,并建议使用其他工具。

另一种使用percona工具包的变体

不,会很慢。ALTER语句是一次性操作。等着吧,希望你不用再做了。大桌子?不,非常大?是的,是的。我无法承受50分钟的停机时间,因为在此期间所有行都将被锁定,这将阻止此表上的其他操作(CRUD)。哦这意味着,如果复制表,在重新组织新表时,旧表中将出现新的行和更改的行。如果这是我的项目,我现在会尝试决定更改此列名的重要性。是的。我能做一件事。宣布停机时间为1小时,并在负载减少时进行更改。可能在午夜。不过,感谢您的投入。宣布停机两小时。这样一来,你就不会惹恼每个人,而是在你提前完成休息时让他们高兴。