7

有没有一种方法可以重命名 InnoDB 表上的列而不进行重大更改?

桌子很大,我想避免重大停机。

4

3 回答 3

8

不幸的是,重命名列(使用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了解哪些类型的更改支持或不支持此功能的概述。

于 2011-11-17T19:26:59.110 回答
0

如果没有任何限制,据我所知,您可以毫不费力地更改它。如果有,您必须先删除约束,然后更改并重新添加约束。

于 2011-11-17T18:53:34.873 回答
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 查询,上述方法可能会快很多。但是,对于简单的列名更改,这可能是微不足道的。我可能会尝试创建一个相同的表并对其进行更改,以查看您实际查看了多少时间。

于 2011-11-17T19:11:03.247 回答