我有一个拥有2100万行的表格。我需要更改其中一行的名称。当我使用查询语句"alter table company change id new_id int(11)"时,查询永远不会结束。
有没有简单的方法可以更改大型MySQL表格的字段名称?
我有一个拥有2100万行的表格。我需要更改其中一行的名称。当我使用查询语句"alter table company change id new_id int(11)"时,查询永远不会结束。
有没有简单的方法可以更改大型MySQL表格的字段名称?
首先,在做任何事情之前,请备份表:
mysqldump -uroot -p db big_table > /tmp/big_table.backup.sql
在执行ALTER命令时,需要牢记的一点是,务必确保您希望不更改的列具有相同的列详细信息。
例如:
ALTER TABLE big_table MODIFY COLUMN id INT(11)
最好将 AUTO_INCREMENT
和 NOT NULL
等内容一同包含在修改语句中,以避免遗漏。
ALTER TABLE big_table MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
基本上只需复制ID列的创建语句区域,然后替换所需的内容并将其包含到修改语句中即可。
big_table.backup.sql
备份文件中搜索和替换 CREATE TABLE
语句中的 id INT(11)
字段以匹配您想要的内容,然后使用 mysql -uroot -p db < /tmp/big_table.backup.sql
正常导入。 - matskohttp://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
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操作? :)