3

使用 Laravel Eloquent,我从旧 Mysql 数据库的一个表中复制 700 万行数据,并将这些行放在新 Mysql 数据库的不同表中。问题是执行此操作需要将近一天的时间,我需要为近 80M 行重新执行此操作。我一次使用 1000 个数据块。有什么方法可以更有效地做到这一点??这是我的代码:

   DB::connection('oldDataBase')->table('tableToCopy')->chunk(1000, function ($AllData){
        foreach ($AllData as $Data){
            DB::connection('newDataBase')->table('table1')->insert(
                [
                    column1 => $Data->columnToCopy,
                    etc..
                ]);


           DB::connection('newDataBase')->table('table2')->insert(
                [
                    column1 => $Data->columnToCopy,
                    etc..
                ]);
           DB::connection('newDataBase')->table('table3')->insert(
                [
                    column1 => $Data->columnToCopy,
                    etc..
                ]);
        }
    });
4

1 回答 1

1

从像 laravel 这样的 SQL 客户端进行数据迁移并不是一个好主意。

如果我必须移动 80M 行,我会采取以下步骤:

  1. 以 CSV 格式转储它们。
  2. 将 CSV 文件拆分为每个大约 500K 行的块。
  3. 在目标系统上创建表
  4. 禁用目标系统上的所有约束和索引。
  5. 用于LOAD DATA INFILE一个接一个地抓取 CSV 文件。为了获得最快的结果,这应该从与 MySQL 服务器在同一台机器mysql上运行的或mysqlimport命令行客户端程序运行。
  6. 重新启用约束并构建索引。

我会在迁移日之前对此进行广泛测试。我会做一些事情,比如加载第一个和最后一个 CSV 块并重新启用索引和约束。

评论中提出了另一种可能性。使用,然后通过客户端程序mysqldump加载生成的文件。mysql

避免为此使用 gui 风格的 mysql 客户端程序。坚持使用命令行程序。与那些 GUI 客户端一样好,它们并不是为在数十兆字节的 .SQL 文件中流式传输而设计的。

于 2017-02-02T21:44:32.670 回答