日時を指定する代わりに、ログ位置を指定するために、mysqlbinlog で --start-position
および --stop-position
オプションを使用できます。それらは、日付ではなく、ログの位置番号を指定することを除いて、開始日および停止日オプションと同じように機能します。位置を使用することで、特に損害を与える SQL ステートメントと同じころに多くのトランザクションが発生している場合に、リカバリするログの部分をより正確に把握できます。位置番号を確認するには、予期していないトランザクションが実行された時間付近の期間で mysqlbinlog を実行しますが、結果を調査のためにテキストファイルにリダイレクトします。これは次のように実行できます。
shell> mysqlbinlog --start-datetime="2005-04-20 9:55:00" \
--stop-datetime="2005-04-20 10:05:00" \
/var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
このコマンドは、/tmp
ディレクトリに、有害な SQL ステートメントが実行された時間付近の SQL ステートメントを含む小さなテキストファイルを作成します。テキストエディタでこのファイルを開き、繰り返したくないステートメントを探します。リカバリを停止し、再開するバイナリログの位置を特定し、それらを書きとめます。位置は、うしろに番号が付いた log_pos
とラベル付けされます。前のバックアップファイルのリストア後、位置番号を使用して、バイナリログファイルを処理します。たとえば、これらのようなコマンドを使用します。
shell> mysqlbinlog --stop-position=368312 /var/log/mysql/bin.123456 \
| mysql -u root -p
shell> mysqlbinlog --start-position=368315 /var/log/mysql/bin.123456 \
| mysql -u root -p
最初のコマンドは、指定した停止位置まで、すべてのトランザクションをリカバリします。2 番目のコマンドは、バイナリログの最後まで、指定された開始位置からのすべてのトランザクションをリカバリします。mysqlbinlog の出力には、各 SQL ステートメントが記録される前に、SET TIMESTAMP
ステートメントが含まれるため、リカバリされたデータおよび関連する MySQL ログは、トランザクションが実行された元の時間を反映します。