Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wiederherstellung nach falscher MySQL-Update-Abfrage?

Hier sind zwei Lektionen zu lernen:

  1. Daten sichern
  2. Führen Sie UPDATE/DELETE-Anweisungen innerhalb einer Transaktion aus, damit Sie ROLLBACK verwenden können wenn die Dinge nicht wie geplant verlaufen

Wenn Sie sich der Transaktionsbehandlung (Autocommit, explizit und implizit) für Ihre Datenbank bewusst sind, können Sie sich das Wiederherstellen von Daten aus einer Sicherung ersparen.

Transaktionen steuern die Datenmanipulationsanweisung(en), um sicherzustellen, dass sie atomar sind. "Atomisch" zu sein bedeutet, dass die Transaktion entweder stattfindet oder nicht. Der einzige Weg, den Abschluss der Transaktion an die Datenbank zu signalisieren, ist die Verwendung eines COMMIT oder ROLLBACK -Anweisung (gemäß ANSI-92, die leider keine Syntax zum Erstellen/Beginn einer Transaktion enthielt, sodass sie herstellerspezifisch ist). COMMIT wendet die Änderungen (falls vorhanden) an, die innerhalb der Transaktion vorgenommen wurden. ROLLBACK ignoriert alle Aktionen, die innerhalb der Transaktion stattgefunden haben - sehr wünschenswert, wenn eine UPDATE/DELETE-Anweisung etwas Unbeabsichtigtes tut .

Typischerweise werden einzelne DML-Anweisungen (Insert, Update, Delete) in einer Autocommit-Transaktion ausgeführt – sie werden festgeschrieben, sobald die Anweisung erfolgreich abgeschlossen ist. Das bedeutet, dass es in Fällen wie Ihrem keine Möglichkeit gibt, die Datenbank auf den Zustand zurückzusetzen, bevor die Anweisung ausgeführt wurde. Wenn etwas schief geht, besteht die einzige verfügbare Wiederherstellungsoption darin, die Daten aus einem Backup (sofern vorhanden) zu rekonstruieren. In MySQL ist autocommit ein standardmäßig für InnoDB - MyISAM unterstützt keine Transaktionen. Es kann deaktiviert werden mit:

SET autocommit = 0

Eine explizite Transaktion liegt vor, wenn Anweisungen in einen explizit definierten Transaktionscodeblock eingeschlossen sind – für MySQL ist das START TRANSACTION . Es erfordert auch ein explizit gemachtes COMMIT oder ROLLBACK Erklärung am Ende der Transaktion. Verschachtelte Transaktionen sprengen den Rahmen dieses Themas.

Implizite Transaktionen unterscheiden sich geringfügig von expliziten. Implizite Transaktionen erfordern keine explizite Definition einer Transaktion. Wie explizite Transaktionen erfordern sie jedoch ein COMMIT oder ROLLBACK Erklärung geliefert werden.

Schlussfolgerung

Explizite Transaktionen sind die ideale Lösung - sie erfordern eine Anweisung COMMIT oder ROLLBACK , um die Transaktion abzuschließen, und was passiert, wird klar angegeben, damit andere es lesen können, falls dies erforderlich sein sollte. Implizite Transaktionen sind in Ordnung, wenn Sie interaktiv mit der Datenbank arbeiten, aber COMMIT Aussagen sollten nur spezifiziert werden, nachdem die Ergebnisse getestet und gründlich als gültig bestimmt wurden.

Das heißt, Sie sollten Folgendes verwenden:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...und nur COMMIT; verwenden wenn die Ergebnisse korrekt sind.

Allerdings geben UPDATE- und DELETE-Anweisungen normalerweise nur die Anzahl der betroffenen Zeilen zurück, keine spezifischen Details. Wandeln Sie solche Anweisungen in SELECT-Anweisungen um und überprüfen Sie die Ergebnisse, um vorher die Korrektheit sicherzustellen zum Versuch der UPDATE/DELETE-Anweisung.

Nachtrag

DDL-Anweisungen (Data Definition Language) werden automatisch festgeschrieben – sie erfordern keine COMMIT-Anweisung. IE:Anweisungen zum Erstellen oder Ändern von Tabellen, Indizes, gespeicherten Prozeduren, Datenbanken und Ansichten.