Percona Xtrabackupの履歴機能と増分バックアップについて

Percona Xtrabackup 利用されておりますでしょうか。

今回は、運用を便利にする Percona Xtrabackup の履歴機能の活用方法についてご紹介させていただきます。

目次

Percona Xtrabackupの履歴機能

Percona Xtrabackupでは、 --backup 時に --history オプションをつけることで PERCONA_SCHEMA.xtrabackup_history テーブルに実行されたバックアップの履歴を取ることができます。

Store backup history on the server

例えば以下のようにバックアップを取得すると

履歴テーブルが作成され、実行履歴が格納されています。

これだけでも、バックアップにどのくらい時間がかかっていたのか、圧縮や暗号化をかけたときとそうでない時の速度差はどうかなど、有用な情報を確認できる気がします。

xtrabackup自体にも、この履歴テーブルの情報を使って、増分バックアップの取得を便利にするオプションが存在しています。

履歴テーブルをつかって増分バックアップを取る

まず、増分バックアップの最もシンプルな取得方法は、 --incremental-basedir=[base backup dir] オプションによりベースバックアップを指定することです。

この場合、ベースディレクトリ名を知る必要がありますが、一般的にバックアップを取得する場合はジョブスケジューラにワンライナーやスクリプトを登録して行うため、これについてのロジックを考える必要が発生します。

差分バックアップとするなら、例としては 「同じディレクトリ内の full というプレフィクスがつくバックアップの最も新しいディレクトリをベースバックアップとする」というような感じになるでしょうか。

増分バックアップとするなら、大まかには「同じディレクトリ内の inc というプレフィクスがつくバックアップの最も新しいディレクトリをベースバックアップとする」のようになるでしょう。

ですが、この場合ディレクトリの命名ルールを設けたり、意図せずバックアップディレクトリのタイムスタンプがズレたりしたときに正常に動作しない可能性があり、それらについてロジックで対応していくのもひと手間です。
そこで、履歴テーブルを活用してよりスクリプティングを効率化することができます。

先程の履歴では name 列が NULL になっていました。
この name 列は --history=[name] のように指定する事ができます。 この名前のことを バックアップ・シリーズ名(シリーズ名) と呼称します。

シリーズ名が付きました。
tool_command--target-dir から、どこにバックアップを取得したのかもわかりますね。

履歴テーブルの各列は以下の意味です。

PERCONA_SCHEMA.xtrabackup_history

Column Name Description
uuid ユニークなバックアップのID
name –historyオプションでユーザーが指定したバックアップシリーズの名前
tool_name バックアップを取得するために使用されるツールの名前
tool_command -–passwordと-–encrypt_keyを隠避したツールに指定された正確なコマンドライン
tool_version バックアップの作成に使用されたツールのバージョン
ibbackup_version バックアップの作成に使用されたxtrabackupバイナリのバージョン
server_version バックアップが作成されたサーバのバージョン
start_time バックアップの開始時刻
end_time バックアップ終了時の時刻
lock_time FLUSH TABLES WITH READ LOCKのロックの呼び出しと保持に費やされた時間 (秒単位)
binlog_pos FLUSH TABLES WITH READ LOCK終了時のバイナリログファイルと位置
innodb_from_lsn 以前のバックアップを判別するために使用できるバックアップ開始時のLSN
innodb_to_lsn 次の増分の開始lsnとして使用できるバックアップ終了時のLSN
partial 部分バックアップかどうか。Nの場合は完全バックアップであることを意味します。
incremental 増分バックアップかどうか。
format 出力形式の説明 (xbstream)
compressed 圧縮されたバックアップかどうか
encrypted 暗号化されたバックアップかどうか

履歴テーブルの情報を元に増分バックアップを取るには、 --incremental-history-name オプションを使用します。
--incremental-history-name にはシリーズ名を指定し、そのバックアップシリーズの内、「 最新の (最大のto_lsn) バックアップを探し、最初のlsnとして使用するto_lsn値を取得します。」 とドキュメントにあります。
実際の検索SQLは以下のとおりです。

ソースコードの該当箇所

それでは --incremental-history-name を使用して2回ほど増分バックアップを取ってみましょう。

以下の通り、最新のLSNをベースに増分バックアップを取る事ができました。
見ての通りですが、つねにベースバックアップは最新のLSNを持つものを選択するので、これは増分バックアップということになり、リストア時は複数の増分バックアップを適用する事になります。

履歴テーブルをつかって差分バックアップを取る

差分バックアップとしたい場合は、 --incremental-history-uuid が役立ちます。
あるシリーズ内の最も新しいフルバックアップの行を取得するSQLを書きます。

上記のSQLの結果を --incremental-history-uuid オプションに使います。
以下のような感じになるでしょう。

incemental=N(フルバックアップ)のinnodb_to_lsnをベースに差分バックアップを取得する事ができました。

バックアップスクリプトを作る

バックアップスクリプトにする場合も、よりわかりやすく記述できるのではと思います。

pxb-backup.sh

cronに設定するならこのようになるでしょう。

バックアップをリモートに送るためや、ファイルとして扱いたいために、 --stream=xbstream として出力しているユーザも多いかと思います。
圧縮なども一般的に行われるでしょう。

--incremental-basedir=[basebackupdir] とした場合は、バックアップ内のメタデータファイル(xtrabackup_info)から開始地点のLSNを取得していますが、xbstream形式でアーカイブされていたりするとxtrabackup_infoが読めない状況になります。
その際のLSNを確認し、指定する方法としては、まず、バックアップ時のログから以下の行を検索し、 --incremental-lsn=[start lsn] のように指定する必要がありました。

これをスクリプトにしようと思うと面倒ですが、履歴テーブルがあれば出力形式にかかわらず開始地点をテーブルから確認できますので、 xbstream ユーザにとっても嬉しい機能かと思います。

バックアップローテーションでも活用できます。

やたらと長くなってしまいましたが、あるシリーズのリストア用コマンドを出力するなどもできます。

以下のようにリストアに必要なコマンドが出力されました。

最新の状態まで復旧するには、存在しているバイナリログを適用する必要がありますが、履歴テーブルにはバックアップ時点のバイナリログ状況も記録されています。

上記の場合は、binlog.000022 以降のファイルを適用すれば良く、GTID aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee:1-100000 までは適用済みと判断できるため、以下のコマンドを実行すれば最新までロールフォワードできます。

サマリ

SQLで必要な情報をクエリできるというのは、今更ながらとても便利に感じました。

xtrabackupを使用しているユーザは多いと思いますが、履歴テーブルを使いこなしているユーザは少数派ではないでしょうか。

興味を持たれたユーザ様はぜひ利用をご検討してみてください!

スマートスタイルTECHブログについて

スマートスタイルTECHブログでは、日頃MySQLのサポート業務に従事している有資格者で構成された技術サポートチームがMySQLに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

スマートスタイルTECHブログについて

スマートスタイルTECHブログでは、日頃オープンソースデータベースのサポート業務に従事している有資格者で構成された技術サポートチームがPerconaに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

よかったらシェアしてね!
  • URLをコピーしました!
目次