こんにちは。エンジニアの阿久津です。
今回はMySQLの mysqldump と mysqlpump という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
検証内容
以下の条件で mysqldump と mysqlpump どちらが速くバックアップできるのか。
※コマンドにはオプションを付けずに、デフォルトのまま実行しています。
① 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 が速い結果となりました。
まとめ
今回はシンプルに mysqldump と mysqlpump どちらが速くバックアップできるか比較しました。
結果としては、1テーブルをバックアップする場合は mysqldump 、
複数テーブルをバックアップする場合は mysqlpump の方が速い結果となりました。
mysqlpump には並列ダンプ機能があるため、複数テーブルのバックアップにはやはり強いようです。
今回は少ないテーブルをバックアップしましたが、データベースやテーブルが膨大な場合は
mysqlpump を使った方が速くバックアップができそうです。
Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。