MySQLのコールドバックアップからリカバリまでの備忘録です。
想定している環境はMySQLのインスタンスを停止した状態で完全バックアップ(コールドバックアップ)を行う。復旧が必要になったときはまずバックアップを行った時点まで復旧し(リストア)、バックアップを行った時点から障害直前までの復旧はトランザクションログで復旧させる(リカバリ)。
ロールフォワードリカバリの事前設定
MySQLでトランザクションログにあたるのがバイナリログです。
デフォルトでは作成されないため、my.cnfファイルにパラメータを指定しておきます。
・log-bin:バイナリログを作成する。*1
・sync_binlog=1:トランザクションのコミットと同時にバイナリログにも書き込みを反映する
*1 他のパラメータと異なりディレクトリ指定の後にバイナリログファイルの接頭辞を指定する必要がある。たとえばlog-bin=/var/lib/mysql/binary/binaryと指定すればbinaryディレクトリの下にbinary.000001といったファイル名が作成される。
コールドバックアップ
1.インスタンスを停止する。
2.OSコマンド(cpやtarなど)でデータベース領域全体をバックアップする。
3.インスタンスを起動する。
コールドバックアップのリストア
1.インスタンスを停止する。
2.既存のデータベース領域を削除する。
3.OSコマンドでコールドバックアップしたデータベース領域を元の場所に復元する。
ロールフォワードリカバリ
1.インスタンスを起動する。
バイナリログを適用するためにはインスタンスの起動が必要。ただしまだリストアまでしか終わっていないため、一般ユーザから接続されないようにパラメータを指定して起動する。
# cd /usr/bin # mysqld_safe --defaults-file=/etc/my.cnf --skip-networking &
「--skip-networking 」パラメータを指定するとリモートからmysqlに接続できなくなるが、SSHなどサーバにログインした状態ならローカルからインスタンスに接続できる。
2.コールドバックアップ以降のバイナリログを適用する。
-1.mysqlbinlogコマンドでバイナリログをテキスト形式SQL文に変換してファイルで出力する。
障害直前までリカバリする場合
# cd /var/lib/mysql/binary # mysqlbinlog --disable-log-bin バイナリログファイル名1 バイナリログファイル名2 … > recovery.sql
*バイナリログが複数ある場合は順番に指定。
*引数「--disable-log-bin」を指定するとロールフォワードリカバリ時にバイナリログが作成されない。
ある時点まで指定してリカバリする場合
# cd /var/lib/mysql/binary # mysqlbinlog --stop-datetime="YYYY-MM-DD hh:mm:ss" バイナリログファイル名 > 出力ファイル名
*引数「--stop-datetime」で日時を指定することで、指定した日時までがファイルに出力される。(指定した日時までがロールフォワードリカバリの対象となる)
-2.テキスト形式に変換したSQL文を適用する。
# mysql -u root -p < recovery.sql
3.アクセス制限をしていたためインスタンスを一度停止し、インスタンスを通常起動する。
参考:現場で使える MySQL (DB Magazine SELECTION)