Warum ist eine mysqldump mit einer einzigen Transaktion konsistenter als eine ohne?

7

Ich habe das Handbuch durchgelesen, und es wurde erwähnt, dass jede Transaktion eine BEGIN -Anweisung hinzufügt, bevor sie mit dem Dump beginnt. Kann jemand das verständlicher erklären?

Hier ist, was ich gelesen habe:

  

Diese Option gibt eine BEGIN SQL-Anweisung aus, bevor Daten vom Server abgelegt werden. Es ist nur mit transaktionalen Tabellen wie InnoDB und BDB nützlich, denn dann   Gibt den konsistenten Status der Datenbank zum Zeitpunkt der BEGIN-Ausgabe aus, ohne Anwendungen zu blockieren. "

Können einige darüber nachdenken?

    
Uday 22.05.2012, 15:28
quelle

3 Antworten

23

Da sich der Speicherauszug in einer Transaktion befindet, erhalten Sie eine konsistente Sicht auf alle Tabellen in der Datenbank. Dies wird wahrscheinlich am besten durch ein Gegenbeispiel erklärt. Angenommen, Sie speichern eine Datenbank mit zwei Tabellen, Orders und OrderLines

  1. Sie starten den Speicherauszug ohne eine einzige Transaktion.
  2. Ein anderer Prozess fügt eine Zeile in die Tabelle Orders ein.
  3. Ein anderer Prozess fügt eine Zeile in die Tabelle OrderLines ein.
  4. Der Speicherauszug verarbeitet die Tabelle OrderLines .
  5. Ein anderer Prozess löscht die Datensätze Orders und OrderLines .
  6. Der Speicherauszug verarbeitet die Tabelle Orders .

In diesem Beispiel enthält der Speicherauszug die Zeilen für OrderLines , aber nicht Orders . Die Daten wären inkonsistent und würden bei der Wiederherstellung fehlschlagen, wenn zwischen Orders und OrderLines ein Fremdschlüssel vorhanden wäre.

Wenn Sie es in einer einzigen Transaktion getan hätten, hätte der Dump weder die Reihenfolge noch die Zeilen (aber es wäre konsistent), da beide eingefügt und dann nach dem Beginn der Transaktion gelöscht wurden.

    
Eric Petroelje 22.05.2012, 15:42
quelle
5

Ich hatte Probleme, bei denen mysqldump ohne den Parameter --single-transaction aufgrund von Daten, die während des Dumps geändert wurden, durchgehend fehlschlug. Soweit ich das beurteilen kann, verhindert es, wenn Sie es innerhalb einer einzigen Transaktion ausführen, dass irgendwelche Änderungen, die während des Speicherauszugs auftreten, ein Problem verursachen. Wenn Sie die --single-transaction ausführen, erstellt sie im Wesentlichen einen Snapshot der Datenbank und speichert sie, anstatt Daten zu verwerfen, die sich ändern können, während das Dienstprogramm ausgeführt wird.

    
Dan Armstrong 22.05.2012 15:37
quelle
5

Dies kann für Backups wichtig sein, da es bedeutet, dass Sie alle Daten genau wie zu einem bestimmten Zeitpunkt erhalten.

Stellen Sie sich zum Beispiel eine einfache Blog-Datenbank vor, und eine typische Aktivität könnte

sein
  1. Erstellen Sie einen neuen Benutzer
  2. Erstellen Sie einen neuen Beitrag vom Benutzer
  3. Löschen Sie einen Benutzer, der den Beitrag löscht

Wenn Sie jetzt Ihre Datenbank sichern, sichert die Sicherung möglicherweise die Tabellen in dieser Reihenfolge

  1. Beiträge
  2. Benutzer

Was passiert, wenn jemand einen Benutzer löscht, der von den Posts benötigt wird, kurz nachdem Ihr Backup # 1 erreicht?

Wenn Sie Ihre Daten wiederherstellen, werden Sie feststellen, dass Sie einen Post haben, der Benutzer jedoch nicht in der Sicherung vorhanden ist.

Wenn Sie eine Transaktion um das Ganze herum ausführen, bedeutet dies, dass alle Aktualisierungen, Einfügungen und Löschungen, die während der Sicherung in der Datenbank passieren, von der Sicherung nicht gesehen werden.

    
Cylindric 22.05.2012 15:42
quelle

Tags und Links