MySQL道普請便り

第168回 MyDumperを使ってみよう[その1]

この記事を読むのに必要な時間:およそ 4 分

MySQLの論理バックアップツールというと,mysqldumpは皆さんご存知のことでしょう。mysqldumpはシリアルで処理されるため,大きなデータベースのバックアップとリストアには大変時間がかかりました。

その後mysqlpumpが登場し,これによりバックアップはパラレルで処理するため高速化されましたが,リストアはmysqldumpと同様シリアルで処理されるため,これもまた時間がかかりました。

mysqldumpとmysqlpumpについては以下記事をご参照ください。

MyDumperはバックアップとリストアをパラレルで処理するため,mysqldumpやmysqlpumpよりも高速です。

ただし,最近ではMySQL ShellにMySQL Shellダンプユーティリティという論理バックアップ機能がリリースされています。これもまたバックアップとリストアをパラレルで処理するため,mysqldumpやmysqlpumpよりも高速です。

今回は,筆者の使い慣れているMySQLの論理バックアップツールMyDumperについて紹介したいと思います。

MyDumperについて

MyDumperはコミュニティによって管理されているOSSであり,Official MyDumper projectにて開発が進められています。

また,2021年ごろから積極的にメンテナンスされていて,新機能も多く開発されています。詳しくはPercona Blogをご確認ください。

MyDumperの動作の流れとしては,まずmydumperコマンドを使ってスキーマやデータのエクスポートを実行します。エクスポート完了後にmyloaderコマンドを使ってエクスポートしたデータをインポートします。MyDumperを使うメリットは,エクスポートとインポートともにパラレル処理で実行されるので高速でエクスポート/インポートが完了します。

MyDumperのインストール

今回はCentOS 7にMyDumperをインストールしてみます。

Releasesから2022/3月現在の最新バージョンであるv0.12.1のrmpを使ってインストールします。

# rpm -iv https://github.com/mydumper/mydumper/releases/download/v0.12.1/mydumper-0.12.1-1.el7.x86_64.rpm
Retrieving https://github.com/mydumper/mydumper/releases/download/v0.12.1/mydumper-0.12.1-1.el7.x86_64.rpm
Preparing packages...
mydumper-0.12.1-1.x86_64

インストール完了です。

# mydumper --version
mydumper 0.12.1, built against MySQL 5.7.34-37

# myloader --version
myloader 0.12.1, built against MySQL 5.7.34-37

MyDumperを使ってみる

それでは,MyDumperを使ってMySQLのバックアップとリストアをやってみましょう。今回は192.168.0.1のサーバをMyDumper用サーバとして使用し,ここから異なるMySQLに対してバックアップの取得とリストアを実施してみます。

ユーザー作成

まずは,エクスポートとインポートを行うMySQLにユーザーを作成します。MyDumperのオプションによって使用する権限が異なるので,今回はALLで作成します。

CREATE USER 'mydumper'@'192.168.0.1' IDENTIFIED BY 'mydumper';
GRANT ALL ON *.* TO 'mydumper'@'192.168.0.1';

エクスポート

では,mydumperコマンドを使ってdb1スキーマのバックアップを取得してみます。今回は最小限のオプションで実行します。

コマンド

mydumper \
--host mysql-hostname1 \
--port 3306 \
--user mydumper \
--ask-password \
--database db1 \
--outputdir ./mydumper_dir \
--verbose 3
Enter MySQL Password:

ログ

** Message: 14:33:27.093: MyDumper backup version: 0.12.1
** Message: 14:33:27.098: Server version reported as: 8.0.28
** Message: 14:33:27.098: Connected to a MySQL server
** Message: 14:33:27.101: Started dump at: 2022-03-20 14:33:27
** Message: 14:33:27.102: Written master status
** Message: 14:33:27.103: Thread 1 connected using MySQL connection ID 5631
** Message: 14:33:27.105: Thread 2 connected using MySQL connection ID 5632
** Message: 14:33:27.107: Thread 3 connected using MySQL connection ID 5633
** Message: 14:33:27.108: Thread 4 connected using MySQL connection ID 5634
** Message: 14:33:27.109: Thread 1 dumping db information for `db1`
** Message: 14:33:27.109: Thread 2 dumping schema create for `db1`
** Message: 14:33:27.115: No anonymized func for that
** Message: 14:33:27.116: No anonymized func for that
** Message: 14:33:27.117: No anonymized func for that
** Message: 14:33:27.118: No anonymized func for that
** Message: 14:33:27.118: Thread 3 dumping schema for `db1`.`t0`
** Message: 14:33:27.118: Thread 2 dumping schema for `db1`.`t1`
** Message: 14:33:27.118: Thread 4 dumping schema for `db1`.`t2`
** Message: 14:33:27.119: Thread 1 dumping schema for `db1`.`t3`
** Message: 14:33:27.122: Non-InnoDB dump complete, unlocking tables
** Message: 14:33:27.123: Thread 2 dumping data for `db1`.`t0` | Remaining jobs: 7
** Message: 14:33:27.123: Thread 4 dumping data for `db1`.`t1` | Remaining jobs: 6
** Message: 14:33:27.124: Thread 1 dumping data for `db1`.`t2` | Remaining jobs: 5
** Message: 14:33:27.126: Thread 2 dumping data for `db1`.`t3` | Remaining jobs: 4
** Message: 14:33:27.127: Thread 1 shutting down
** Message: 14:33:27.128: Thread 4 shutting down
** Message: 14:33:27.128: Thread 3 shutting down
** Message: 14:33:27.129: Thread 2 shutting down
** Message: 14:33:27.135: Finished dump at: 2022-03-20 14:33:27

