【问题标题】:Duplicating table in MYSQL without copying one row at a time在MYSQL中复制表而不一次复制一行
【发布时间】:2011-02-21 11:59:10
【问题描述】:

我想复制一个非常大的表,但我不想逐行复制它。有没有办法复制它?

例如,您可以在不删除行/行的情况下截断,所以我想知道是否有类似的东西可以复制整个表

更新:逐行插入非常痛苦(因为有 120M 行)。无论如何要避免这种情况?

【问题讨论】:

    标签: mysql database duplicates


    【解决方案1】:

    MySQL 不再具有可靠的“复制表”功能 - 造成这种情况的许多原因与数据的存储方式有关。但是,下面是逐行插入,但非常简单:

    CREATE TABLE `new_table` LIKE `old_table`;
    INSERT INTO `new_table` (SELECT * FROM `old_table`);
    

    【讨论】:

    • 哎哟。我有一张大桌子,逐行插入很痛苦
    【解决方案2】:

    你可以使用INSERT INTO ... SELECT

    【讨论】:

    • 不幸的是,这不会像@AvatarKava 提供的答案那样有效,因为它不会复制像 auto_increment 这样的属性...
    • 先生?我们的答案是相同的,除了@AvatarKava 提到了我只暗示的 create-table 行(这也是我赞成它们的原因),我又链接到文档。否则我们说的完全一样。 o.@;
    【解决方案3】:

    如果您使用的是 MyISAM,您可以复制磁盘上的物理文件。重新启动服务,您将拥有带有索引的新表,并且一切都相同。

    【讨论】:

    • 我正在使用innodb。这适用吗?
    • innodb 将数据存储在一个大文件中(我相信您可以在 my.cnf 中更改此设置,但很少打开它),而 MyISAM 将每个表分成一组单独的文件。跨度>
    • 不,它不适用于 InnoDB。另一种选择是使用 mysqldump 转储表和数据,然后在创建的文件中更改它的名称并重新加载它。它仍然是一次一行,但速度更快,因为它使用了扩展的 INSERT 语法。
    【解决方案4】:
    INSERT INTO TABLE2 SELECT * FROM TABLE1
    

    【讨论】:

    • 不幸的是,这不会像@AvatarKava 提供的答案那样有效,因为它不会复制像 auto_increment 这样的属性...
    • 嗯,复制它们的唯一方法是重新创建它们 imo .. 但确实,仅此而已。
    【解决方案5】:

    复制一张大表并非易事;最终数据库可能需要重建它。

    在 InnoDB 中,唯一的方法是真正重建它,这意味着 insert ... select 之类的,但是,由于它将在单个事务中发生 120M 行,您可能会超过回滚区域的大小,这将导致插入失败。

    mysqldump 然后重命名原始表然后恢复转储应该可以工作,因为 mysqldump 可能会导致每隔很多行提交一次。不过会很慢。

    【讨论】:

      【解决方案6】:

      神谕:

      创建表 t 作为 select * from original_table

      【讨论】:

        猜你喜欢
        • 2018-03-25
        • 2010-10-18
        • 1970-01-01
        • 2014-12-08
        • 1970-01-01
        • 2017-03-13
        • 1970-01-01
        • 2014-07-03
        • 2021-12-01
        相关资源
        最近更新 更多