MySQLで過去の一時点までリカバリするには

2月 28, 2010

MySQLのリカバリ時に、特定の時刻までの状態に復旧したい場合。
バイナリログ適用時、–stop-datetimeオプションにより特定の時刻までのログを
適用させることができる。
※DBの全体バックアップと、それ以降取得したバイナリログのバックアップが存在し、
DB全体のリストアまで済んでいることが前提。

具体的には以下のように。

1.バイナリログを、時刻を指定して一時ファイルに保存。
以下の例では「2010-04-10 03:59:59」までがリカバリの対象となり、
この時刻以降のログはrecover.sqlに出力されない。
ちなみに日付時刻の値は、DATETIMEやTIMESTAMPデータ型で受付可能な
フォーマットにする必要がある。

$ mysqlbinlg –disable=log-bin –stop-datetime=”2010-04-10 03:59:59″ /backup/bin-log.000008 > /backup/recover.sql


2.recover.sqlを実行させて復旧

$ mysql -u root -pxxxxxxx < /backup/recover.sql

逆に、–start-datetimeにより開始時刻を指定することも可能。

$ mysqlbinlg –disable=log-bin –start-datetime=”2010-04-10 00:00:01″ /backup/bin-log.000008 > /backup/recover.sql

開始時刻と終了時刻をともに指定して、一定時間の範囲を対象とする。
以下、4月11日の午前1時から3時59分59秒までの範囲を指定。

$ mysqlbinlog bin-log.000008 –start-datetime=”2010-04-11 01:00:00″ ¥
–stop-datetime=”2010-04-11 03:59:59″ > /backup/recover.sql

それから2段階に分けなくとも、以下のようにすれば一回のコマンドで適用可能、なはず。
しかし個人的には、一度一時ファイルに出力後、確かに04:00:00以降のSQL実行分が
範囲に含まれていないことを確認してから適用したいところ。

$ mysqlbinlog bin-log.000008 –stop-datetime=”2010-04-10 03:59:59″ | mysql -u root -pxxxxxxx


この他に、–start-position=nとすれば、指定したポジションからのログ読み込みができる。
–stop-position=nだと指定したポジションまでを対象とする。
ポジション番号の特定には、事前にバイナリログの中身を確認する必要がある。
実際の障害発生時にこんなことを調べる余裕があるかどうかは疑問だが、、、
やるときはやらなきゃいかんのだろうな・・・。

$ mysqlbinlog –start-position=480 bin-log.000007 > /backup/recovery.sql


ちなみに。
–start-positionで複数のバイナリログを指定した場合、最初のバイナリログファイルに適用される。
–stop-positionで複数のバイナリログを指定した場合、最後のバイナリログファイルに適用される。

$ mysqlbinlog –start-position=5574 ¥
bin-log.000007 bin-log.000008 > /backup/recovery.sql

$ mysqlbinlog –stop-position=10478 ¥
bin-log.000007 bin-log.000008 > /backup/recovery.sql


これは、–start/stop-datetimeの場合も同様と考えていいのだろうか。

$ mysqlbinlog –stop-datetime=”2010-04-10 03:59:59″ ¥
bin-log.000007 bin-log.000008 > /backup/recovery.sql


ググってもヒットしなかったので、今のところ不明。やってみるしかないか。

ついでにメモ。
MySQLのオフィシャルサイトに「datetime値はmysqlbinlogを作動させた場合、
ローカルタイムゾーンに相対的です」という文言があったのだが、、、
意味がわからない(汗)


Categories: MySQL