7

我有一个有 2100 万行的表。我必须更改其中一个行名。当我尝试查询“alter table company change id new_id int(11)”时;查询永远不会结束。

有没有一种简单的方法来更改大 mysql 表的字段名称?

4

5 回答 5

5

使用 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

于 2012-12-09T21:32:46.070 回答
5

首先,在任何事情之前,备份表:

mysqldump -uroot -p db big_table > /tmp/big_table.backup.sql

执行 ALTER 命令时要记住的一件事是绝对确保您具有相同的列详细信息,用于您不想更改的更改。

例如:

ALTER TABLE big_table MODIFY COLUMN id INT(11)

会跳过任何其他内容,例如AUTO_INCREMENTand NOT NULL。所以最好将它也包含在alter语句中。

ALTER TABLE big_table MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;

基本上只需复制 ID 列的创建语句区域并替换您想要的内容并将其包含到修改语句中。

于 2012-12-07T21:45:28.337 回答
1

在巨大的 Mysql 表中更改字段名称的耗时较少的方法是:

CREATE TABLE new_big_table SELECT id as new_id,field1,field2,field3 FROM big_table。

于 2012-12-09T21:23:46.460 回答
1

您可以简单地执行以下操作:

MyISAM 表

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;

InnoDB 表

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;

试试看 !!!

于 2012-12-07T22:54:38.517 回答
0

你有什么想法:

  1. 导出所有数据并截断表
  2. 更改表
  3. 更改导出文件中的行名
  4. 导入文件

这只是一个快速的想法,但不会很快(导出/导入)。

或者只是尝试在夜间几个小时的维护期间进行 ALTER?:)

于 2012-12-07T21:38:54.403 回答