我在 MYSQL 数据库中有这张表,它有大约 1000 万条记录/行。我想column
在表中插入一个新的。然而,一个简单的插入列查询对我来说似乎并不适用。
这是我尝试过的,
ALTER TABLE contacts ADD processed INT(11);
我等了大约5个小时,但什么也没发生。有没有办法在这么大的表中插入新列?
希望我对我的问题很清楚。任何帮助,将不胜感激。
我在 MYSQL 数据库中有这张表,它有大约 1000 万条记录/行。我想column
在表中插入一个新的。然而,一个简单的插入列查询对我来说似乎并不适用。
这是我尝试过的,
ALTER TABLE contacts ADD processed INT(11);
我等了大约5个小时,但什么也没发生。有没有办法在这么大的表中插入新列?
希望我对我的问题很清楚。任何帮助,将不胜感激。
如果是生产:
您应该使用pt-online-schema-change的Percona 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;