ALTER TABLE ADD COLUMN需要很长时间

我只是试图添加一个名为“位置”的列到数据库中的表(main_table)。 我运行的命令是

ALTER TABLE main_table ADD COLUMN location varchar (256); 

main_table包含> 2,000,000行。 它运行了2个多小时,仍然没有完成。

我试图用mytop来监视这个数据库的活动,以确保查询不被其他查询进程locking,但似乎没有。 是否应该花费很长时间? 其实我只是在运行这个命令之前重新启动了机器。 现在这个命令仍在运行。 我不知道该怎么做。

您的ALTER TABLE语句意味着mysql将不得不重新编写包含新列的表中的每一行。 由于你有超过200万行,我一定会期望它需要大量的时间,在这期间你的服务器可能会主要是IO的限制。 您通常会发现执行以下操作会更高效:

 CREATE TABLE main_table_new LIKE main_table; ALTER TABLE main_table_new ADD COLUMN location varchar(256); INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table; RENAME TABLE main_table TO main_table_old, main_table_new TO main_table; DROP TABLE main_table_old; 

通过这种方式,你可以在空表上添加列,并且基本上把数据写入新表中,你确定没有其他人在locking那么多的资源。

我认为适当的答案是使用像pt-online-schema-change或gh-ost这样的function 。

我们已经完成了超过40亿行的迁移,尽pipe可能需要长达10天的时间,停机时间还不到一分钟。

Percona的工作方式与上面非常相似

  • 创build一个临时表
  • 在第一个表上创build触发器(用于插入,更新和删除),以便将它们复制到临时表中
  • 小批量迁移数据
  • 完成后,将表格重命名为新表格,然后删除另一个表格