web-dev-qa-db-ja.com

大きな(14 GB)MySQLダンプファイルを新しいMySQLデータベースにインポートするにはどうすればよいですか?

大きな(14 GB)MySQLダンプファイルを新しいMySQLデータベースにインポートするにはどうすればよいですか?

53
TRN 7

私は周りを検索しましたが、この解決策だけが私を助けました:

mysql -u root -p

set global net_buffer_length=1000000; --Set network buffer length to a large byte number

set global max_allowed_packet=1000000000; --Set maximum allowed packet size to a large byte number

SET foreign_key_checks = 0; --Disable foreign key checking to avoid delays,errors and unwanted behaviour

source file.sql --Import your sql dump file

SET foreign_key_checks = 1; --Remember to enable foreign key checks when procedure is complete!

答えが見つかりました here

163
Kresimir Plese

mysqlコマンドラインクライアントを直接使用してみましたか?

mysql -u username -p -h hostname databasename < dump.sql

それができない場合は、 BigDump のように、MySQLに大きなダンプをインポートするのに役立つGooglingのユーティリティをいくつでも見つけることができます。

26
Brian Campbell

最初のopen->コマンドライン

cd..

cd..

f: -- xampp installed drive

cd xampp/mysql/bin

mysql -u root -p

set global net_buffer_length=1000000; --Set network buffer length to a large byte number

set global max_allowed_packet=1000000000; --Set maximum allowed packet size to a large byte number

SET foreign_key_checks = 0; --Disable foreign key checking to avoid delays,errors and unwanted behaviour

use DATABASE_NAME;

source G:\file.sql; --Import your sql dump file

SET foreign_key_checks = 1; --Remember to enable foreign key checks when procedure is complete!

私が見つけた回答のいくつかに私の発見を投稿していますが、私が遭遇したことについては言及していませんでしたが、これはBigDumpを倒すことさえありますので、チェックしてください:

Linuxコマンドライン経由で500 MBのダンプをロードしようとして、「MySQLサーバーがなくなりました」というエラーが表示され続けました。 my.confの設定は役に立ちませんでした。それを修正することが判明したのは...私は次のような大きな拡張挿入をしていました:

    insert into table (fields) values (a record, a record, a record, 500 meg of data);

ファイルを次のような個別の挿入としてフォーマットする必要がありました。

    insert into table (fields) values (a record);
    insert into table (fields) values (a record);
    insert into table (fields) values (a record);
    Etc.

そして、ダンプを生成するために、私はこのようなものを使用し、それは魅力のように機能しました:

    SELECT 
        id,
        status,
        email
    FROM contacts
    INTO OUTFILE '/tmp/contacts.sql'
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    LINES STARTING BY "INSERT INTO contacts (id,status,email) values ("
    TERMINATED BY ');\n'
2
Bill Ryder

簡単な解決策は、次のクエリを実行することです:mysql -h yourhostname -u username -p databasename < yoursqlfile.sql

そして、プログレスバーでインポートしたい場合は、これを試してください:pv yoursqlfile.sql | mysql -uxxx -pxxxx databasename

2
towfiqpiash

