2017-02-02 15 views
2

Laravel Eloquentを使用して、古いMysqlデータベースの1つのテーブルから7Million行のデータをコピーし、新しいMysqlデータベースの異なるテーブルにこれらの行をコピーします。問題はこれを実行するのにおよそ1日かかり、私はこのアクションをほぼ80Mの行に対して再実行する必要があるということです。私は一度に1000データのチャンクを使用しています。それを行う方法はありますか もっと効率的ですか?ここ 私のコード:laravelのデータベースから百万行のデータを別のデータベースにコピーする

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.. 
       ]); 
     } 
    }); 
+3

これは単発コピーの場合は、sqldumpとして実行し、新しいデータベースに対して出力スクリプトを実行する方がよいでしょう。 – Andy

+3

laravelで実行しないでください。 Laravelはクエリを実行してオブジェクトのコレクションに変換します。間違いなくオーバーヘッドが加算されます。 'mysqldump | mysql -e'またはmysqldbcopy'またはさらに簡単な 'create table like othertable'と' insert into table into other table'から選択してください – apokryfos

+0

返事をお寄せいただきありがとうございます。 –

答えて

1

laravelのようなSQLクライアントからこのデータ移行を行うには良いアイデアではありません。

私は80Mの行を移動しなければならないとしたら、私は次のステップを取ると思います:

  1. は、CSV形式でそれらをダンプします。
  2. は、CSVファイルをそれぞれ500K行などのチャンクに分割します。
  3. ターゲットシステムでテーブルを作成
  4. ターゲットシステムのすべての制約とインデックスを無効にします。
  5. use LOAD DATA INFILE CSVファイルを1つずつスラッシュアップします。最も速い結果を得るには、またはmysqlimportコマンドラインクライアントプログラム(、MySQLサーバーと同じマシン)で実行する必要があります。
  6. 再度、制約を有効にしてインデックスを作成します。

私はこれを移行日前に広範囲にわたってテストしたいと思います。私はCSVの最初と最後のチャンクをロードし、インデックスと制約を再度有効にするようなことをします。

コメントに別の可能性が示唆されました。 mysqldumpを使用し、結果ファイルをmysqlクライアントプログラム経由でロードします。

gui形式のmysqlクライアントプログラムを使用しないようにしてください。コマンドラインプログラムを使う。これらのGUIクライアントは、数十MBのSQLファイルでストリーミングするように設計されていません。

+0

ご協力いただきありがとうございます。私はそれを試みます。 –

+0

CSVファイルを処理してインポートするのはまさに悪夢です – Naeem

関連する問題