Heim >Datenbank >MySQL-Tutorial >Was sind die Wissenspunkte des Redo-Logs und des Undo-Logs im MySQL-Log?
REDO-LOG wird als Redo-Log bezeichnet. Wenn der MySQL-Server unerwartet abstürzt oder ausfällt, stellt es sicher, dass übermittelte Transaktionen auf der Festplatte gespeichert werden (Persistenz).
InnoDB verarbeitet Datensätze in Seiteneinheiten. Durch Hinzufügen, Löschen, Ändern und Abfragen wird die gesamte Seite in den Pufferpool geladen (Festplatte -> Speicher). Der Änderungsvorgang in der Transaktion ändert nicht direkt die Daten auf der Festplatte Ändern Sie es zunächst. Die Daten im Pufferpool im Speicher werden vom Hintergrundthread in regelmäßigen Abständen asynchron auf der Festplatte aktualisiert.
Pufferpool: Er kann Indizes und Daten speichern, das Lesen und Schreiben beschleunigen, Datenseiten direkt im Speicher bearbeiten und verfügt über einen dedizierten Thread zum Schreiben schmutziger Seiten im Pufferpool auf die Festplatte.
Warum ändern Sie die Daten auf der Festplatte nicht direkt?
Denn wenn Sie die Festplattendaten direkt ändern, werden die geänderten Daten an verschiedenen Orten auf der Festplatte verteilt und müssen daher hin und her gesucht werden. Daher ist die Trefferquote niedrig und der Verbrauch hoch Eine kleine Änderung muss die gesamte Seite ersetzen.
Im Gegensatz dazu werden die Daten auf der Festplatte auf einen Teil der Festplatte verteilt, sodass der Suchvorgang und die Suchzeit entfallen wird gespeichert.
Die Verwendung von Hintergrundthreads zum Aktualisieren der Festplatte mit einer bestimmten Häufigkeit kann die Häufigkeit zufälliger E/A verringern und den Durchsatz erhöhen. Dies ist der grundlegende Grund für die Verwendung des Pufferpools.
Das Problem der Änderung des Speichers und der anschließenden asynchronen Synchronisierung mit der Festplatte:
Da der Pufferpool ein Bereich im Speicher ist, können bei einem unerwarteten Systemabsturz einige fehlerhafte Daten möglicherweise nicht aktualisiert werden Die Festplatte wird rechtzeitig gelöscht und die Haltbarkeit der Transaktion kann nicht gewährleistet werden. Daher wurde Redo-Log eingeführt. Beim Ändern von Daten wird ein zusätzliches Protokoll aufgezeichnet, das zeigt, dass sich der xx-Offset der Seite xx um xx geändert hat. Wenn das System abstürzt, kann es anhand des Protokollinhalts wiederhergestellt werden.
Der Unterschied zwischen dem Schreiben von Protokollen und dem direkten Aktualisieren der Festplatte besteht darin: Das Schreiben von Protokollen erfolgt durch Anhängen des Schreibens, sequentielle E/A, schneller und der geschriebene Inhalt ist relativ kleiner.
Das Redo-Protokoll besteht aus zwei Teilen:
Redo-Log-Puffer (Speicher Ebene, Standard 16 MB, kann über den Parameter innodb_log_buffer_size geändert werden Daten von der Festplatte in den Speicher lesen, die Speicherkopie der Daten ändern und schmutzige Daten generieren
Schritt 3 : Standardmäßig wird der Inhalt des Redo-Log-Puffers nach dem Absenden der Transaktion in die Redo-Log-Datei geleert und die Redo-Log-Datei angehängt und geschrieben.
Das allgemein als Write-Ahead-Protokoll (Pre-Log-Persistenz) bezeichnete Protokoll bezieht sich auf das vorherige Beibehalten der entsprechenden Protokollseite im Speicher Beibehalten einer Datenseite.
Vorteile des Redo-Logs:
Reduzierte Festplattenaktualisierungshäufigkeit Redo-Log nimmt wenig Platz ein Die Redo-Log-Schreibgeschwindigkeit ist hochDa es ein Datenintervall von 1 Sekunde und 1 Sekunde gibt gehen im schlimmsten Fall verloren.
1.beginWenn das System in einem der Schritte 1–8 ausfällt, ist die Transaktion nicht erfolgt Diese Transaktion hat keine Auswirkungen auf die Daten auf der Festplatte.2. Rekord A=1, um das Protokoll rückgängig zu machen
3.update A=3
4 . Zeichnen Sie A=3 auf, um das Protokoll
5 zu wiederholen. Nehmen Sie B=4 auf, um das Protokoll
8 rückgängig zu machen. Aktualisieren Sie das Redo-Protokoll auf der Festplatte
9.commit
Detaillierter Generierungsprozess
Für die InnoDB-Engine wird jede Zeile außer Zusätzlich aufgezeichnet Zu den Daten des Datensatzes selbst gibt es mehrere versteckte Spalten: DB_ROW_ID∶Die Primärschlüssel-ID des Datensatzes.Wenn wir INSERT ausführen:
begin; INSERT INTO user (name) VALUES ('tom');
Jedes Mal, wenn Daten eingefügt werden, wird ein Rückgängig-Protokoll des Einfügevorgangs erstellt, und der Rollback-Zeiger der Daten zeigt auf dieses Protokoll. Das Rückgängig-Protokoll zeichnet die Seriennummer des Rückgängig-Protokolls, die Spalte und den Wert des eingefügten Primärschlüssels auf. Wenn dann ein Rollback durchgeführt wird, können die entsprechenden Daten direkt über den Primärschlüssel gelöscht werden.
Wenn wir UPDATE ausführen:
Beim Ausführen eines Aktualisierungsvorgangs wird ein Update-Rückgängig-Protokoll generiert, einschließlich zweier Fälle, in denen der Primärschlüssel aktualisiert und der Primärschlüssel nicht aktualisiert wird. Angenommen, der Aktualisierungsvorgang wird jetzt ausgeführt:
UPDATE user SET name='Sun' WHERE id=1;
Zu diesem Zeitpunkt wird der neue Rückgängig-Protokolldatensatz zur Versionskette hinzugefügt, seine Rückgängig-Nummer ist 1 und der Rollback-Zeiger des neuen Rückgängig-Protokolls zeigt darauf das alte Undo-Protokoll (Undo-Nr=0).
Angenommen, Sie führen jetzt Folgendes aus:
UPDATE user SET id=2 WHERE id=1;
Für den Vorgang zum Aktualisieren des Primärschlüssels wird zuerst das Löschmarkierungsflag für die ursprünglichen Daten geöffnet. Die tatsächliche Löschung erfolgt zu diesem Zeitpunkt nicht Beurteilen Sie den Reinigungsthread und fügen Sie dann später neue Daten ein. Die neuen Daten generieren auch ein Rückgängig-Protokoll und die Sequenznummer des Rückgängig-Protokolls erhöht sich.
Sie können feststellen, dass jede Änderung an Daten ein Rückgängig-Protokoll generiert. Wenn ein Datensatz mehrmals geändert wird, werden mehrere Rückgängig-Protokolle erstellt. Das Rückgängig-Protokoll zeichnet das Protokoll vor der Änderung auf und die Sequenznummer erhöht sich Wenn Sie also ein Rollback durchführen möchten, gehen Sie entsprechend der Sequenznummer vorwärts, um unsere Originaldaten zu finden. So wird das Rückgängig-Protokoll zurückgesetzt . Stellen Sie die Löschmarkierung der Daten mit der ID=1 auf 0 über das Protokoll von Undo-Nr.=2 wieder her. Stellen Sie den Namen der Daten mit der ID=1 für Tom über das Protokoll von Undo-Nr.=1 wieder her der Daten mit der ID=1 an Tom durch Undo No=. Das Protokoll von 0 löscht die Daten mit der ID=1
Erweiterung
Bin-Protokoll
Binärprotokoll, auch als Update bekannt log ist eine Art Protokolldatei im Binärformat, die an einer Datenbank vorgenommene Änderungen aufzeichnet. Es zeichnet alle von der Datenbank ausgeführten Aktualisierungsanweisungen auf.
Hauptanwendungsszenarien von Binlog:
Datenwiederherstellung: Wenn MySQL unerwartet stoppt, kann das Protokoll zur Wiederherstellung und Sicherung verwendet werden.
show variables like '%log_bin%';
Sehen Sie sich das Bin-Log-Protokoll an:
mysqlbinlog -v "/var/lib/mysql/binlog/xxx.000002"
mysqlbinlog [option] filename|mysql –uuser -ppass;
Löschen Sie das Binärprotokoll:
PURGE {MASTER | BINARY} LOGS TO ‘指定日志文件名' PURGE {MASTER | BINARY} LOGS BEFORE ‘指定日期'
Während der Transaktionsausführung wird das Protokoll zuerst in das Bin-Log geschrieben Cache und Transaktion Schreiben Sie beim Senden den Binlog-Cache in die Binlog-Datei. Da das Binlog einer Transaktion nicht aufgeteilt werden kann, muss es unabhängig von der Größe der Transaktion einmal geschrieben werden, sodass das System jedem Thread einen Speicherblock als Binlog-Cache zuweist.
Während der Ausführung der Update-Anweisung werden zwei Protokolle, Redo-Log und Binlog, aufgezeichnet. Basierend auf Basistransaktionen kann das Redo-Log während der Transaktionsausführung kontinuierlich geschrieben werden, während das Binlog nur möglich ist Beim Senden der Transaktion wird geschrieben, daher ist der Schreibzeitpunkt von Redo-Log und Binlog unterschiedlich.
Da die Binlog-Ausnahme das Schreiben unterbricht, gibt es keinen entsprechenden Änderungsdatensatz. Wenn das Binlog-Protokoll zum Wiederherstellen von Daten verwendet wird oder der Slave das Binlog des Masters liest, wird diese Aktualisierung daher weggelassen. Der C-Wert der wiederhergestellten Zeile ist 0, und der C-Wert dieser Zeile in der Originaldatenbank ist 1 Die Redo-Log-Wiederherstellung ist inkonsistent.
InnoDB-Speicher-Engine verwendet ein zweistufiges Festschreibungsschema, um das Problem der logischen Konsistenz zwischen den beiden Protokollen zu lösen. Die zweistufige Übermittlung bezieht sich auf die Aufteilung des Redo-Protokolls in zwei Schritte: Vorbereiten und Festschreiben.
Lassen Sie die endgültige Übermittlung des Redo-Protokolls und des Bin-Protokolls miteinander verknüpfen. Wenn eine Transaktion festgeschrieben wird, muss das Redo-Protokoll standardmäßig synchronisiert werden, bevor das Festschreiben erfolgreich ist Bin Log verfügt ebenfalls über diese Funktion und stellt sicher, dass keine Daten verloren gehen.
Nach der Verwendung des zweiphasigen Commits hat es keine Auswirkungen, wenn beim Schreiben in das Binlog eine Ausnahme auftritt, denn wenn MySQL Daten basierend auf dem Redo-Log wiederherstellt, stellt es fest, dass sich das Redo-Log noch in der Vorbereitungsphase befindet und es gibt kein entsprechendes Binlog-Protokoll, sodass die Übermittlung fehlschlägt. Setzen Sie die Daten zurück.
In einem anderen Szenario tritt während der Commit-Phase des Redo-Logs eine Ausnahme auf. Wird die Transaktion zurückgesetzt?
führt kein Rollback der Transaktion durch, sondern führt die im obigen Bild dargestellte Logik aus. Obwohl sich das Redo-Protokoll in der Vorbereitungsphase befindet, kann das entsprechende Binlog-Protokoll über die Transaktions-ID gefunden werden, sodass MySQL dies berücksichtigt Die Transaktion muss abgeschlossen sein, um die Daten wiederherzustellen.
Das obige ist der detaillierte Inhalt vonWas sind die Wissenspunkte des Redo-Logs und des Undo-Logs im MySQL-Log?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!