web-dev-qa-db-ja.com

mysqlダンプのインポートが開発者のマシンで信じられないほど遅い

私はSQLダンプを持っていて、それはかなり大きい(411 MB)であり、サーバーAにインポートするのに10分かかりました。 )したがって、これは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
23
Alex

この答えはすべてを大幅にスピードアップしました:

https://stackoverflow.com/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による提供)

50
Alex

上記の補足説明...ダンプファイルは既に次のような方法で自動的に生成されています。

mysqldump my_db > db-dump-file.sql

このインポートを自動化したいので、コンピューターにdefault-start-import.sqlおよびdefault-end-import.sqlという2つのファイルを作成しました。その内容は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コマンドがファイル間の行をマージしないように、すべてのファイルが改行文字(テキストエディターから見た場合はファイルの最後の空行)で終わることが重要だと思います。

インポートは正常に機能します。有効化と無効化の自動コミット機能が改善されたため、実際に高速であるかどうかはテストしていませんが、それにより高速になる場合は、この追加の手順により簡単になります。

5
santiago arizti

私は_--compress_と_SET autocommit=0;_を試してみましたが、少しは役に立ちました...

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

WAN経由のSSL経由でmysqlを使用しています。リモート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サーバー 一度に1,000行のみに制限されているようです

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

2
tresf