1. データのエクスポート方法を選択する
まず最初に提案したいのは、MySQL に付属のコマンド ライン ツールを使用してデータをエクスポートおよびインポートし、Navicat やワークベンチなどのグラフィカル ツールを使用しないことです。特に大量のデータがある場合、MySQL に付属のコマンド ライン ツールを使用してエクスポートとインポートを行うと、Navicat などのグラフィカル ツールを使用するよりも数倍速く、Navicat などのグラフィカル ツールを使用してエクスポートおよびインポートする際に行き詰まりやすくなります。大量のデータを扱う操作を実行します。次に、MySQL に付属のコマンド ライン ツールを使用してインポートおよびエクスポートする方法を簡単に紹介します。
# 导出整个实例
mysqldump -uroot -pxxxxxx --all-databases > all_database.sql
# 导出指定库
mysqldump -uroot -pxxxxxx --databases testdb > testdb.sql
# 导出指定表
mysqldump -uroot -pxxxxxx testdb test_tb > test_tb.sql
# 导入指定SQL文件 (指定导入testdb库中)
mysql -uroot -pxxxxxx testdb < testdb.sql
インポートされた SQL スクリプトの内容のほとんどは、最初にデータベースとテーブルを構築してからデータを挿入することですが、最も時間がかかるのは、データを挿入するための挿入です。ファイル サイズを小さくするには、次のように拡張挿入メソッドを使用することをお勧めします。つまり、次のように、複数の行をまとめてバッチで挿入します。 ,(); . 拡張子を使用して挿入すると、1 つずつ挿入するよりもはるかに小さくなり、ファイル サイズがはるかに小さくなり、挿入速度が数倍速くなります。
デフォルトでは、mysqldump によってエクスポートされたファイルはバッチ挿入の方法を使用します. エクスポートするときは、 --skip-extended-insert パラメータを使用して 1 つずつ挿入できます.
2.パラメーターを変更してインポートを高速化してみてください
MySQL には、既知の「ダブル 1」パラメーターのペア、つまりinnodb_flush_log_at_trx_commitとsync_binlog があります。For security, the default value of these two parameters is 1. スクリプトをすばやくインポートするために、これら 2 つのパラメーターを一時的に変更できます. 以下に、これら 2 つのパラメーターを簡単に紹介します:
innodb_flush_log_at_trx_commit:
innodb_flush_log_at_trx_commit のデフォルト値は 1 で、0、1、2 に設定できます
innodb_flush_log_at_trx_commit が 0 に設定されている場合、ログ バッファーは 1 秒に 1 回ログ ファイルに書き込まれ、ログ ファイルの (ディスクへの) フラッシュ操作が同時に実行されます。このモードでは、トランザクションがコミットされると、ディスクへの書き込み操作はアクティブにトリガーされません。
innodb_flush_log_at_trx_commit が 1 に設定されている場合、MySQL はログ バッファ データをログ ファイルに書き込み、トランザクションがコミットされるたびに (ディスクに) フラッシュします。
innodb_flush_log_at_trx_commit が 2 に設定されている場合、MySQL はトランザクションがコミットされるたびにログ バッファ データをログ ファイルに書き込みますが、フラッシュ (ディスクへのフラッシュ) 操作は同時に実行されません。このモードでは、MySQL は毎秒 (ディスクへの) フラッシュ操作を実行します。
sync_binlog:
sync_binlog のデフォルト値は 1 で、[0,N) に設定できます。
sync_binlog = 0 の場合、MySQL はディスクに同期しませんが、オペレーティング システムが他のファイルを更新するメカニズムと同様に、オペレーティング システムに依存してバイナリ ログを更新します。
sync_binlog =N (N>0) の場合、MySQL は fdatasync() 関数を使用して、書き込まれたバイナリ ログ バイナリ ログを N 回ごとにディスクに同期します。
これら 2 つのパラメータはオンラインで変更できます. これらをすばやくインポートするには、次の手順に従ってください:
# 1.进入MySQL命令行 临时修改这两个参数
set global innodb_flush_log_at_trx_commit = 2;
set global sync_binlog = 2000;
# 2.执行SQL脚本导入
mysql -uroot -pxxxxxx testdb < testdb.sql
# 3.导入完成 再把参数改回来
set global innodb_flush_log_at_trx_commit = 1;
set global sync_binlog = 1;
もう 1 つのシナリオは、新しいスレーブ ライブラリを作成する必要がある場合、または binlog を生成する必要がない場合です. このとき、SQL スクリプトをインポートするときに一時的に binlog を記録しないように設定できます. set sql_log_bin=0 を最初に追加できますスクリプトのインポートを実行すると、さらに高速化されます。MySQL インスタンスで binlog が有効になっていない場合、このステートメントを実行する必要はありません。
要約:
この記事では主にデータをすばやくインポートする方法を紹介しますが、データをロードしたり、マルチスレッド挿入用のプログラムを作成したりするなど、データをすばやくインポートする方法は他にもあるかもしれません。この記事で説明されている方法は、SQL スクリプトを手動でインポートする場合にのみ適しています。
- MySQL に付属のコマンド ライン ツールを使用して、エクスポートとインポートを行います。
- 拡張挿入メソッドを使用して、複数の値を 1 回挿入します。
- innodb_flush_log_at_trx_commit および sync_binlog パラメータを一時的に変更します。
- binlog を閉じるか、一時的に binlog を記録しないようにします。
実際には、最初にインデックスを作成せず、データを挿入してからインデックスを追加する、または最初にテーブルを MyISAM または MEMORY エンジンに変更し、インポートが完了した後に InnoDB エンジンに変更するなど、他のいくつかの解決策があります。