有没有办法在没有重大改动的情况下重命名InnoDB表上的列?
表格非常大,我想避免重大停机。
答案 0 :(得分:7)
重命名列(使用ALTER TABLE ... CHANGE COLUMN
)不幸地需要MySQL运行完整的表副本。
结帐pt-online-schema-change。这有助于您对表进行多种类型的ALTER更改,而不会在ALTER的持续时间内锁定整个表。在将数据复制到新表时,您可以继续读取和写入原始表。通过触发器捕获更改并将其应用于新表。
示例:
pt-online-schema-change h=localhost,D=databasename,t=tablename \
--alter 'CHANGE COLUMN oldname newname NUMERIC(9,2) NOT NULL'
更新: MySQL 5.6可以在不重建表的情况下执行某些类型的ALTER操作,并且更改列的名称是在线更改所支持的名称之一。有关哪种类型的更改支持或不支持此操作的概述,请参阅http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html。
答案 1 :(得分:0)
如果没有任何限制,你可以毫不费力地改变它,据我所知。如果您必须首先删除约束,请更改并添加约束。
答案 2 :(得分:0)
使用多行更改表可能需要很长时间(但如果所涉及的列未编入索引,则可能很简单)。
如果您特别想避免使用专门为此目的创建的ALTER TABLE语法,您始终可以创建一个几乎完全相同结构(但名称不同)的表,并将所有数据复制到其中,如此:
CREATE TABLE `your_table2` ...;
-- (using the query from SHOW CREATE TABLE `your_table`,
-- but modified with your new column changes)
LOCK TABLES `your_table` WRITE;
INSERT INTO `your_table2` SELECT * FROM `your_table`;
RENAME TABLE `your_table` TO `your_table_old`, `your_table2` TO `your_table`;
对于某些ALTER TABLE查询,上面的内容可以快得多。但是,对于简单的列名更改,它可能是微不足道的。我可能会尝试创建一个相同的表并对其进行更改,以便查看您实际查看的时间。