【问题标题】:Change mysql field name in a huge table在一个巨大的表中更改 mysql 字段名称
【发布时间】:2012-12-07 21:33:45
【问题描述】:

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

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

【问题讨论】:

  • 你试过用 PHPMyAdmin 做吗?那可能会使用更有效的方法
  • 我已经尝试过使用 PHPMyAdmin 和命令行。
  • 你可以做一个 mySqldump 并编辑转储文件。然后重新导入数据。
  • 列是否定义为 int(11) 且没有其他属性?如果您只是更改名称 MySQL 应该只更新元数据而不触及行。你用的是什么存储引擎?
  • 文档说重命名列,除了 InnoDB 存储引擎只修改表元数据而不是表数据,可以通过更改表的 .frm 文件而不接触表内容来立即生成。但对我来说不是这样。

标签: mysql alter


【解决方案1】:

首先,先备份表:

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

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

例如:

ALTER TABLE big_table MODIFY COLUMN id INT(11)

会跳过AUTO_INCREMENTNOT NULL 之类的任何其他内容。所以最好将它也包含在 alter 语句中。

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
  • 谢谢。我正在尝试。我会发布结果。
  • 我已经尝试过推荐。是的,它按预期工作。我使用 split 和 cat 来编辑大 sql 文件。
  • 太棒了。也许添加您必须做的更改和步骤以使其充分发挥作用,然后让我们结束这个问题:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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;
    

    试试看!!!

    【讨论】:

    • 如果你有 2100 万行,这并不是那么简单……
    • 是的,我有 7700 万条记录。我认为这可能需要很长时间,稍后会评论需要多长时间
    【解决方案4】:

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

    创建表 new_big_table SELECT id as new_id,field1,field2,field3 FROM big_table。

    【讨论】:

      【解决方案5】:

      你怎么看:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-20
        • 2015-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多