以前に筆者が担当した第168回に続いて、論理バックアップツール MyDumperについて紹介します。先に第168回 MyDumperを使ってみよう[その1]をご確認ください。第168回の記事と同様に、MyDumperのバージョンはv0.12.1を使用します。
MyDumper実行時の注意点
エクスポート用のmydumperコマンド(以降、mydumper)実行とインポート用のmyloaderコマンド(以降、myloader)を実行する際の注意点を紹介します。
mydumperは開始時にFLUSH TABLE WITH READ LOCK
を実行して、書き込みをブロックします。そして、--threads
オプションで指定したスレッドを生成し、同一の静止点を取得するためにそれぞれのスレッドで START TRANSACTION WITH CONSISTENT SNAPSHOT
を実行します。その後、UNLOCK TABLES
にてロックの解除を行い、エクスポート処理を開始します。
そのため、mydumper開始時に実行中のクエリ(ロングクエリ)があると、最初のFLUSH TABLE WITH READ LOCK
がロングクエリが終わるまで待機されます。そうすると、以降のロングクエリと同じテーブルを参照するアプリケーションからのクエリも待機になり、障害になる可能性があります。
mydumperを開始するときは、負荷が低い時間帯やサービスに影響の少ないレプリカなどで実施するほうがよいでしょう。または、--long-query-guard
オプションを短い値に設定することで、安全に実行することもできます。このオプションのデフォルト60秒で、60秒以上実行中にクエリがある状態でmydumperを開始するとアボートするようになっています。
MyDumperのパラレル(並列)実行について
mydumperとmyloaderはともに並列で処理できます。どちらのコマンドも--threads
オプションにより並列度を設定します。mydumperによりダンプファイルが複数に分割され保存されます。その分割されたファイル単位でmyloaderが並列に実行する流れになります。
コマンドオプションにより並列実行の動作が異なるので、そちらについて説明します。
mydumper
mydumperコマンドでは、--threads
オプションにて並列度を設定します。どのように並列実行が動作するかはオプションによって異なります。
--rows
オプション
単位は行数で、テーブルの行数単位でファイルを分割します。たとえば--rows 100000
と設定した場合は、統計情報を基に主キーを使って100000件の範囲検索で取得し、それぞれダンプファイルを生成します。
ここではdb1
データベースには主キーがid
のt0
テーブルがあります。 --rows
オプションで指定した値とは誤差がありますが、ログから主キーのid
を使って範囲検索にて取得しているのがわかります。
注意として、主キーが整数型である必要があります。文字列型などの主キーであると範囲検索できないので、全件取得されます。
--rows
オプションは、範囲を単位に--threads
オプションで指定した並列度で動作します。このオプションのメリットとして、1つのテーブルだけサイズが大きい場合はそのテーブルにおいても並列に処理できます。そのため、エクスポート時間が速くなることがあります。
デメリットとしては、統計情報を基に範囲分割するので、均等にファイルが分散されない恐れがあります。そうすると、myloaderにて非効率のインポート処理が行われる可能性があります。
--chunk-filesize
オプション
単位はMBで、ダンプファイルのサイズ単位でファイルを分割します。たとえば--chunk-filesize 2
と指定すると、ファイルサイズが2~3MBで切り替えるようになっています。
--chunk-filesize
オプションの場合は、テーブル単位に--threads
オプションで指定した並列度で動作します。
このオプションのメリットとしては、均等にファイルが分割されるのでmyloader実行時に効率良く、並列でインポートが処理されます。デメリットとしては、テーブル単位で並列で動作するために、1つのテーブルのみサイズが大きい場合は並列に処理できないので、エクスポートに時間がかかってしまう恐れがあります。
--rows
と--chunk-filesize
オプションは片方のみ設定できます。両方指定した場合は--rows
が優先されます。
myloader
myloaderでは、--threads
オプションで指定した並列度はmydumperで出力したダンプファイル単位で実行されます。
その他
オプション
その他知っておくと良いオプションを紹介します。
--no-schemas
- テーブル定義などは含まずデータのみエクスポートします。
--no-data
- データは含まずテーブル定義のみエクスポートします。
--compress
- 出力するダンプファイルを圧縮します。デフォルトはOFFです。
--statement-size
- 作成するINSERT文の1つのサイズ(バイト)。デフォルトは1000000です。
--events
,--triggers
,--routines
- それぞれイベント、トリガーとストアドプロシージャを含めてエクスポートします。デフォルトではこれは取得されないので、必須オプションといえます。
レプリケーション情報
mydumper完了時に、--outputdir
オプションに指定したディレクトリにmetadata
というファイルができます。そこに、SHOW SLAVE STATUS
とSHOW MASTER STATUS
の情報が出力されています。myloaderでリストアした先のMySQLをレプリカとして動作させたいときは、このファイルを見ると良いでしょう。
まとめ
今回は主にMyDumperのオプションについて紹介しました。もし、mysqldumpでバックアップを取得していて時間がかかって困っていたら、MyDumperを検討してみてはどうでしょうか。