【Mysql】mysqlbinlog(バイナリログからクエリを実行する) | おぼえがき

【Mysql】mysqlbinlog(バイナリログからクエリを実行する)

http://dev.mysql.com/doc/refman/4.1/ja/mysqlbinlog.html




mysqlbinlog ユーティリティを使用して、バイナリログファイル(see 項4.10.4. 「バイナリログ」 )を調べることができます。

shell> mysqlbinlog hostname-bin.001

上記の例では、バイナリログ hostname-bin.001 に含まれるすべてのクエリが、クエリにかかった時間、クエリを発行したスレッドの ID、クエリ発行時のタイムスタンプなどの情報とともに出力されます。

mysqlbinlog の出力を mysql クライアントに送信できます。これは、古いバックアップでリカバリするときに使用します(see 項4.5.1. 「データベースのバックアップ」 )。

shell> mysqlbinlog hostname-bin.001 | mysql

または

shell> mysqlbinlog hostname-bin.[0-9]* | mysql

また、mysqlbinlog の出力をテキストファイルにリダイレクトし、そのテキストファイルを編集(何らかの理由で実行したくないクエリを削除)し、テキストファイルから mysql に対してクエリを実行することもできます。

mysqlbinlog には position=# オプションがあり、バイナリログでのオフセットが # 以上のクエリだけを出力することができます。

MySQL サーバで実行するバイナリログが複数ある場合、単一の MySQL 接続で実行する方が安全です。以下は、安全でない例です。

shell> mysqlbinlog hostname-bin.001 | mysql # DANGER!!
shell> mysqlbinlog hostname-bin.002 | mysql # DANGER!!

最初のバイナリログに CREATE TEMPORARY TABLE が含まれ、2 番目のバイナリログにこのテンポラリテーブルを使用するクエリが含まれていると、問題が発生します。最初の mysql が終了すると、テンポラリテーブルが破棄されるので、2 番目の mysql は ``unknown table'' を報告することになります。これが、すべてのバイナリログを単一の接続で実行すべき理由です。テンポラリテーブルを使用する場合には特に気を付けてください。2 つの方法があります。

shell> mysqlbinlog hostname-bin.001 hostname-bin.002 | mysql
shell> mysqlbinlog hostname-bin.001 >  /tmp/queries.sql
shell> mysqlbinlog hostname-bin.002 >> /tmp/queries.sql
shell> mysql -e "source /tmp/queries.sql"

MySQL 4.0.14 以降、mysqlbinlog は、バイナリログから LOAD DATA INFILE を実行するための mysql に対する適切な入力を提供できるようになっています。ロードするデータがバイナリログに含まれるため(これは MySQL 4.0 の場合です。MySQL 3.23 ではロードされたデータがバイナリログに書き込まれないため、バイナリログの内容を実行するにはオリジナルファイルが必要でした)、mysqlbinlog はこのデータをテンポラリファイルにコピーして LOAD DATA INFILE コマンドを出力し、mysql にこのテンポラリファイルをロードさせます。テンポラリファイルが作成されるデフォルトのディレクトリはテンポラリディレクトリです。これは、mysqlbinloglocal-load オプションで変更できます。

MySQL 4.1 より前は、同じ名前のテンポラリテーブルを使用する複数の異なるスレッドのクエリがバイナリログに含まれていました。そのため、これらのクエリが混ざっている場合、mysqlbinlogmysql に対して適切な出力を提供できませんでした。これは、MySQL 4.1 で解決されています。

また、mysqlbinlog --read-from-remote-server を使用して、リモート MySQL サーバから直接バイナリログを読み取ることも可能です。ただし、より簡単に、稼動中の MySQL サーバにバイナリログを適用できるようにするため、これはいずれ廃止する予定です。

詳細については、mysqlbinlog --help を実行してください。