前回、前々回とMariaDB+Galera Clusterでのバックアップについて、記述してきた。
今回は、それらと同じくMariaDBのバックアップ・リストアを実施するツールであるPercona XtraBackupを使用してのバックアップを取得してみる。

  1. GaleraClusterの構成ノードを切り離しorLVMのスナップショットを使用し、ファイルをバックアップする
  2. mysqldumpを使用してオンラインバックアップ
  3. Percona XtraBackupを使用してオンラインバックアップ

このPercona XtraBackup、mysqldumpとくらべてコマンド側で差分バックアップを行えたり、リストア時間もmysqldumpとくらべて高速だったりと、オンライン・バックアップをするならmysqldumpよりはるかに便利なコマンドになっている。追加でパッケージを導入する必要があるが、それが許されるならこちらでバックアップを取得した方が良いだろう。なお、生のxtrabackupコマンドは使いにくいため、ここではラッパーコマンドである「innobackupex」コマンドを用いる。

1.インストール

まずは、以下のコマンドでXtrabackupをインストールする。

RHEL系の場合

こちらを参考に、以下のコマンドを実行する。

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
yum install percona-xtrabackup-22

Debian/Ubuntuの場合

こちらを参考に、以下のコマンドを実行する。

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.12/binary/debian/jessie/x86_64/percona-xtrabackup_2.2.12-1.jessie_amd64.deb
sudo dpkg -i percona-xtrabackup_2.2.12-1.jessie_amd64.deb

2.バックアップ

2-1.フルバックアップ・差分バックアップ

無事Xtrabackupのインストールができたら、こちらを参考に実際にバックアップを実行する。
まず、以下のコマンドを実行することでフルバックアップを取得する。

innobackupex --user=root --password=パスワード --galera-info --slave-info --safe-slave-backup バックアップフォルダ作成先PATH --no-lock

差分バックアップを取得する場合は、「--incremental」にバックアップ作成ディレクトリを、「--incremental-basedir」に前回のバックアップディレクトリ(日付ディレクトリ)を指定する。
ここでは、一番新しい日付ディレクトリ=前回のバックアップディレクトリという考えの元、findでディレクトリを指定している。

innobackupex --user=root --password=パスワード --galera-info --slave-info --safe-slave-backup --incremental バックアップフォルダ作成先PATH --incremental-basedir=$(find バックアップフォルダ作成先PATH -maxdepth 1 -type d | tail -1) --no-lock

2-2.特定のテーブルのみ、データベースのみのバックアップ

なお、テーブルだけ、データベースだけをバックアップする場合は、以下のようにコマンドを実行する。

innobackupex --user=root --password=パスワード --databases="データベース名" --galera-info バックアップフォルダ作成先PATH # 特定のデータベースを指定(スペース区切りで別のデータベースを指定可能)
innobackupex --user=root --password=パスワード --databases="データベース名.テーブル名" --galera-info バックアップフォルダ作成先PATH # 特定のテーブルを指定(スペース区切りで別のデータベースを指定可能)

2-3.暗号化してバックアップ

バックアップファイルを暗号化する場合は、「--encrypt」と「--encrypt-key」もしくは「--encrypt-key-file」オプションを付与しバックアップを行う。
まずは、opensslでキーコードを作成する。

openssl rand -base64 24
[root@BS-PUB-GALERA-01 ~]# openssl rand -base64 24
GwVp1YxSx3d6ukXaTTsFbN7iDGqOxCeZ

後は、このキーコードをファイルに書き込むか、コマンドで直接指定してバックアップを取得すれば良い。

innobackupex --user=root --password パスワード --galera-info --encrypt=AES256 --encrypt-key="キーコード" バックアップ先PATH
innobackupex --user=root --password パスワード --galera-info --encrypt=AES256 --encrypt-key-file="キーファイル" バックアップ先PATH
[root@BS-PUB-GALERA-01 ~]# innobackupex --user=root --galera-info --encrypt=AES256 --encrypt-key="GwVp1YxSx3d6ukXaTTsFbN7iDGqOxCeZ" /var/lib/mysql_backup/

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991
....

なお、解凍する場合は「--decrypt」でアルゴリズムを、「--encrypt-key」および「--encrypt-key-file」でキーコードやキーファイルを指定する。

3.リストア

無事バックアップが取得出来たので、リストアをしてみよう。
まず、GaleraClusterを構成している全てのノードでMariaDBを停止する。

service mysql stop
mv /var/lib/mysql /var/lib/mysql.$(date +%Y%m%d).bk

3-1.フルバックアップ・差分バックアップからのリストア

フルバックアップ・差分バックアップを取得している場合は、各差分バックアップをフルバックアップに適用し、バックアップファイルを使える状態にする。

innobackupex --user=root --password=パスワード --apply-log --redo-only フルバックアップPATH
innobackupex --user=root --password=パスワード --apply-log --redo-only フルバックアップPATH --incremental-dir=差分バックアップPATH

差分バックアップの適用完了後、以下のコマンドでバックアップをリストアする。

innobackupex --copy-back フルバックアップPATH

なお、この時以下のようなエラーが出た場合は、datadirなどの値がうまく認識されていない。
このため、"もし設定ファイルにその辺りの記述が無いのであれば"以下のコマンドを実行する。

cat << EOF > /etc/my.innobackupex.cnf
[mysqld]
datadir = /var/lib/mysql
innodb_data_home_dir = /var/lib/mysql
innodb_log_group_home_dir = /var/lib/mysql
EOF
innobackupex --defaults-file=/etc/my.innobackupex.cnf --copy-back フルバックアップPATH
chown -R mysql:mysql /var/lib/mysql

後は、各ノードでMariaDBを起動させ、クラスタを再開するだけだ。

service mysql bootstrap # 最初の1台目
service mysql start # 2台目以降

3-2.Point-in-Timeリカバリ

差分リカバリではなく、完全な特定時刻(2016/02/14 02:00:00時点指定など)の状態をリカバリする場合は、フルバックアップ・差分バックアップと、また別にバイナリログを定期的にバックアップしておく必要がある。
まず、バックアップ時点でのバイナリログのポジションを確認するため、最後に適用する差分バックアップのバイナリログポジションを確認する。

cat 最後に適用する差分バックアップディレクトリ/xtrabackup_binlog_info
[root@BS-PUB-GALERA-01 ~]# cat /var/lib/mysql_backup6_1/xtrabackup_binlog_info
binlog.000035   359     0-1-204

で、これをみるとbinlog.000035の359が、この差分バックアップでのバイナリログ開始時点となっている。
この情報を元に、別でバックアップしていたバイナリログからsqlを抜き出す。

mysqlbinlog -u root -D 適用対象のバイナリログ・ファイルPATH --start-position=適用するポジション(上の例の場合、359) --stop-datetime="適用させる終了時刻" > PITR用SQLファイルPATH

後は、フルバックアップ・差分バックアップを適用後、上記sqlファイルを読みこませれば良い。

mysql -u root -p < PIRT用SQLファイルPATH

確かに、mysqldumpに比べて差分バックアップやリカバリ時間の短縮など、非常に使い勝手が良い。(出来れば、バイナリログをファイルとしてどこかに保持する機能があるといいんだけど)
とりあえずこれでバックアップを取得していくようにしよう。