Analyse der Prinzipien von MySQL Dirty Page Flush und Shrinking Table Space

Analyse der Prinzipien von MySQL Dirty Page Flush und Shrinking Table Space

MySQL-Dirty-Pages

Aufgrund des WAL-Mechanismus erstellt InnoDB beim Aktualisieren einer Anweisung eine Festplattenoperation namens Schreibprotokoll, bei der es sich um ein Redo-Protokoll handelt. Nachdem das Redo-Protokoll in den Speicher geschrieben wurde, wird es an den Client zurückgegeben, was darauf hinweist, dass das Update erfolgreich war.

Der Vorgang des Schreibens von Daten aus dem Speicher auf die Festplatte wird als Leeren bezeichnet. Vor dem Leeren stimmen die tatsächlichen Daten nicht mit den Daten in der Datenbank überein, da die Daten basierend auf dem Redo-Protokoll aktualisiert, aber noch nicht geschrieben wurden und die Datenbank alt ist. Wenn der Inhalt der Speicherdatenseite nicht mit der Festplattendatenseite übereinstimmt, wird die Speicherseite als schmutzige Seite bezeichnet. Nachdem der Speicher geschrieben wurde, ist er konsistent und wird als saubere Seite bezeichnet.

Wenn MySQL gelegentlich sehr langsam läuft, werden wahrscheinlich fehlerhafte Seiten gelöscht. Der Prozess zum Auslösen einer Datenbankbereinigung

  • Wenn das Redo-Protokoll voll ist, stoppt das System alle Aktualisierungsvorgänge und verschiebt den Prüfpunkt nach vorne, um Platz für weiteres Schreiben zu schaffen.
  • Wenn das System nicht genügend Speicher hat und nicht genügend neue Speicherseiten vorhanden sind, werden einige Datenseiten gelöscht und für andere Datenseiten freigelassen. Wenn schmutzige Seiten gelöscht werden, werden sie zuerst auf die Festplatte geschrieben.
  • Wenn MySQL im Leerlauf ist.
  • Beim normalen Herunterfahren von MySQL
  • Im ersten Fall ist das Redo-Log voll, was InnoDB vermeiden möchte, da das gesamte System dann nicht mehr aktualisiert werden kann, was inakzeptabel ist.
  • Im zweiten Fall ist der Speicher voll und muss zuerst auf die Festplatte geschrieben werden. InnoDB verwendet den Pufferpool zur Verwaltung des Speichers. Es gibt drei Zustände
  • Unbenutzte Speicherseiten
  • Gebraucht und ist eine saubere Seite
  • Verwendete und verschmutzte Seiten (müssen nach der Löschung auf die Festplatte geschrieben werden)

Daher stellen wir bei der Verwendung der Datenbank manchmal fest, dass die Datenbankleistung plötzlich nachlässt. Dies kann auf die Verarbeitung fehlerhafter Seiten zurückzuführen sein.

Kontrollstrategie für das Leeren schmutziger Seiten

  • Innodb_io_capacity-Parameter, dieser Parameter teilt Innodb Ihre Festplatten-E/A-Kapazität mit. (Mit Formel berechnet)
  • Es gibt zwei Hauptfaktoren für das Leeren von InnoDB: das Verhältnis von Dirty Pages und die Geschwindigkeit beim Schreiben des Redo-Logs
  • innodb_max_derty_pages_pct ist die Obergrenze des Dirty-Page-Verhältnisses, der Standardwert beträgt 75 %. Passen Sie den Parameterwert Innodb_io_capacity so an, dass das Dirty-Page-Verhältnis 75 % nicht überschreitet und der Tabellenbereich verkleinert wird

Szenariobeispiel: Die Datenbank nimmt zu viel Speicherplatz ein und die Hälfte der Daten in der größten Tabelle wird gelöscht, die Größe der Tabelle bleibt jedoch unverändert.

Datenlöschungsprozess

Wenn Sie R4 löschen möchten, markiert die InnoDB-Engine nur den Datensatz R4 als gelöscht. Wenn später ein Datensatz mit einer ID zwischen 300 und 600 hinzugefügt wird, wird diese Position erneut verwendet, die Größe der Datenträgerdatei wird jedoch nicht reduziert.

Wenn alle Datensätze einer Datenseite gelöscht werden, kann die Datenseite wiederverwendet werden.

Hinweis: Die Wiederverwendung von Datenseiten unterscheidet sich von der Wiederverwendung von Datensätzen.

  • Wird beispielsweise der Datensatz R4 gelöscht und eine Zeile mit der ID 400 eingefügt, kann der Platz direkt wiederverwendet werden. Wird jedoch eine Zeile mit der ID 800 eingefügt, kann die Position nicht wiederverwendet werden.
  • Nachdem jedoch alle Datensätze auf der gesamten Datenseite Seite A gelöscht wurden, wird Seite A als wiederverwendbar gekennzeichnet. Wenn eine neue Datenseite zum Einfügen eines Datensatzes mit der ID=50 benötigt wird, kann Seite A wiederverwendet werden.
  • Wenn wir den Löschbefehl verwenden, um die gesamten Tabellendaten zu löschen, werden im Ergebnis zwar alle Datenseiten als wiederverwendbar markiert, die Datei wird auf der Festplatte jedoch nicht kleiner.

