業務時間内からこんにちは。
時間のかかる作業(ベンチマークとか)をしていると、その間 暇なんですよね。

MySQL のバックアップ手法

MySQL のバックアップ手法を考えると、ぱっと以下の3つが思い浮かびます。

それぞれの違いと言えば、上記2つは MySQL を一旦止めておかないと色々と不都合(レプリケーションとか)が起きるので、MySQL を止めれる環境ならディレクトリごとコピーしてやったほうが楽だと思います。mysqldump は遅え。

主題とズレるけど、ディレクトリコピーしてリストアすると master.info によって、MySQL を起動すると勝手にレプリケーション貼りにいくので注意が必要。

参照されないスレーブがあるなら、MySQL を止めてディレクトリごとコピーして、スレーブを複製するのが手っ取り早いけどもしないなら、Percona XtraBackup を使う。

Percona XtraBackup

Percona 社が提供してる Percona-toolkit の中の1つで Percona のツールは便利なのが多い。有名なのは pt-online-schema-change とか。

この XtraBackup を使うと、スレーブを止めずにバックアップすることができてバックアップ完了時のバイナリログファイル名、バイナリログのポジションが吐き出されるので大変便利。

インストール

// 最新バージョンはここから https://www.percona.com/doc/percona-repo-config/yum-repo.html
# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
# yum list | grep percona
# yum install percona-xtrabackup-24

バックアップ

$ xtrabackup \
--backup \
--target-dir=/path/to/save \
--datadir=/var/lib/mysql \
--user=root \
--socket=/var/lib/mysql/mysql.sock \
--slave-info \
--compress

–slave-info をつけると
xtrabackup_slave_info というファイルができて、CHANGE MASTER 文 が書かれてる。

バックアップを取るサーバーにディスクの容量に余裕がなければ
–compress をつけて圧縮したり、バックアップしたファイルをそのまま対象サーバーに流すこともできる(未確認)

$ innobackupex /data/mysql --slave-info --stream=xbstream --compress | ssh hoge@fuga "cat - > /path/to/save/backup.xb

ここでは記述しないが、差分バックアップもできたりする。超高機能。

超圧縮版

1.2TB のデータを 200GB にできた。

$ innobackupex --user=root --slave-info --stream=xbstream --parallel=4 /data/mysql | pbzip2 -p16 > /data/tmp/backup.gz

リストア

圧縮して送ったから解凍

$ innobackupex --decompress /path/to/backup_dir

xbstream + pbzip2 でやった場合

$ pbzip2 -cd backup.gz | xbstream -x

準備

$ xtrabackup --prepare --target-dir=/path/to/backup_dir

リストア

$ innobackupex ---move-back /path/to/backup_dir
$ chown -R mysql: /var/lib/mysql

これだけで復元できる。
あとは、xtrabackup_slave_info から CHANGE MASTER 文をコピペして実行してから、START SLAVE でレプリケーションを貼る。

レプリケーション遅延が無くなったら VIP にでも追加しましょう。

watch -n 3 "mysql -uroot -e 'SHOW SLAVE STATUS \G' | grep 'Behind'"