Stromausfall - Wurde die Abfrage beendet?

9

Gibt es eine Möglichkeit zu überprüfen, ob eine Abfrage abgeschlossen ist? Ich habe 3 sehr lange laufende Update-Abfragen (jeweils +/- 25 Stunden) ausgeführt, als ich letzte Woche in den Urlaub ging. Leider ging irgendwann während der Woche der Strom aus und der Computer mit MYSQL wurde heruntergefahren. Gibt es eine Möglichkeit zu überprüfen, welche der drei (oder alle drei) Abfragen abgeschlossen wurden?

Ich weiß, ich könnte überprüfen, ob die Daten aktualisiert wurden, aber NULL-Werte sind bei korrekter und vollständiger Ausführung zu erwarten, und es müssen 48 Millionen Datenzeilen durchsucht werden. Irgendwelche Gedanken?


quelle
6
Die Protokolle ... wenn Sie Dinge protokollieren. Wenn Sie dies nicht tun, würde ich empfehlen, zu beginnen.
Ben
1
@ Ben - zu spät, um eine USV und auch eine Transaktionsverarbeitung zu empfehlen, denke ich.
1
Wenn Sie InnoDB verwenden, können Sie Ihren Code in Transaktionen ausführen. dev.mysql.com/doc/refman/5.0/en/commit.html
1
Wenn Sie die langsame Abfrageprotokollierung aktiviert hätten, wären Abfragen, die langsam sind, wahrscheinlich im langsamen Abfrageprotokoll gelandet.
3
Und falls es nicht richtig abgeschlossen wurde, haben Sie ein Backup?

Antworten:

9

Wenn Sie mit aktivierten Binärprotokollen arbeiten, kann dies mit relativ hoher Zuverlässigkeit überprüft werden.

Führen Sie zunächst Folgendes aus, um festzustellen, ob Binärprotokolle tatsächlich aktiviert sind:

SHOW BINARY LOGS;

Wenn sie aktiviert sind, sollten Sie eine Ausgabe wie folgt erhalten:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000244 |  15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+

Andernfalls würden Sie eine Fehlermeldung erhalten.

Wenn nun Binärprotokolle aktiviert sind, wird jedes erfolgreiche Festschreiben auch in Binärprotokolle geschrieben. Ich sage "Festschreiben", aber die Wahrheit ist, dass jede erfolgreiche Operation, auch auf nicht transaktionalen Tabellen wie MyISAM, dort geschrieben ist. Aber um ehrlich zu sein, um eine Gewissheit über das Ergebnis Ihrer Anfragen zu haben, hoffe ich für Sie, dass Sie eine Transaktions-Engine wie InnoDB verwenden, oder Sie können sich über nichts sicher sein.

OK, wenn Sie nun davon ausgehen, dass Sie Binärprotokolle aktiviert haben und Ihre Tabellen transaktional sind (hoffentlich InnoDB), wird erwartet, dass ein erfolgreicher Abschluss Ihrer Abfragen in die Binärprotokolle geschrieben wird.

Sie müssen nun das entsprechende Binärprotokoll suchen und dort nach der Abfrage suchen. Wenn Sie die Frage finden - gut! Wenn nicht, ist es höchstwahrscheinlich nicht da. Ich werde es kurz erklären.

Welches Binärprotokoll enthält Ihre Abfrage? Sehen Sie sich die binären Protokolldateien selbst an, normalerweise in Ihrem Datenverzeichnis. Suchen Sie nach ihren Zeitstempeln. Beim Einschalten wurde ein neues Binärprotokoll erstellt. Finde es. Ihre Abfragen befinden sich höchstwahrscheinlich im Binärprotokoll vor diesem. Dies ist eine Vermutung. Es könnte auch eine davor sein usw. Aber es ist eine gute Vermutung.

Führen Sie nun mit dem mysqlbinlogDienstprogramm über die Befehlszeile Folgendes aus:

mysqlbinlog mysql-bin.000245

Ersetzen Sie den Dateinamen durch den Namen, von dem Sie vermuten, dass er die Abfrage enthält.

Dadurch werden alle Abfragen in dieser binären Protokolldatei in die Standardausgabe ausgegeben. Verwenden Sie unter Unix, grepum Ihre Abfrage zu finden:

mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"

Unter Windows viel Glück. Öffnen Sie mit Notepad ++ oder etwas anderem und suchen Sie manuell.

Ist die Abfrage da? Großartig - Sie wissen, dass es begangen wurde.

Ist die Abfrage nicht da? sync_binlogMüssen auf param überprüfen . Ist es 1 ? Dann Abfrage nicht im Binärprotokoll ==> Abfrage nicht festgeschrieben. Wenn dies sync_binlogjedoch nicht 1 ist , besteht immer noch die Möglichkeit, dass die Abfrage festgeschrieben wurde, jedoch nicht im Binärprotokoll, da der Absturz möglicherweise unmittelbar nach dem commitund kurz vor dem Löschen des Binärprotokolls auf die Festplatte aufgetreten ist. Sie müssen dann zu anderen Mitteln zurückkehren.

Diese sind: (und hoffentlich verwenden Sie wieder InnoDB): Suchen Sie nach einer einzelnen Zeile, die das Ergebnis der Abfrage identifizieren kann. Mit InnoDB erhalten Sie "alles oder nichts". Wenn Sie sicher sein können, dass eine einzelne Zeile von der Abfrage betroffen ist, können Sie sicher sein, dass die Abfrage abgeschlossen wurde.

Bearbeiten: Wenn das langsame Protokoll aktiviert ist, können Sie natürlich erwarten, dass eine so lange Abfrage auch nach Abschluss dort protokolliert wird ...

Viel Glück!

Shlomi Noach
quelle
2
Ich hoffe du bleibst hier.
jcolebrand
2
@jcolebrand Rolando könnte hier etwas Konkurrenz
vertragen