■バックアップの時刻を調べる
定期的にバックアップをとっていることが前提。
この例では毎日8:00とする。
■その時刻をもとにマスターのバイナリログファイルを特定する
$ ls -l;
rw-rw---- 1 mysql mysql 1073753869 6月 16 06:04 2016 mysql-bin.000231
rw-rw---- 1 mysql mysql 1073750057 6月 16 16:33 2016 mysql-bin.000232
rw-rw---- 1 mysql mysql 1073741972 6月 17 01:03 2016 mysql-bin.000233
タイムスタンプがバックアップ時間より新しいファイルの中で、もっとも古いものが対象。
この場合は mysql-bin.000232
■バイナリログをテキストに変換する
$ mysqlbinlog --no-defaults --start-datetime="2016-06-16 07:55:00" --stop-datetime="2016-06-16 08:05:00" mysql-bin.000232 > tmp.log;
--no-defaults を指定しないとmysqlbinlog: unknown variable 'default-character-set=utf8'言われた。
--start-datetimeと--stop-datetimeで出力ファイルのサイズを減らす。
■tmp.logをのぞいて、8:00頃のログポジションを特定する
tmp.log
...
# at 191679237
#160616 7:59:51 server id 1001 end_log_pos 191679375 Query thread_id=2978577 exec_time=0 error_code=0
...
時刻で検索する。
atの後ろの値がログポジション。
クエリも目視で確認したほうがベター。辛いけど。
■レプリケーション停止&初期化
mysql> stop slave;
mysql> reset slave;
■バックアップからリストアする
$ mysql -u hoge -p < dump.sql;
■レプリケーション設定&開始
mysql > CHANGE MASTER TO
MASTER_HOST='hosuto',
MASTER_USER='yuuzaa',
MASTER_PASSWORD='paswaado',
MASTER_LOG_FILE='mysql-bin.000232',
MASTER_LOG_POS=191679237;
mysql > START SLAVE;
■祈る
完全に正しいログポジションではない場合、レプリケーションエラーは発生しうる。
レプリケーションがエラーしたらひとつずつ確認し、スキップして問題なさそうならスキップ。
大事なのは祈り。
バックアップ時の--master-dataとか--single-transactionで、もっとうまくできる気がする。