最近のプロジェクトでは、大量のデータを操作して操作するという課題がありました。クライアントは、サイズが30 MBから350 MBまでの50個のCSVファイルを提供し、全部で約2000万行のデータと15列のデータを含んでいます。最終目標は、MySQLリレーショナルデータベースにデータをインポートおよび操作して、同じく開発したフロントエンドPHPスクリプトを強化することでした。さて、この大規模または大規模なデータセットの操作は最も単純なタスクではないため、作業中にこのような大きなデータセットを操作する際に考慮し、知っておくべきことを少し共有したいと思いました。

  1. データセットのインポート前の分析

    この最初のステップを十分に強調することはできません!インポートする前に、作業中のデータを分析するために時間をかけてください。すべてのデータが何を表しているのか、どの列がどのような操作に必要なのか、どのタイプの操作が必要なのかを理解することで、長期的には時間を節約できます。

  2. LOAD DATA INFILEはあなたの友達です

    PHPMyAdminなどのツールを使用して通常のCSV挿入を試してみると、私たちが作業したような大きなデータファイル(および大きなデータファイル)をインポートするのは困難です。多くの場合、失敗するのは、アップロードサイズの制限とサーバーのタイムアウトにより、サーバーが一部のデータファイルと同じサイズのファイルアップロードを処理できないためです。しかし、成功した場合でも、プロセスには数時間かかることがありますハードウェアに依存します。 SQL関数LOAD DATA INFILEは、これらの大きなデータセットを処理するために作成されたもので、インポートプロセスの処理にかかる時間を大幅に短縮します。注目すべきことに、これはPHPMyAdminを介して実行できますが、それでもファイルのアップロードの問題があるかもしれません。その場合、ファイルをサーバーに手動でアップロードしてからPHPMyAdminから実行するか(詳細についてはマニュアルを参照)、SSHコンソールからコマンドを実行できます(独自のサーバーがある場合)

    LOAD DATA INFILE '/mylargefile.csv' INTO TABLE temp_data FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'
    
  3. MYISAM vs InnoDB

    大規模または小規模のデータベースでは、プロジェクトにどのデータベースエンジンを使用するかを検討するのに少し時間がかかることが常にあります。読み進める主な2つのエンジンはMYISAMとInnoDBであり、それぞれに長所と短所があります。簡単に言えば、考慮すべき事項(一般的に)は次のとおりです。

    MYISAM

    • 低メモリ使用量
    • 全文検索が可能
    • テーブルレベルのロック–書き込み時にテーブル全体をロックする
    • 読み取り集中型アプリケーションに最適

    InnoDB

    • リストアイテム
    • より多くのメモリを使用
    • 全文検索のサポートなし
    • より速い性能
    • 行レベルのロック-書き込み時に単一行をロック
    • 読み取り/書き込み集中型アプリケーションに最適
  4. 設計を慎重に計画する

    MySQL Analyzeデータベースの設計/構造は、パフォーマンスの大きな要因になります。さまざまなフィールドを計画し、データを分析して、最適なフィールドタイプ、デフォルト、およびフィールド長を把握するのに時間をかけます。適切な量​​のデータに対応し、データがそれを保証しない場合は、varchar列と過度に大きなデータ型を避けるようにします。データベースを使い終わった後の追加のステップとして、MySQLがすべての異なるフィールドのフィールドタイプとして提案しているものを見たいと思うようになります。これを行うには、次のSQLコマンドを実行します。

    ANALYZE TABLE my_big_table
    

    結果は、各列情報の説明と、適切な長さのデータ型のタイプに関する推奨事項です。推奨事項は既存のデータのみに基づいているため、必ずしも推奨事項に従う必要はありませんが、正しい軌道に乗せて考えさせるのに役立ちます

  5. インデックスを作成するかしないか

    これほど大きなデータセットの場合、フロントエンドのデータを使用して行う必要があることに基づいてデータに適切なインデックスを作成することは無限に重要です。データ。 SQLテーブルが大きくなるだけでなく、列の追加、減算、追加のインデックス付けなどの特定の操作が遅くなります。データセットを使用して、インポートした情報を取得し、それをいくつかの異なるテーブルに分割してリレーショナル構造を作成し、特定の列を取得して情報を追加の列に分割する必要がありました。操作に役立つことがわかっている最小限の列にインデックスを配置しました。全体として、2,000万行のデータで構成される1つの大きなテーブルを取得し、その情報を6つの異なるテーブルに分割し、メインデータの一部と既存のコンテンツに基づいて新しく作成されたデータを入れました。データを解析および移動するための小さなPHPスクリプトを記述することで、これをすべて行いました。

  6. バランスを見つける

    プログラミングの観点から大規模なデータベースを扱うことの大きな部分は、速度と効率です。すべてのデータをデータベースに取り込むのは素晴らしいことですが、データにアクセスするために記述するスクリプトが遅い場合、ポイントは何ですか?大規模なデータセットを使用する場合、スクリプトが実行しているすべてのクエリを理解し、可能な場合はそれらのクエリを支援するインデックスを作成するために時間をかけることが非常に重要です。クエリの実行内容を分析するこのような方法の1つは、次のSQLコマンドを実行することです。

    EXPLAIN SELECT some_field FROM my_big_table WHERE another_field='MyCustomField';
    

    クエリの先頭にEXPLAINを追加すると、MySQLは使用しようとしたインデックス、使用したインデックス、および使用方法を説明する情報を吐き出します。インデックスを使用するとスクリプトの実行速度を上げることができますが、同じように簡単に実行速度を遅くすることができるため、このポイントを「バランスの検索」と名付けました。必要なものと必要なものだけをインデックス化する必要があります。すべてのインデックスはディスク容量を消費し、テーブルのオーバーヘッドを増加させます。テーブルを編集するたびに、その特定の行のインデックスを再構築する必要があり、それらの行にあるインデックスが多いほど時間がかかります。すべては、スマートインデックスの作成、効率的なSQLクエリの作成、そして最も重要なことは、各クエリの実行内容と実行にかかる時間を理解するためのベンチマークです。

  7. インデックスオン、インデックスオフ

    データベースとフロントエンドスクリプトに取り組んでいると、クライアントと私たちの両方が、変更が必要で、データベースを変更する必要のある小さなことに気付き始めました。これらの変更の一部には、列の追加/削除および列タイプの変更が含まれていました。すでにデータに多数のインデックスを設定しているため、これらの変更を行うには、サーバーがインデックスを適切に保持し、変更を処理するためにいくつかの深刻な作業を行う必要がありました。小型のVPSサーバーでは、変更の一部が完了するまでに6時間以上かかっていましたが、スピーディな開発を行うのに役立つとは限りませんでした。ソリューション?インデックスをオフにします!インデックスをオフにしてから変更を加えてから、インデックスを再びオンにした方がよい場合があります。特に、さまざまな変更を行う必要がある場合はなおさらです。インデックスがオフの場合、変更には数時間から数分かかりました。変更に満足したら、インデックスをオンに戻しました。もちろん、すべてのインデックスの再作成にはかなり時間がかかりましたが、少なくとも一度にすべてのインデックスの再作成を行うことができ、これらの変更を1つずつ行うのに必要な全体的な時間を短縮できました。方法は次のとおりです。

    • インデックスを無効にするALTER TABLE my_big_table DISABLE KEY
    • インデックスを有効にするALTER TABLE my_big_table ENABLE KEY
  8. MySQLにチューンアップを与える

    データベースとスクリプトを迅速に実行することになると、サーバーを無視しないでください。ハードウェアには、データベースやスクリプトと同様に注意と調整が必要です。特に、MySQL構成ファイルを見て、パフォーマンスを向上させるためにどのような変更を加えることができるかを確認することが重要です。私たちが出会ったすばらしいツールは、MySQL Tuner http://mysqltuner.com/ です。これは、サーバーに直接ダウンロードしてSSHで実行し、構成にどのような変更を加えたいかを確認できる、簡単な小さなPerlスクリプトです。チューナーを実行する前に、フロントエンドスクリプトとデータベースを数日間積極的に使用して、チューナーに分析するデータを持たせる必要があることに注意してください。新しいサーバーで実行すると、最小限の情報とチューニングオプションのみが提供されます。 2週間にわたって数日ごとにチューナースクリプトを使用して、どのような推奨事項が提示されるかを確認するのは素晴らしいことであり、最終的にはデータベースのパフォーマンスが大幅に向上しました。

  9. 尋ねることを恐れないでください

    SQLを扱うことは、最初は難しい場合があり、非常に大きなデータセットを扱うことは、それだけ難しくなります。大規模なデータセットに関して、何をしているのかを知っている専門家にaすることを恐れないでください。最終的には、優れた製品、開発の迅速化、フロントエンドのパフォーマンスの迅速化につながります。大規模なデータベースに関しては、専門家がデータベースのパフォーマンスを低下させる可能性のある小さな警告をすべて見つけるのに目を光らせることがあります。

sourceコマンドを使用して大きなDBをインポートします

mysql -u username -p

> source sqldbfile.sql

これにより、任意の大きなDBをインポートできます

0
Vinod Kumar

Windowsの場合、Navicat Premiumを使用します。データベースオブジェクトを1つのデータベースから別のデータベース、またはsqlファイルに転送できます。ターゲットデータベースは、ソースと同じサーバーまたは別のサーバーに配置できます。

Windows用Navicatオンラインマニュアル

0
mobby