Xtrabackup
Percona XtraBackup は高性能・ロープロファイル・ノンブロッキングな InnoDB や XtraDB データベースのオープンソースのバックアップユーティリティです。
データベースをロックしないで MySQL ベースのサーバー (MySQL, MariaDB, Percona Server) をバックアップできる唯一のオープンソースツールです。データベースが動作している状態のままバックアップを行うことができ、クエリやトランザクションに影響を与えません (ホットバックアップ)。
MySQL 5.0 や 5.1 サーバーの InnoDB, XtraDB, MyISAM テーブルからデータをバックアップすることが可能で、部分的なバックアップ・リモートバックアップ・圧縮バックアップ・差分バックアップなどの高度な機能を備えていて、さらにマルチスレッドによる高速なファイルコピーを活用してバックアップ時点までリカバリすることができます。
目次
インストール
公式リポジトリから xtrabackup パッケージをインストールしてください。
使用方法
XtraBackup には3つのツールが存在します:
- xtrabackup
- InnoDB と XtraDB のデータだけをコピーするコンパイル済みの C バイナリ。
- innobackupex
- MyISAM, InnoDB, XtraDB テーブルが保存されている MySQL データベースインスタンス全体をバックアップするためのラッパースクリプト。
- tar4ibd
- InnoDB のデータを安全に扱うために tar にパッチを適用した派生版。
下のセクションでは、以下のことを前提にコマンドを記載しています:
- バックアップするサーバーのデータが
/var/lib/mysql/
に保存されていること。Arch Linux におけるデフォルトの保存場所です。 - 作成したバックアップを
/data/backups/mysql
に保存すること。 my.cnf
がデフォルトの/etc/my.cnf
にあり、以下の設定がされていること:
[mysqld] datadir=/var/lib/mysql/ [xtrabackup] target_dir=/data/backups/mysql/
xtrabackup
InnoDB のデータとログファイルのバックアップを作成して、バックアップからデータファイルが使える状態にします。
バックアップを作成:
# xtrabackup --backup
バックアップの準備:
# xtrabackup --prepare
再度実行して InnoDB のログファイルを新しく作成:
# xtrabackup --prepare
xtrabackup の実行が成功すると終了ステータス 0 が返ってきます。2回目の --prepare
では、InnoDB によって “Log file ./ib_logfile0 did not exist: new to be created” というメッセージが出力され、ログファイルが作成されたことが確認できるはずです。
空きメモリが豊富に存在するデータベース専用サーバーの場合、--use-memory
オプションでバッファプールと同じサイズを設定すると良いでしょう。ツールの完全なドキュメントは こちら にあります。
innobackupex
my.cnf
で指定したディレクトリから MySQL のデータを全てコピーします。デフォルトでは /data/backups/
のタイムスタンプが名前のサブディレクトリにバックアップが作成されます (例: /data/backups/2010-03-13_02-42-44
):
# innobackupex /data/backups
レプリカ (スレーブ) からバックアップを作成したい場合、バックアップする際にプライマリ (マスター) の相対パスを確認してください:
# innobackupex --slave-info /data/backups
ツールの完全なドキュメントは こちら にあります。
tar4ibd
tar4ibd バイナリは InnoDB/XtraDB のデータファイルを適切に扱えるように tar に特殊なパッチをあてています。
使用方法は tar と同じです。GNU tar でファイルを抽出する場合は -i
オプションを指定する必要があるので注意してください。指定しないとデータの一部だけが抽出されます。
Tips and tricks
Xtrabackup でスレーブを設定
Xtrabackup を使うことでスレーブを別のスレーブに複製したり、マスターから新しくスレーブを設定することができます。サーバーの複製によって動作がブロックされることはありません (MyISAM は除く)。
上記と同じ想定の場合、まずは以下のコマンドを実行:
# innobackupex --stream=tar /tmp/ --slave-info | ssh user@DESTSERVER "tar xfi - -C /var/lib/mysql"
完了したら、複製先のサーバーで以下のコマンドを実行:
# innobackupex --apply-log --use-memory=2G /var/lib/mysql
これでデータベースディレクトリの準備ができます。
オリジナルのサーバーから新しいスレーブに my.cnf
をコピーして mysqld
を起動してください。
スレーブに作成される xtrabackup_slave_info
ファイルの中身を確認:
# cat /var/lib/mysql/xtrabackup_slave_info CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000834', MASTER_LOG_POS=50743116
mysql コンソールで以下のコマンドを実行してスレーブを起動:
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000834', MASTER_LOG_POS=50743116; mysql> START SLAVE;
以下のコマンドで設定が上手くいったことを確認できます:
mysql> SHOW SLAVE STATUS \G ... Slave_IO_Running: Yes Slave_SQL_Running: Yes ... Seconds_Behind_Master: 1643 ...