在laravel上将数百万行数据从一个数据库复制到另一个数据库

时间:2017-02-02 21:02:53

标签: php mysql laravel-5 laravel-eloquent

使用Laravel Eloquent,我在旧的Mysql数据库中的一个表中复制了7百万行数据,并将这些行放在我的新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..
                ]);
        }
    });

1 个答案:

答案 0 :(得分:1)

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

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

  1. 以CSV格式转储它们。
  2. 将CSV文件拆分为每个500K行的块。
  3. 在目标系统上创建表格
  4. 禁用目标系统上的所有约束和索引。
  5. use LOAD DATA INFILE一个接一个地填充CSV文件。为了获得最快的结果,应该从与MySQL服务器相同的计算机上运行的mysqlmysqlimport命令行客户端程序运行。
  6. 重新启用约束并构建索引。
  7. 我在迁移日之前对此进行了广泛的测试。我会做一些事情,比如加载第一个和最后一个CSV块并重新启用索引和约束。

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

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