Datenfluss einfügen

Wenn die Daten in Indexreihenfolge eingefügt werden, ist der Index kompakt. Werden sie jedoch zufällig eingefügt, führt dies zu einer Paginierung der Indexdatenseiten.

Wenn Seite A bereits voll ist, was passiert, wenn Sie eine weitere Datenzeile einfügen? Da A voll ist, wird beim Einfügen von Daten mit der ID 550 eine neue Seite Seite B zum Speichern der Daten angefordert. Nach Abschluss der Teilung bleibt am Ende von Seite A eine Lücke.

Durch das Aktualisieren des Indexwerts wird auch der alte Wert gelöscht und ein neuer Wert eingefügt, wodurch ebenfalls eine Lücke entsteht.

Schrumpfender Platz

Erstellen Sie eine neue Tabelle B mit derselben Struktur wie Tabelle A. Lesen Sie die Daten aus Tabelle A Zeile für Zeile in aufsteigender Reihenfolge der Primärschlüssel-ID und fügen Sie sie in Tabelle B ein. In Tabelle B gibt es keine Lücken und die Auslastungsrate der Datenseiten ist höher. Wenn wir Tabelle B als temporäre Tabelle verwenden, ersetzen wir A durch B, nachdem die Daten von Tabelle A in B importiert wurden, wodurch A auch verkleinert wird.

Während des gesamten DDL-Prozesses kann Tabelle A nicht aktualisiert werden, daher ist dieser DDL nicht online. In Versionen nach 5.6 wurde der Prozess geändert:

Erstellen Sie eine temporäre Datei und scannen Sie alle Datenseiten in A.

Generieren Sie einen B+-Baum mit den Datensätzen von A auf der Datenseite und speichern Sie ihn in einer temporären Datei

Protokollieren Sie alle Vorgänge auf A in einer Protokolldatei

Nachdem die temporäre Datei generiert wurde, werden die Vorgänge der Protokolldatei auf die temporäre Datei angewendet, um eine Datendatei mit denselben logischen Daten wie Tabelle A zu erhalten.

Ersetzen Sie die Datendatei der Tabelle A durch die temporäre Datei

Symbol

Es ist ersichtlich, dass der Unterschied zum Prozess in Abbildung 3 darin besteht, dass diese Lösung aufgrund der Existenz der Funktion zum Aufzeichnen und Wiedergeben von Protokolldateien während des Neuaufbaus der Tabelle Hinzufügungs-, Lösch- und Änderungsvorgänge an Tabelle A ermöglicht.

Verwenden Sie den Befehl „alter table A engine=InnoDB“, um die Tabelle neu zu erstellen. Vor MySQL 5.5 war der Ausführungsprozess dieses Befehls ähnlich dem, den wir oben beschrieben haben. Der einzige Unterschied besteht darin, dass Sie die temporäre Tabelle B nicht selbst erstellen müssen. MySQL führt die Vorgänge zum Übertragen von Daten, zum Austauschen von Tabellennamen und zum Löschen der alten Tabelle automatisch aus.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • MySQL Flush-List und Flushing-Mechanismus für Dirty Pages
  • Was sind MySQL-Dirty-Pages?

<<:  Implementierung der Benutzerregistrierungsfunktion mit js

>>:  Verwendung des Linux-Datumsbefehls

Artikel empfehlen

Installieren Sie MySQL 5.6 aus der Yum-Quelle im Centos7.4-System

Systemumgebung: centos7.4 1. Prüfen Sie, ob die D...

Einige Erkenntnisse und Gedanken zu iframe

Diese Geschichte beginnt heute mit einer unerwarte...

Eine kurze Einführung in die Basiskomponenten der VUE uni-app

1. Scroll-Ansicht Beim vertikalen Scrollen müssen...

So verwenden Sie den Linux-Befehl seq

1. Befehlseinführung Mit dem Befehl seq (Sequence...

Ein kurzer Vortrag über MySQL-Pivottabellen

Ich habe eine Produktteiletabelle wie diese: Teil...

Alibaba Cloud beantragt ein kostenloses SSL-Zertifikat (https) von Cloud Shield

Da das Projekt den https-Dienst nutzen muss, habe...

MySql-Abfrageanweisung mit mehreren Bedingungen und dem Schlüsselwort „OR“

Im vorherigen Artikel wurde die MySql-Abfrageanwe...

Native js implementiert Warenkorb-Logik und -Funktionen

In diesem Artikelbeispiel wird der spezifische Co...