ログを見ると,Finished dumpの出力が確認できたところでバックアップが完了です。また,スレッドが4つ起動していることがわかります。mydumperはデフォルトでは4つのスレッドを起動して,並列でバックアップを実行します。

今回のmydumperのオプションについては以下のとおりです。

  • --host …バックアップ取得先のMySQLサーバのホスト
  • --port …バックアップ取得先のMySQLのポート番号
  • --user …バックアップ取得先に接続するユーザ名
  • --ask-password …バックアップ取得先に接続するユーザ名のパスワードを接続時に入力
  • --database …バックアップを取得するデータベース名
  • --outputdir …エクスポートしたデータファイルの格納先ディレクトリ
  • --verbose …標準出力メッセージのレベル(0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2)

--outputdirオプションで指定した./mydumper_dirディレクトリの中身をみてみましょう。ここで指定したディレクトリは存在しなくても,mydumper実行時に自動生成されます。

# ls ./mydumper_dir
db1-schema-create.sql  db1.t0-metadata    db1.t1.00000.sql  db1.t1-schema.sql  db1.t2-metadata    db1.t3.00000.sql  db1.t3-schema.sql
db1.t0.00000.sql       db1.t0-schema.sql  db1.t1-metadata   db1.t2.00000.sql   db1.t2-schema.sql  db1.t3-metadata   metadata

このように取得したバックアップファイルが格納されています。

インポート

それでは,このバックアップファイルを使ってmyloaderコマンドでリストアしてみます。

コマンド

myloader \
--host mysql-hostname2 \
--port 3306 \
--user mydumper \
--ask-password \
--directory ./mydumper \
--verbose 3

ログ

** Message: 14:51:19.938: Server version reported as: 8.0.19
** Message: 14:51:19.945: Thread 1 restoring create database on `db1` from db1-schema-create.sql
** Message: 14:51:19.947: Thread 3 restoring table `db1`.`t2` from /root/./mydumper/db1.t2-schema.sql
** Message: 14:51:19.947: Thread 2 restoring table `db1`.`t3` from /root/./mydumper/db1.t3-schema.sql
** Message: 14:51:19.947: Thread 1 restoring table `db1`.`t0` from /root/./mydumper/db1.t0-schema.sql
** Message: 14:51:19.948: Thread 4 restoring table `db1`.`t1` from /root/./mydumper/db1.t1-schema.sql
** Message: 14:51:19.948: Creating table `db1`.`t2` from content in /root/./mydumper/db1.t2-schema.sql
** Message: 14:51:19.948: Creating table `db1`.`t3` from content in /root/./mydumper/db1.t3-schema.sql
** Message: 14:51:19.948: Creating table `db1`.`t0` from content in /root/./mydumper/db1.t0-schema.sql
** Message: 14:51:19.948: Creating table `db1`.`t1` from content in /root/./mydumper/db1.t1-schema.sql
** Message: 14:51:19.981: Thread 3 restoring `db1`.`t3` part 0 0 of 1 from db1.t3.00000.sql. Progress 1 of 4 .
** Message: 14:51:19.981: Thread 2 restoring `db1`.`t2` part 0 0 of 1 from db1.t2.00000.sql. Progress 2 of 4 .
** Message: 14:51:19.981: Thread 1 restoring `db1`.`t1` part 0 0 of 1 from db1.t1.00000.sql. Progress 3 of 4 .
** Message: 14:51:19.981: Thread 4 restoring `db1`.`t0` part 0 0 of 1 from db1.t0.00000.sql. Progress 4 of 4 .
** Message: 14:51:19.985: Import timings:
** Message: 14:51:19.985: Data          | Index         | Total         | Table
** Message: 14:51:19.986: 0 00:00:00    | 0 00:00:00    | 0 00:00:00    | `db1`.`t0`
** Message: 14:51:19.986: 0 00:00:00    | 0 00:00:00    | 0 00:00:00    | `db1`.`t1`
** Message: 14:51:19.987: 0 00:00:00    | 0 00:00:00    | 0 00:00:00    | `db1`.`t2`
** Message: 14:51:19.988: 0 00:00:00    | 0 00:00:00    | 0 00:00:00    | `db1`.`t3`
** Message: 14:51:19.989: Starting table checksum verification

エラー表示がなければ,正常にリストア完了です。

もしエラーがあった場合は,CRITICALとしてメッセージが表示されます。または,終了ステータスとして0以外が返ります。

** (myloader:76891): CRITICAL **: 14:50:57.726: Error occurs between lines: 4 and 7 on file db1.t0.00000.sql: Duplicate entry '1' for key 't0.id'

myloaderコマンドを使えば,ログから進捗状況がわかります。Progress 1 of 4のように,全体のファイル数のうち現在どのファイルを処理しているのかわかるようになっています。また,Import timings:以下に表示されているものは,各テーブルごとにインポートにどれくらい時間がかかったのかサマリーしてくれるようになっています。

今回のmyloaderのオプションについては以下のとおりです。前述のmydumperコマンドのオプションと同様のものは割愛しています。

  • --directory …mydumperコマンドにてエクスポートしたバックアップファイルの格納先ディレクトリ

以上がmydumperを使ったバックアップからリストアまでの一連の流れになります。

まとめ

今回はmydumperを使ってみようということで,バックアップ取得する方法とリストアする方法の流れを簡単に紹介しました。次はmydumperのオプションやTipsについて紹介したいと思います。

著者プロフィール

北川健太郎(きたがわけんたろう)

LINE株式会社所属のデータベースエンジニア。担当はMySQLとOracle Database。好きなMySQLの機能はレプリケーションで,好きなOracleDatabaseの機能はログオントリガー。

Twitter:@keny_lala