開発者のマシンでmysqlダンプのインポートが非常に遅い


21

SQLダンプがあり、かなり大きく(411 MB)、サーバーAにインポートするのに10分かかりました。ワークステーションBに同じインポートを行うと、インポートに8時間(pipeviewer)の見積もり(40分で31 MBをインポートしました) )したがって、これはファクター53の方が遅くなります。

仕様:

Server A:
   MySQL Version: 5.5.30-1.1 (Debian)
   2 GB RAM
   1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020

Workstation B: 
   MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
   14 GB RAM
   4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000

mysql / maria構成は、ストック構成です。

昨日、ワークステーションでMariaDBに切り替えましたが、MariaDBの前は統計がさらに悪化していました。

ワークステーション上のすべてのデータベースをすでに削除しました-違いはありません。

大きな質問は次のとおりです。パフォーマンスを53倍遅くするにはどうすればよいですか。私はこのように働くことはできません:-(

私のインポートコマンド:

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'

iostat -xm 5

サーバーA:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      17,43    0,00   30,28   51,85    0,00    0,44

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00   254,03    0,00 1305,45     0,00     6,09     9,56     0,78    0,60    0,00    0,60   0,57  74,25

ワークステーションB:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       7,32    0,00    3,22    5,03    0,00   84,42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     1,40    0,80  172,40     0,00     0,56     6,72     1,17    6,75   12,00    6,72   5,40  93,52

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

サーバーA:

1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s

ワークステーションB:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s

データベースのインポート方法を説明していただけますか?(具体的なmysqlステートメントは何ですか)「show processlist」とは何ですか。いう?プロセスがstraceで具体的に何をしているのか見てきましたか?お使いのマシンがスワッピングされているかどうかもご覧ください。

質問を編集しました。
アレックス

InnoDB?innodb_buffer_pool_size各マシンの価値は何ですか?
リックジェームズ

回答:


47

この回答により、すべてが大幅に高速化されました。

/programming//a/2167641/292408

私は単に

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

初めに、そして

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

最後に。

今では3分かかりました。

(@andreasemerのTwitter経由)


素晴らしいトリック。私が知る必要があること、これを行うことの副作用はありますか?
ダルマサプトラ

1
データが破損している場合、インポート後に外部キーの制約が満たされない場合があります。
アレックス

素晴らしい回避策。あなたは文字通り何時間も私を救った。
-Jafo

パフォーマンスが向上しませんでした。これがないと、23分であり、23分後(3GBの.sqlファイル)でした。
ジョシュアピンター

5

上記の内容を補完する...ダンプファイルは次のようなものによって既に自動的に生成されています。

mysqldump my_db > db-dump-file.sql

このインポートを自動化したいので、コンピューターに2つのファイルを作成default-start-import.sqldefault-end-import.sql、それらのコンテンツはdefault-start-import.sqlです:

SET autocommit=0;

およびdefault-end-import.sql

COMMIT;
SET autocommit=1;

私が実行するスクリプトは次のようなものです。

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db

同じコマンドですが、読みやすいです:

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db

この場合、catそれらのファイルを連結してからパイプに送信します。catコマンドがファイル間の行をマージしないように、すべてのファイルが改行文字(テキストエディターから見た場合はファイルの最後の空行)で終わることが重要だと思います。

インポートは正常に機能します。このenable-and-disable-autocommitの改善により実際に高速であるかどうかはテストしていませんが、高速化すれば、この追加の手順で処理が簡単になります。


1

私も試してみ--compressましたがSET autocommit=0;、彼らは少し助けました...

複数のINSERT INTO ...ステートメントを1つの大きなステートメントに変換すると、複数のVALUES(...), (...)速度が大幅に向上することがわかりました。

mysqlWAN経由でSSLを使用しています。リモートMySQLデータベースはAmazonでホストされています。

9列と2,100行で:

  • 2,100個の個別のINSERTステートメント:82秒
  • 2連結INSERTステートメント:<1秒

7列と42,000行で:

  • 42,000の個別のINSERTステートメント:1,740
  • 42連結INSERT計算書:105秒

そのため、データベースダンプを生成するツール(または、より具体的にはINSERTステートメントの形式)に応じて、速度が影響を受ける可能性があります。

注:これ.sqlにより、テストでダンプファイルが60%以上削減されるため、I / Oも節約されます。

警告:移植性を必要とする人にmysqlこの手法に物理的な制限があります... SQL Server 、一度に1,000行に制限されているようです。

それでも、42,000行に対して一度に1,000行を実行すると、引き続き1,657%の改善が得られます。

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