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?
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
Orders
ein. OrderLines
ein. OrderLines
. Orders
und OrderLines
. 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.
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.
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 seinWenn Sie jetzt Ihre Datenbank sichern, sichert die Sicherung möglicherweise die Tabellen in dieser Reihenfolge
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.