我有一个有 2100 万行的表。我必须更改其中一个行名。当我尝试查询“alter table company change id new_id int(11)”时;查询永远不会结束。
有没有一种简单的方法来更改大 mysql 表的字段名称?
使用 pt-online-schema-change 进行长时间运行的 ALTER TABLE 更改,而不会将自己锁定在表之外。
http://www.percona.com/doc/percona-toolkit/pt-online-schema-change.html
完成更改通常需要更长的时间,但您仍然可以在表执行工作时对其进行读取和写入。
您还可以收听作者的网络研讨会,讨论它的工作原理和一些注意事项:
http://www.percona.com/webinars/2012-05-02-zero-downtime-schema-changes-in-mysql
首先,在任何事情之前,备份表:
mysqldump -uroot -p db big_table > /tmp/big_table.backup.sql
执行 ALTER 命令时要记住的一件事是绝对确保您具有相同的列详细信息,用于您不想更改的更改。
例如:
ALTER TABLE big_table MODIFY COLUMN id INT(11)
会跳过任何其他内容,例如AUTO_INCREMENT
and NOT NULL
。所以最好将它也包含在alter语句中。
ALTER TABLE big_table MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
基本上只需复制 ID 列的创建语句区域并替换您想要的内容并将其包含到修改语句中。
在巨大的 Mysql 表中更改字段名称的耗时较少的方法是:
CREATE TABLE new_big_table SELECT id as new_id,field1,field2,field3 FROM big_table。
您可以简单地执行以下操作:
CREATE TABLE big_table_new LIKE big_table;
ALTER TABLE big_table_new MODIFY COLUMN id INT(11);
ALTER TABLE big_table_new DISABLE KEYS;
INSERT INTO big_table_new SELECT * FROM big_table;
ALTER TABLE big_table_new ENABLE KEYS;
ALTER TABLE big_table RENAME big_table_bak;
ALTER TABLE big_table_new RENAME big_table;
CREATE TABLE big_table_new LIKE big_table;
ALTER TABLE big_table_new MODIFY COLUMN id INT(11);
INSERT INTO big_table_new SELECT * FROM big_table;
ALTER TABLE big_table RENAME big_table_bak;
ALTER TABLE big_table_new RENAME big_table;
当你完成后,big_table_bak
就是你的备份。
如果您对新的感到满意,big_table
您可以运行
DROP TABLE big_table_bak;
如果你想恢复,你可以运行
DROP TABLE big_table;
ALTER TABLE big_table_bak RENAME big_table;
试试看 !!!
你有什么想法:
这只是一个快速的想法,但不会很快(导出/导入)。
或者只是尝试在夜间几个小时的维护期间进行 ALTER?:)