有没有一种方法可以重命名 InnoDB 表上的列而不进行重大更改?
桌子很大,我想避免重大停机。
不幸的是,重命名列(使用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了解哪些类型的更改支持或不支持此功能的概述。
如果没有任何限制,据我所知,您可以毫不费力地更改它。如果有,您必须先删除约束,然后更改并重新添加约束。
更改具有许多行的表可能需要很长时间(尽管如果所涉及的列没有被索引,这可能是微不足道的)。
如果您特别想避免使用专门为此目的创建的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 查询,上述方法可能会快很多。但是,对于简单的列名更改,这可能是微不足道的。我可能会尝试创建一个相同的表并对其进行更改,以查看您实际查看了多少时间。