2009-07-10 15 views
18

可能性の重複:
Speeding up mysql dumps and importsmysqldumpsをより速く読み込む方法はありますか?

mysqldumpは合理的に高速ですが、中規模のデータベース(20〜30メガ)のダンプは、使用してロードするために数分かかるmysql my_database < my_dump_file.sql

私は負荷をスピードアップするために調整することができますいくつかのMySQLの設定はありますか?保存されたデータを読み込むためのよりよい方法はありますか?

私は、CSVベースのダンプでmysqlimportユーティリティを使用して実験しました。これらの負荷はわずかですが、それほど高速ではありません。私は、生のデータベースファイルをコピーするだけですが、それは悪い考えです。

+0

よりも10倍高速回に3倍である復元復元。通常は40分かかっていたものが24時間押していた。ちょうど参照のために。 – gahooa

答えて

5

maatkit - parallel dump

maatkit - parallel restore

非常に速いです。あなたはInnoDBテーブルを使用していると仮定すると

+0

ありがとう、これは私が探していたものです! –

+13

説明にはソフトウェアにバグがあり、バックアップや重要なデータには使用しないでください。あまりにも悪い...私はスピードアップを得るために、複数のmysqldumpsを異なるテーブルで並列に実行できるのだろうか? – davr

5

ダンプするときにmysqldumpに--optオプションを使用していることを確認してください。これは、あなただけのMyISAMテーブルを使用している場合は停止したサーバにコピーする、サーバーを停止することで、あなたがそれらを安全にコピーすることができ、


...などのキーの更新を遅らせ、一括挿入構文を使用し、かつますそれを始める。

あなたはオリジンサーバを停止したくない場合は、あなたがこれを辿ることができます。

  1. すべてのテーブルの上に読み取りロックを取得しますフラッシュのすべてのテーブル
  2. ファイルをコピーします
  3. がロック解除テーブル

しかし、私はあなたのコピー先サーバーを停止する必要があると確信しています。

+0

実際にはmysqlhotcopyは何をします – aldrinleal

+0

悲しいことに、私はただ1つのアップ票しか持っていません。あなたが提案したように--optオプションを使ってmysqldumpを実行していた方法を変更すると、私のインポートから5時間も節約できました! – Nate

+0

@Nate mysqldumpで '--opt'がデフォルトで有効になっているので、インポートが速くなる理由は他にもあるはずです。それは少なくともv5.5(2010年)以来そうであった。 – dr01

1

興味深いオプションかもしれないバックアップと復元にLVMスナップショットを使用する方法があります。

mysqldumpを実行する代わりに、LVMを使用してMySQLデータディレクトリのスナップショットを取得することを検討してください。 LVMスナップショットを使用すると、ほぼリアルタイムのバックアップ機能、すべてのストレージエンジンのサポート、非常に高速なリカバリが可能になります。以下のリンクから引用すると、

"回復時間はデータを戻して標準的なクラッシュリカバリと同じくらい速く、さらに減らすことができます。"

http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

4

あなたはデータが正気で、任意のファイルシステムまたはシステムパフォーマンスの問題がありませんか? 20〜30メガのデータベースの場合、数分かかる場合があります。私は2GBのRAM、320GBのHDと標準の2.1GHzプロセッサを搭載したMacBookを使っています。

gavinlaking$ du -sm 2009-07-12.glis 
74 2009-07-12.glis 
gavinlaking$ mysql -pxxx -e "drop database glis" 
gavinlaking$ mysql -pxxx -e "create database glis" 
gavinlaking$ time mysql -pxxx glis < 2009-07-12.glis 

real 0m17.009s 
user 0m2.021s 
sys 0m0.301s 

74メガバイトのファイルの場合、17秒間私は自分のデータベースの1つを手に入れました。それは私にはかなりかすかなようです。 4倍の大きさ(300メガバイトの大きさ)であっても、70秒弱で終了します。

25

...

私は合理的な時間内にインポートしたい既存のmysqldumpの出力ファイルの山を持っていることの状況にありました。テーブル(1ファイルにつき1つ)は約500MBで、約5,000,000行のデータがそれぞれ含まれていました。次のパラメータを使用して、挿入時間を32分から3分に短縮できました。

innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT

また、合理的に大規模なinnodb_buffer_pool_size設定を持っている必要があります。

私のインサートはワンオフだったので、後で設定を元に戻しました。あなたが長期的にそれらを使用し続けるつもりなら、彼らが何をしているのかを確認してください。

Cedric Nilly's blogでこれらの設定を使用するよう提案されており、各設定の詳細な説明はMySQL documentationにあります。

+0

これは私がこのメソッドを使用する2回目です。両方のケース(異なるデータベース)では、インポート時間が数時間から数分に短縮されました。ありがとう! – lepe

+0

私は最近、〜8列のほとんどのintデータの単純なテーブルに対してこれを行う必要がありました。これらを適用する前に、私は〜約30インサート/秒(インデックスが無効になっている)を得ていた。変更後、私は〜600インサート/ sを得ていた。最大の勝利は、すべてのトランザクションではなく、毎秒のログに書き込むように、自動的にinnodb_flush_log_at_trx_commitを '1'(デフォルト)から '2'に設定することから来ています(自動コミットがtrueのときは、 – Adil

+0

この値を編集するときに何が起こるか説明できますか?私たちが理解するために。 私はこれを使いましたが、スピードは素晴らしいです。 – reignsly

関連する問題