Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在laravel上将数百万行数据从一个数据库复制到另一个数据库_Php_Mysql_Laravel 5_Laravel Eloquent - Fatal编程技术网

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

Php 在laravel上将数百万行数据从一个数据库复制到另一个数据库,php,mysql,laravel-5,laravel-eloquent,Php,Mysql,Laravel 5,Laravel Eloquent,使用Laravel Eloquent,我从旧Mysql数据库的一个表中复制了700万行数据,并将这些行放在新Mysql数据库的不同表中。问题是执行此操作几乎花了一天的时间,我需要对将近80M行重新执行此操作。我一次使用1000个数据块。有什么办法吗 更有效率?? 这是我的代码: DB::connection('oldDataBase')->table('tableToCopy')->chunk(1000, function ($AllData){ foreach

使用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..
                ]);
        }
    });

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

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

  • 以CSV格式转储它们
  • 将CSV文件拆分为大约500K行的块
  • 在目标系统上创建表
  • 禁用目标系统上的所有约束和索引
  • 一个接一个地读取CSV文件。为了获得最快的结果,应该从与mysql服务器在同一台机器上运行的
    mysql
    或命令行客户机程序中运行
  • 重新启用约束并构建索引
  • 我会在迁移日之前对此进行全面测试。我会加载CSV的第一块和最后一块,并重新启用索引和约束

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


    避免为此使用gui风格的mysql客户端程序。坚持使用命令行程序。尽管这些GUI客户端很好,但它们不适合在数十兆字节的.SQL文件中进行流式处理。

    如果这只是一个一次性副本,那么最好将其作为sqldump进行处理,然后针对新的数据库运行输出脚本。不要通过laravel进行处理。Laravel执行查询,然后转换为对象集合,这些开销肯定会增加。做
    mysqldump | mysql-e
    mysqldbcopy
    或更简单的
    像其他表一样创建表
    插入到表中从其他表中选择
    谢谢你们的回复,我会按照你们的建议做。谢谢你们的帮助。我会尽量做到这一点。处理和导入CSV文件只是一场噩梦