我在MYSQL数据库中有一张表,大约有1000万条记录/行。我想在这个表中插入一个新的列
。然而一个简单的添加列的查询似乎对我来说不起作用。
这是我尝试过的,
ALTER TABLE contacts ADD processed INT(11);
我等了大约5个小时,但什么都没有发生。有没有什么办法可以在这样一个巨大的表中插入新的列?
希望我的问题清楚明了。任何帮助都将不胜感激。
我在MYSQL数据库中有一张表,大约有1000万条记录/行。我想在这个表中插入一个新的列
。然而一个简单的添加列的查询似乎对我来说不起作用。
这是我尝试过的,
ALTER TABLE contacts ADD processed INT(11);
我等了大约5个小时,但什么都没有发生。有没有什么办法可以在这样一个巨大的表中插入新的列?
希望我的问题清楚明了。任何帮助都将不胜感激。
如果是生产环境:
建议使用Percona Toolkit中的pt-online-schema-change。
pt-online-schema-change模拟MySQL内部修改表的方式,但它在要修改的表的副本上工作。这意味着原始表不会被锁定,并且客户端可以继续读取和更改其中的数据。
pt-online-schema-change通过创建要修改的表的空副本、按需修改该副本,然后将原始表的行复制到新表中来工作。当复制完成后,它会移动原始表并用新表替换它。默认情况下,它也会删除原始表。
或者使用openark kit中的oak-online-alter-table。
oak-online-alter-table允许进行非阻塞的ALTER TABLE操作,重建表以及创建表的ghost。
修改表的速度会变慢,但不会锁定表。
如果不是生产环境,可以尝试下面的方法,即使需要停机也无妨:
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;
uptime; free -m
的结果吗? - Roman Newaza