Da InnoDB
eine Speicher-Engine mit
Multiversionierung ist, muss sie Informationen über ältere
Versionen der Zeilen im Tablespace bewahren. Diese Informationen
werden in einer Datenstruktur gespeichert, die wie in Oracle
Rollback-Segment heißt.
Internally fügt InnoDB
jeder Zeile, die in der
Datenbank gespeichert wird, zwei Felder hinzu: ein 6 Byte großes
Feld mit dem Transaktions-Identifier der letzten Transaktion, mit
der die Zeile eingefügt oder geändert worden ist (eine Löschung
wird intern wie eine Änderung behandelt, bei der ein bestimmtes
Bit in der Zeile gesetzt wird, um sie als gelöscht zu
kennzeichnen), und ein 7-Byte-Feld namens Rollpointer. Dieser
zeigt auf einen Undo-Logeintrag, der in das Rollback-Segment
geschrieben wurde. Wenn die Zeile geändert wurde, enthält dieser
Undo-Logeintrag die Daten, die erforderlich sind, um ihren Inhalt
von vor der Änderung wiederherzustellen.
InnoDB
benutzt die Informationen aus dem
Rollback-Segment, um die für ein Transaktions-Rollback
erforderlichen Wiederherstellungsoperationen auszuführen.
Außerdem dienen die Informationen der Erstellung älterer
Versionen einer Zeile für eine konsistente Leseoperation.
Undo-Logs im Rollback-Segment sind in Insert- und Update-Undo-Logs
getrennt. Insert-Undo-Logs werden nur für das
Transaktions-Rollback gebraucht und können gelöscht werden,
sobald die Transaktion committet wird. Update-Undo-Logs werden
auch für konsistente Leseoperationen benutzt, können aber
verworfen werden, wenn keine Transaktion mehr läuft, für die
InnoDB
einen Snapshot zugewiesen hat, der für
eine konsistente Leseoperation die Daten des Update-Undo-Logs
benötigen könnte, um eine ältere Version der Datenbankzeile
wiederherzustellen.
Bitte denken Sie daran, Ihre Transaktionen regelmäßig zu
committen, einschließlich derjenigen Transaktionen, die nur
konsistente Leseoperationen ausgeben. Andernfalls kann
InnoDB
die Daten aus dem Update-Undo-Log nicht
verwerfen und das Rollback-Segment kann so stark anwachsen, dass
es Ihren Tablespace ganz ausfüllt.
Die physikalische Größe eines Undo-Logeintrags im Rollback-Segment ist normalerweise kleiner als die zugehörige eingefügte oder geänderte Zeile. Mit diesen Informationen können Sie berechnen, wie viel Platz für Ihr Rollback-Segment erforderlich ist.
In der Multiversionierung von InnoDB
wird eine
Zeile nicht sofort physikalisch aus der Datenbank entfernt, wenn
Sie sie mit einer SQL-Anweisung löschen. Erst wenn
InnoDB
den für die Löschung erstellten
Update-Undo-Logeintrag entfernen kann, kann es auch die Zeile und
ihre Indexeinträge physikalisch aus der Datenbank entfernen.
Diese Löschoperation bezeichnet man als Purge. Sie läuft sehr
schnell, ungefähr genauso schnell wie die SQL-Löschanweisung.
In einem Szenario, in dem der Benutzer Zeilen in kleinen,
ungefähr gleichen Batches aus der Tabelle löscht, kann es
passieren, dass der Purge-Thread beginnt, hinterherzuhinken, und
die Tabelle immer größer wird, wodurch sich alle
Festplattenoperationen stark verlangsamen. Selbst Tabellen, die
nur 10MB an brauchbaren Daten aufweisen, können mit allen
„toten“ Zeilen auf 10GB anwachsen. In solchen Fällen
wäre es gut, neue Zeilenoperationen zurückzufahren und dem
Purge-Thread mehr Ressourcen zuzuweisen. Genau zu diesem Zweck
gibt es die Systemvariable
innodb_max_purge_lag
. Weitere Informationen
finden Sie unter Abschnitt 14.2.4, „InnoDB
: Startoptionen und Systemvariablen“.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.