innobackupexを利用したバックアップ/リストアの世界
mysqldumpはリストアが遅い。遅い。
そこで最近はSQLベースではなく、データファイルを一貫性のある状態でまるごとバックアップしてくれる神ツール
innobackupexを利用しています。xtrabackupというツールのラッパーみたいです。
スレーブサーバの複製にも活用できます。
これが見つけられなかったら色々詰んでた。ありがとうinnobackupx.いいバックアップです。
バックアップ
スレーブでバックアップを取得する場合は --slave-info, --safe-slave-backupを指定します。
# innobackupex --ibbackup=xtrabackup --slave-info --safe-slave-backup --compress <backup_directory>
・・省略・・
innobackupex: completed OK!
バックアップが完了すると、バックアップ先ディレクトリ/<コマンド実行日付>のディレクトリが作られており、
その中にバックアップデータが格納されている。--compressを指定した場合は圧縮も行われる。
リストア
MySQLは停止すること。
datadir配下は削除すること。残っているとリストアに失敗します。
(1) compressオプションを実行してバックアップしていた場合
2.1.3以下の場合はqpressを使って解凍する必要があります。
詳細はここ参照
percona xtrabackup 2.1.4以上をインストールしていた場合は--decompressオプションが利用できます。
# innobackupex --user root --password="<PASS>" --decompress <バックアップディレクトリ>
・・省略・・
innobackupex: completed OK!
(2) バックアップしたファイルへログの適用
ログを適用しないと一貫性あるバックアップデータになりません。
適用せずリストアしてもCrashエラーにガン詰めされます。
# innobackupex --user root --password="" --apply-log <バックアップディレクトリ>
・・省略・・
innobackupex: completed OK!
(3)データファイルのリストア
データファイルをcopy backした後のディレクトリはMySQL所有者に変更しておきます。
# innobackupex --copy-back ・・省略・・ innobackupex: completed OK! # chown -R mysql:mysql <datadir>
(4)MySQLの起動
log_file系のパラメータがバックアップ/リストア時点で異なる場合は、
MySQL起動前にib_logfile*を削除しておきます。
innodb_log_files_in_group innodb_log_file_size
# service mysql start
(5)レプリケーションの復旧
スレーブでのバックアップ--slave-infoオプション指定してバックアップを取得すると
xtrabackup_slave_infoファイルが作成されます。
バックアップ時点のmaster_log_fileとmaster_log_positionが記述されたファイルが記録されています。
これを少し修正してCHANGE MASTER構文を実行することでスレーブが復旧します。
mysql> CHANGE MASTER TO MASTER_HOST='*******', MASTER_USER='*******', MASTER_PASSWORD='*******', MASTER_LOG_FILE='*******, MASTER_LOG_POS=******** # mysql -u root -e "show slave status\G"
これでreplication errorがでなければOKです。