【问题标题】:How to insert a new column in a huge MYSQL Database Table?如何在巨大的 MYSQL 数据库表中插入新列?
【发布时间】:2012-12-21 04:50:19
【问题描述】:

我在 MYSQL 数据库中有这张表,它有大约 1000 万条记录/行。我想在表中插入一个新的column。然而,一个简单的插入列查询对我来说似乎并不适用。

这是我尝试过的, ALTER TABLE contacts ADD processed INT(11);

我等了大约 5 个小时,但什么也没发生。有没有办法在这么大的表中插入新列?

希望我的问题很清楚。任何帮助将不胜感激。

【问题讨论】:

  • 是生产吗?有什么CPU?服务器是否超载?
  • @RomanNewaza 它不在本地生产中。我有 4GB ram i5 处理器。而且我不认为服务器超载。
  • 是 Linux 吗?你能发布uptime; free -m的结果吗?
  • 对不起,我对windows不熟悉。

标签: mysql alter-table


【解决方案1】:

如果是生产:

您应该使用pt-online-schema-changePercona Toolkit

pt-online-schema-change 模拟 MySQL 在内部更改表的方式,但它适用于您希望更改的表的副本。这意味着原始表没有被锁定,客户端可以继续读取和更改其中的数据。

pt-online-schema-change 的工作原理是创建表的空副本以进行更改,根据需要对其进行修改,然后将原始表中的行复制到新表中。复制完成后,它会移开原始表并用新表替换它。默认情况下,它还会删除原始表。

或者oak-online-alter-table,它是openark kit的一部分

oak-online-alter-table 允许非阻塞的 ALTER TABLE 操作、表重建和创建表的幽灵。

更改表会比较慢,但不会锁定表。

如果不是生产并且停机时间可以,请尝试以下方法:

CREATE TABLE contacts_tmp LIKE contacts;
ALTER TABLE contacts_tmp ADD COLUMN ADD processed INT UNSIGNED NOT NULL;
INSERT INTO contacts_tmp (contact_table_fields) SELECT * FROM contacts;
RENAME TABLE contacts_tmp TO contacts, contacts TO contacts_old;
DROP TABLE contacts_old;

【讨论】:

  • 谢谢,但您能确保这些工具中的任何一个都能在更短的时间内完成所需的过程吗?如果是,大约需要多少?你有什么建议?
  • 加上我需要的只是我想在最短的时间内插入列。想知道有没有办法?
  • 需要更多的 CPU 时间
  • 我也试过这个方法。但这花费了太多时间。这就是我发布问题的原因。
  • 与 Postgres 和其他数据库相比,MySQL 的模式更改能力受到严重限制。像这样的许多操作都需要锁定和重建。
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 2020-03-18
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多