MySQLある時点までのリカバリ

DBの復旧パターンって状況によって操作が変わってくると思います。 想定される状況に応じてしっかり対応できるように手順を把握して、いざ障害でリカバリが必要になった場合でも、あたふたしたり心臓バクバクせずに冷静に対処したいっす。
今回は操作ミスでデータが消失し、DBをある時点(データ消失する直前)まで戻す必要が発生した場合を想定します。
MySQL5.5で確認。
バックアップとバックアップ以後のバイナリログがあることが前提です。

1.前回のmysqldumpで取得したバックアップのCHANGE MASTERを確認して、バイナリログのどのポジションから当てればいいか確認。

# less /backup/yyyymmdd.mysqldump.sql

-- CHANGE MASTER TO MASTER_LOG_FILE='binary.000006', MASTER_LOG_POS=107;

*バイナリログはbinary.000006でポジション107から開始する。
前回mysqldumpのオプション--flush-logsを指定して、スイッチしたバイナリログがbinary.000006なのでポジション指定しないで先頭から開始していいはず。
なぜ先頭ポジション(4)が表示されないのかは不明なので宿題…

2.バックアップファイルで前回のバックアップ時点までリストアする。

# mysql -uroot -p < /backup/yyyymmdd.mysqldump.sql

3.バイナリログをmysqlbinlogコマンドでテキスト形式のSQL文に変換する。

対象バイナリログ
・binary.000006
・binary.000007 ※このバイナリログがカレントの時に操作ミスが発生

--binary.000006はmysqldumpの--flush-logsでスイッチしたバイナリログなので先頭から適用します
# mysqlbinlog binary.000006 > recovery.000006

--binary.000007は先頭から適用するので--start-positionは無くてもよいです
--操作ミスが発生したポジション23901で停止
# mysqlbinlog --start-position=4 --stop-position=23901 binary.000007 > recovery.000007

--時間で指定する場合
# mysqlbinlog --stop-datetime=”2014-04-20 00:58:00″ binary.000007 > recovery.000007

4.mysqlbinlogで変換したファイルを適用する。

# mysql -uroot -p < recovery.000006
# mysql -uroot -p < recovery.000007

今回マスターで確認しましたが、スレーブ側がどうなっているか確認したところ問題なくレプリケーションされているようでした。

■master

mysql> show master status\G
*************************** 1. row ***************************
            File: binary.000007
        Position: 5408410

■slave

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: xxx
                  Master_Port: xxxx
                Connect_Retry: xx
              Master_Log_File: binary.000007
          Read_Master_Log_Pos: 5408410

参考
7.9. mysqlbinlog — バイナリログファイルを処理するためのユーティリティ
MySQL バイナリログを使ったデータリカバリ
http://open-groove.net/mysql/mysql-time-base-recovery/