MySQLは巨大な(32 GB)SQLダンプをより速くインポートする方法ですか?


67

この巨大な32 GBのSQLダンプがあり、MySQLにインポートする必要があります。そのような巨大なSQLダンプをインポートする必要はありませんでした。私はいつもやった:

mysql -uroot dbname < dbname.sql

時間がかかりすぎています。約3億行のテーブルがあり、約3時間で150万行になります。そのため、全体が600時間(24日間)かかり、実用的ではないようです。だから私の質問は、これを行うより速い方法はありますか?

詳細情報/調査結果

  1. テーブルはすべてInnoDBであり、外部キーは定義されていません。ただし、多くのインデックスがあります。
  2. 元のサーバーとDBにアクセスできないため、新しいバックアップを作成したり、「ホット」コピーなどを実行したりできません。
  3. ここでinnodb_flush_log_at_trx_commit = 2提案されている設定では、(明らかに見える/指数関数的に)改善されないようです。
  4. (MySQLのワークベンチからの)輸入時のサーバの統計情報:https://imgflip.com/gif/ed0c8
  5. MySQLバージョンは5.6.20コミュニティです。
  6. innodb_buffer_pool_size = 16Mおよびinnodb_log_buffer_size = 8M。これらを増やす必要がありますか?

より高速なコンポーネント、つまり、より多くのRAMとSSDストレージをサーバーに追加できますか?

@Bertサーバーには8 GBのRAMがあり、そのほとんどは未使用です。ストレージを追加することもできません。それはどのように役立ちますか?本当に遅いのは書き込み操作ですか?

ボトルネックは何ですか?CPUコアは固定されていますか?
クリスS 14年

@ChrisSいいえ、CPU使用率は3〜4%です。ボトルネックが何であるかわかりません。私はそれがインデックスだと思っています。ボトルネックをどのように見つけて確認しますか?

1
SQLがある場合、インデックス作成ステートメントを編集して、それが速くなるかどうかを確認できますか?インポートしたデータを持っていたら、あなたはそれらを再作成する必要があります

回答:


84

PerconaのVadim Tkachenkoは、この素晴らしいInnoDBの画像表現を作成しました。

InnoDBアーキテクチャ

あなたは間違いなく以下を変更する必要があります

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

なぜこれらの設定ですか?

このようにmysqlを再起動します

service mysql restart --innodb-doublewrite=0

これにより、InnoDB Double Write Bufferが無効になります

データをインポートします。完了したら、通常どおりmysqlを再起動します

service mysql restart

これにより、InnoDB Double Write Bufferが再び有効になります

試してみる !!!

サイドノート:最新のセキュリティパッチを入手するには、5.6.21にアップグレードする必要があります


1
linux bashスクリプトを作成し、メモリを少なくしてvagrant
OZZIE

9

データベース全体を本当に復元する必要がありますか?そうしないと、私の2c:

特定のテーブルを抽出して、「チャンク」でリストアを実行できます。このようなもの:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

一度行っただけで、必要なテーブルを抽出するのに10分ほどかかりました。35GB(gzip圧縮)のダンプで、完全な復元には13〜14時間かかりました。

それらを含めて-パラメータが「パターン間の」スライスになります。/pattern/,/pattern/p-n

とにかく、35GBを復元するには、AWS EC2マシン(c3.8xlarge)を使用し、yum(Centos)を介してPerconaをインストールし、次の行を追加/変更しましたmy.cnf

max_allowed_packet=256M
wait_timeout=30000

数値は高すぎると思いますが、私の設定ではうまくいきました。


5

データベースをインポートする最速の方法は、MyISAMの場合、(.frm、.MYD、.MYI)ファイルを/ var / lib / mysql / "データベース名"に直接コピーすることです。

それ以外の場合は試すことができます: mysql > use database_name; \. /path/to/file.sql

それはデータをインポートする別の方法です。


1

インポートの速度を上げる1つの方法は、インポート中にテーブルをロックすることです。mysqldumpに--add-locksオプションを使用します。

mysqldump --add-drop-table --add-locks --database db > db.sql

または、-- optを使用していくつかの有用なパラメーターをオンにできますこれにより、ダンプに役立つ一連の有用なものがオンになります。

mysqldump --opt --database db > db.sql

サーバーに別のストレージデバイスがある場合は、それを使用します。あるデバイスから別のデバイスにコピーすると、転送を高速化できます。

--ignore-table使用して、不要なテーブルを除外することもできます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.