クエリが終了したかどうかを確認する方法はありますか?先週休暇に出かけたときに、非常に長時間実行される更新クエリを3つ(それぞれ+/- 25時間)実行しました。残念ながら、平日のどこかで電源が切れ、MYSQLを実行しているマシンがシャットダウンしました。3つ(または3つすべて)のクエリのどれが完了したかをチェックして確認する方法はありますか?
データが更新されたかどうかを確認できることはわかっていますが、正しい完全な実行ではNULLが予想され、4800万行のデータが閲覧されます。何かご意見は?
クエリが終了したかどうかを確認する方法はありますか?先週休暇に出かけたときに、非常に長時間実行される更新クエリを3つ(それぞれ+/- 25時間)実行しました。残念ながら、平日のどこかで電源が切れ、MYSQLを実行しているマシンがシャットダウンしました。3つ(または3つすべて)のクエリのどれが完了したかをチェックして確認する方法はありますか?
データが更新されたかどうかを確認できることはわかっていますが、正しい完全な実行ではNULLが予想され、4800万行のデータが閲覧されます。何かご意見は?
回答:
バイナリログを有効にして実行している場合、これは比較的高い信頼性でチェックできます。
まず、バイナリログが実際に有効になっているかどうかを確認するには、次のコマンドを実行します。
SHOW BINARY LOGS;
有効になっている場合は、次のような出力が得られます。
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000244 | 15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+
そうしないと、エラーメッセージが表示されます。
バイナリログが有効になっている場合、成功したコミットもバイナリログに書き込まれます。私は「コミット」と言いますが、MyISAMなどの非トランザクションテーブルでも、成功した操作はそこに書き込まれます。ただし、正直に言うと、クエリの結果を確実に把握するために、InnoDBなどのトランザクションエンジンを使用しているか、何もわからないことを願っています。
さて、バイナリログがオンになっていて、テーブルがトランザクション対応(うまくいけばInnoDB)だとすると、クエリが正常に完了すると、バイナリログに書き込まれることが期待されます。
ここで、関連するバイナリログを探し、そこでクエリを探す必要があります。クエリを見つけた場合-良いです!そうでない場合-それはおそらくそこにありません。すぐに説明します。
どのバイナリログにクエリが含まれていますか?通常はデータディレクトリにあるバイナリログファイル自体を確認します。タイムスタンプを探します。電源が入ると、新しいバイナリログが作成されました。それを見つける。あなたのクエリはおそらくその前のバイナリログにあります。これは推測です。それはその前などでもかまいません。しかし、それは良い推測です。
次に、mysqlbinlog
ユーティリティを使用して、コマンドラインから次のように実行します。
mysqlbinlog mysql-bin.000245
ファイル名を、クエリを含むと思われるファイル名に置き換えます。
これにより、このバイナリログファイル内のすべてのクエリが標準出力に出力されます。Unixでは、を使用grep
してクエリを検索します。
mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"
Windowsでは、頑張ってください。notepad ++などで開き、手動で検索します。
クエリはありますか?すばらしい-あなたはそれがコミットされたことを知っています。
クエリはありませんか?sync_binlog
パラメータを確認する必要があります。それは1?次に、バイナリログにないクエリ==>クエリがコミットされていません。しかし、sync_binlog
が1でない場合でもcommit
、バイナリログがディスクにフラッシュされた直後と直前にクラッシュが発生した可能性があるため、クエリがまだバイナリログにコミットされていない可能性があります。その後、他の手段に戻す必要があります。
それらは:(また、うまくいけば、再びInnoDBを使用しています):クエリの結果を特定できる単一の行を探します。InnoDBを使用すると、「オールオアナッシング」を実現できます。クエリの影響を受ける単一の行が確実である場合は、クエリが完了したことを確認できます。
編集:もちろん、遅いログが有効になっている場合は、完了後にそのような長いクエリがそこに記録されることも期待できます...
幸運を!