こんにちは。エンジニアの阿久津です。
今回はMySQLの mysqldumpmysqlpump という2つのコマンドでバックアップを実施しどちらが速く処理するのか比較してみましたので、それを記事にしたいと思います。

mysqldumpとは

従来のMySQLデータベースのバックアップ/リストアに用いられるコマンドです。

mysqlpumpとは

MySQL5.7から追加された新機能で、 mysqldump の次世代となるコマンドです。

機能紹介

1. 並列処理(並列ダンプ)

複数のデータベース・テーブルを並列処理でバックアップすることができます。
MySQLサーバからデータを収集するために複数のスレッドを作成し、そのスレッドがそれぞれMySQLサーバへ接続してデータをまとめるためにキューに取得したデータを挿入する仕組みになっています。
オプションを何も利用せずにデフォルトで mysqlpump を利用すると、スレッド数は2つ、キュー数は1つでダンプ処理が走ります。
–parallel-schemas オプションと –default-parallelism を使うと、スレッド数とキュー数を調整しながら、ダンプを実施できるみたいです。

2. 圧縮出力

–compress オプションを使えば、クライアント・サーバ間で送信されるデータを圧縮することができます。また –compress-output オプションを使うと、ダンプデータを圧縮できるようです。※ZLIBとLZ4をサポート。

せっかくなので –compress-output を使ってみました。
内容としては、mysql_testというデータベースを圧縮なし、圧縮ありのパターンで比較してみます。

圧縮なし
$ mysqlpump --single-transaction -uroot -pXXXXXXXXX mysql_test > ~/tmp_default.sql
圧縮あり
$ mysqlpump --single-transaction --compress-output=LZ4 -uroot -pXXXXXXXXX mysql_test > ~/tmp_compress.sql
結果
$ du -hs ~/tmp*
177M    tmp_default.sql
129M    tmp_compress.sql

圧縮されてる!これは便利ですね!

3. ダンプ処理の進捗出力

mysqlpump には、ダンプ処理の進捗を確認できる機能が備わっています。
これは実際に見たほうが早いと思いますのでやってみました。

結果
$ mysqlpump --single-transaction -uroot -pXXXXXXXXX mysql_test > ~/tmp.sql
mysqlpump: [Warning] Using a password on the command line interface can be insecure.
Dump progress: 0/1 tables, 250/2145122 rows
Dump progress: 0/1 tables, 226000/2145122 rows
Dump progress: 0/1 tables, 522250/2145122 rows
Dump progress: 0/1 tables, 804000/2145122 rows
Dump progress: 0/1 tables, 1075500/2145122 rows
Dump progress: 0/1 tables, 1360000/2145122 rows
Dump progress: 0/1 tables, 1625000/2145122 rows
Dump progress: 0/1 tables, 1885250/2145122 rows
Dump completed in 8510 milliseconds

上記のように、ダンプ処理の進捗を確認できます。
mysqldumpにはない機能なので、便利ですね。

他にも新機能はあると思いますが、紹介はこのくらいにして
今回の検証に移りたいと思います。

検証環境

  • Vagrant 1.9.5
  • CentOS Linux release 7.1.1503 (Core)
  • MySQL 5.7.23

検証内容

以下の条件で mysqldumpmysqlpump どちらが速くバックアップできるのか。
※コマンドにはオプションを付けずに、デフォルトのまま実行しています。

① 1テーブル(約130MB)でバックアップする場合
② 1テーブル(約500MB)でバックアップする場合
③ 3テーブルでバックアップする場合
④ 5テーブルをバックアップする場合

検証結果

① 1テーブル(約130MB)でバックアップする場合

1テーブル
行数 : 1048576
サイズ : 約130MB

mysqldumpコマンド
$ time mysqldump --single-transaction -uroot -pXXXXXXXXX mysql_test test1 > ~/tmp.sql
mysqlpumpコマンド
$ time mysqlpump --single-transaction -uroot -pXXXXXXXXX mysql_test test1 > ~/tmp.sql
結果

約0.6秒ほど mysqldump が速い結果となりました。

② 1テーブル(約500MB)でバックアップする場合

1テーブル
行数 : 4194304
サイズ : 約500MB

mysqldumpコマンド
$ time mysqldump --single-transaction -uroot -pXXXXXXXXX mysql_test test1 > ~/tmp.sql
mysqlpumpコマンド
$ time mysqlpump --single-transaction -uroot -pXXXXXXXXX mysql_test test1 > ~/tmp.sql
結果

約2.2秒ほど mysqldump が速い結果となりました。

③ 2テーブルでバックアップする場合

1テーブル
行数 : 33556096
サイズ : 約800MB

mysqldumpコマンド
$ time mysqldump --single-transaction -uroot -pXXXXXXXXX mysql_test test1 test2 > ~/tmp.sql
mysqlpumpコマンド
$ time mysqlpump --single-transaction -uroot -pXXXXXXXXX mysql_test test1 test2 > ~/tmp.sql
結果

約5.5秒ほど mysqlpump が速い結果となりました。

④ 3テーブルでバックアップする場合

1テーブル
行数 : 33556096
サイズ : 約800MB

mysqldumpコマンド
$ time mysqldump --single-transaction -uroot -pXXXXXXXXX mysql_test test1 test2 test3 > ~/tmp.sql
mysqlpumpコマンド
$ time mysqlpump --single-transaction -uroot -pXXXXXXXXX mysql_test test1 test2 test3 > ~/tmp.sql
結果

約7.1秒ほど mysqlpump が速い結果となりました。

まとめ

今回はシンプルに mysqldumpmysqlpump どちらが速くバックアップできるか比較しました。
結果としては、1テーブルをバックアップする場合は mysqldump
複数テーブルをバックアップする場合は mysqlpump の方が速い結果となりました。
mysqlpump には並列ダンプ機能があるため、複数テーブルのバックアップにはやはり強いようです。
今回は少ないテーブルをバックアップしましたが、データベースやテーブルが膨大な場合は
mysqlpump を使った方が速くバックアップができそうです。

Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。

IT×ブライダルで業界を変える!プロフェッショナルなWEBエンジニア募集!

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る