MySQLのバイナリログの内容を見る、活用の仕方

MySQLのバイナリログは、いろいろと使い道がある。たとえば、レプリケーションするためには必ずださないといけないし、差分バックアップファイルとしてのリストアなどがある。というか、他の利用方法をよく知らない。


差分バックアップとしてバイナリログだとすると、そのままインポートはできないので、1度通常のSQL文に直す必要がある。そのためのコマンド、mysqlbinlog。

mysqlbinlog mysql-bin.000100 > /tmp/statement.sql

基本構文的には、こんな感じ。どのバイナリログファイルを読める形式にするかと、出力するファイルを指定するだけ。
バイナリログのままだと、大体の発行されたSQL文は分かるのだけど、発行された時刻が分からない。なので、差分をリストアするときでも、どの時刻からのSQLをリストアする必要があるのか、どの時刻までのSQLまでをリストアする必要なのかを見極めないといけない。テキストファイルにすれば、普通に人間が読むSQL文の形になるので、特定のクエリだけ取り出してリストアもできる。


僕は時々、このコマンドでクエリが正しく発行されているか確認することがある。基本的には、INSERT、UPDATE、DELETE文だけなので分からないことも多い。しかし、クエリを全部確認するために通常クエリログを有効にする設定を設定ファイルに書き込んで、mysqlの再起動ということがいつでもできるわけではないので、仕方なくやっている部分もある。さらにいうと、この通常クエリログを有効にしても、有効後のクエリしか見ることはできないので、その前のクエリを確認したい場合は、それを見るしかない。
普通は変な更新系のクエリがあったらエラーがでたり、アプリケーション側で対策しているはずなのでいいとは思う。しかし、SQL構文的にはエラーがないと、普通に通ってしまうので、時々予定外のクエリがないか確認する必要がある。あと、SQLインジェクションとかされたとしたら、それも正しいクエリなのでバイナリログに残っているはず。