Detaillierte Erklärung der InnoDB-Speicherdateien in MySQL

Detaillierte Erklärung der InnoDB-Speicherdateien in MySQL

Physisch gesehen besteht eine InnoDB-Tabelle aus einer gemeinsam genutzten Tablespace-Datei (ibdata1), einer exklusiven Tablespace-Datei (ibd), einer Tabellenstrukturdatei (.frm) und Protokolldateien (Redo-Dateien usw.).

1. Tabellenstrukturdatei

Wenn Sie eine Datentabelle in MySQL erstellen, gibt es für die entsprechende Tabelle eine .frm-Datei im Datenbankverzeichnis, das ihrem Datenverzeichnis entspricht. Die .frm-Datei wird verwendet, um die Metadateninformationen (Metainformationen) jeder Datentabelle zu speichern, einschließlich der Definition der Tabellenstruktur usw. Die .frm-Datei hat nichts mit der Datenbankspeicher-Engine zu tun, d. h. jede Datentabelle der Speicher-Engine muss eine .frm-Datei haben, die den Namen Datentabellenname.frm hat, z. B. user.frm. Die .frm-Datei kann verwendet werden, um die Tabellenstruktur wiederherzustellen, wenn die Datenbank abstürzt.

2. Tablespace-Dateien

(1) Analyse der Tabellenbereichsstruktur

Nachfolgend sehen Sie das Diagramm zur Tabellenbereichsstruktur von InnoDB:

Das Datensegment ist der Blattknoten des B + -Baums, und das Indexsegment ist der Nicht-Blattknoten des B + -Baums. Die Verwaltung der InnoDB-Speicher-Engine wird von der Engine selbst abgeschlossen, und der Tabellenbereich besteht aus verstreuten Segmenten. Ein Segment enthält mehrere Bereiche.

Ein Extent besteht aus 64 aufeinanderfolgenden Seiten mit einer Größe von jeweils 16 KB, d. h. jeder Extent ist 1 MB groß. Beim Erstellen einer neuen Tabelle werden zunächst 32-seitige Fragmente zum Speichern von Daten verwendet. Nachdem die Daten aufgebraucht sind, wird der Extent angewendet (InnoDB wendet bis zu 4 Extents gleichzeitig an, um die sequentielle Leistung der Daten sicherzustellen).
Die Seitentypen sind: Datenseite, Rückgängig-Seite, Systemseite, Transaktionsdatenseite, Bitmap-Einfügepuffer-Seite und Freilisten-Einfügepuffer-Seite.

(2) Exklusive Tablespace-Datei

Wenn innodb_file_per_table aktiviert ist, generiert das System für jede Tabelle eine Datei table_name.ibd. In dieser Datei werden die Daten, Indizes und internen Datenwörterbuchinformationen gespeichert, die sich auf die Tabelle beziehen.

(3) Gemeinsam genutzte Tablespace-Dateien

In der InnoDB-Speicher-Engine ist die Standard-Tablespace-Datei ibdata1 (hauptsächlich zum Speichern gemeinsam genutzter Tablespace-Daten), die auf 10 MB initialisiert und erweiterbar ist, wie in der folgenden Abbildung dargestellt:

Tatsächlich kann die InnoDB-Tablespace-Datei mit der folgenden Anweisung geändert werden:

Innodb_data_file_path=ibdata1:370M;ibdata2:50M:autoextend

Bei Verwendung der gemeinsam genutzten Tablespace-Speichermethode werden alle Innodb-Daten in einem separaten Tablespace gespeichert, der aus mehreren Dateien bestehen kann. Eine Tabelle kann mehrere Dateien umfassen, sodass ihre Größenbeschränkung nicht mehr die Dateigrößenbeschränkung, sondern ihre eigene Beschränkung ist. Aus der offiziellen Dokumentation von Innodb können wir ersehen, dass die maximale Grenze seines Tabellenspeicherplatzes 64 TB beträgt, d. h. die Einzeltabellengrenze von Innodb liegt grundsätzlich bei etwa 64 TB. Natürlich umfasst diese Größe alle Indizes dieser Tabelle und andere zugehörige Daten.

Bei Verwendung eines separaten Tablespace-Speichers werden die Daten jeder Tabelle in einer separaten Datei gespeichert. Zu diesem Zeitpunkt wird die Beschränkung auf eine einzelne Tabelle zur Größenbeschränkung des Dateisystems.

Nachfolgend sind die maximalen Größen einzelner Tablespace-Dateien auf verschiedenen Plattformen aufgeführt.

Dateigrößenbeschränkung des Betriebssystems
Win32 mit FAT/FAT32 2 GB/4 GB
Win32 mit NTFS 2 TB (möglicherweise größer)
Linux 2.4+ (mit Ext3-Dateisystem) 4 TB
Solaris 9/10 16 TB
MacOS X mit HFS+ 2 TB
NetWare mit NSS-Dateisystem, 8 TB

※ Folgendes stammt aus der MySQL-Dokumentation:

Hinweis für Windows-Benutzer: FAT und VFAT (FAT32) sind nicht für den Produktionseinsatz von MySQL geeignet. Es sollte NTFS verwendet werden.

(4) Gemeinsam genutzter Tablespace und exklusiver Tablespace

Gemeinsam genutzte und exklusive Tablespaces beziehen sich auf die Art und Weise, wie Daten gespeichert werden.

Shared Tablespace: Alle Tabellendaten und Indexdateien einer Datenbank werden in einer Datei abgelegt. Der Standarddateipfad dieses Shared Tablespace befindet sich im Datenverzeichnis. Der Standarddateiname lautet: ibdata1 und wird auf 10 M initialisiert.

Exklusiver Tabellenbereich: Jede Tabelle wird in einer unabhängigen Datei (.ibd-Datei, die den Dateninhalt und den Indexinhalt einer einzelnen Tabelle enthält) generiert und gespeichert.

1) Speicherinhaltsvergleich

Nach Verwendung des exklusiven Tablespace:

Die Daten, Indizes und Einfügepuffer der einzelnen Tabellen werden in einem exklusiven Tablespace (.idb-Datei) gespeichert.

Die Rückgängig-Informationen, Systemtransaktionsinformationen, sekundären Schreibpuffer usw., die jeder Tabelle entsprechen, werden weiterhin im ursprünglichen gemeinsam genutzten Tabellenbereich (Datei ibdata1) gespeichert.

2) Vergleich der Funktionen

Die spezifischen Vor- und Nachteile von gemeinsam genutzten und unabhängigen Tablespaces sind wie folgt:

Gemeinsam genutzter Tablespace:

Vorteil:

Der Tablespace kann in mehrere Dateien aufgeteilt und auf verschiedenen Datenträgern gespeichert werden (die Größe der Tablespace-Datei ist nicht durch die Größe der Tabelle beschränkt, eine Tabelle kann beispielsweise auf verschiedene Dateien verteilt werden).

Daten und Dateien werden zur einfachen Verwaltung zusammengestellt.

Mangel:

Wenn alle Daten und Indizes in einer Datei gespeichert werden, entsteht eine sehr große Datei. Obwohl eine große Datei in mehrere kleine Dateien aufgeteilt werden kann, werden mehrere Tabellen und Indizes gemischt und im Tabellenbereich gespeichert. Auf diese Weise entstehen nach einer großen Anzahl von Löschvorgängen an einer Tabelle viele Lücken im Tabellenbereich. Insbesondere für Anwendungen wie statistische Analyse- und Protokollierungssysteme ist die Verwendung gemeinsam genutzter Tabellenbereiche am wenigsten geeignet.

Unabhängiger Tablespace: (legen Sie innodb_file_per_table in der Konfigurationsdatei (my.cnf) fest)

Vorteil:

  1. Jede Tabelle hat ihren eigenen separaten Tabellenbereich.
  2. Die Daten und Indizes jeder Tabelle werden in ihrem eigenen Tabellenbereich gespeichert.
  3. Eine einzelne Tabelle kann zwischen verschiedenen Datenbanken verschoben werden.
  4. Raum kann recycelt werden

Bei Tabellen, die unabhängige Tablespaces verwenden, wirkt sich die Fragmentierung des Tablespace unabhängig von der Art der Löschung nicht allzu stark auf die Leistung aus und es besteht immer noch eine Möglichkeit, das Problem zu beheben.

a) Der Vorgang „Tabelle löschen“ gibt automatisch Tabellenspeicherplatz frei

b) Wenn es sich um eine statistische Analyse oder eine Tageswerttabelle handelt, können Sie nach dem Löschen einer großen Datenmenge den ungenutzten Speicherplatz wie folgt verkleinern: alter table TableName engine=innodb;

c) Bei Innodb mit Innodb-Plugin wird durch die Verwendung von Truncate Table auch der Speicherplatz verkleinert.

5. Wenn die Serverressourcen begrenzt sind und die Daten in einer einzelnen Tabelle nicht besonders groß sind, sind unabhängige Tablespaces offensichtlich effizienter als gemeinsam genutzte Tablespaces. MySQL verwendet jedoch standardmäßig gemeinsam genutzte Tablespaces.

Mangel:

Die Größe einer einzelnen Tabelle ist möglicherweise zu groß, beispielsweise über 100 GB.

3) Konvertierung zwischen gemeinsam genutztem Tablespace und exklusivem Tablespace

Ändern Sie die exklusive leere Tablespace-Konfiguration und konfigurieren Sie die folgenden Parameter

innodb_data_home_dir = "/user/local/mysql/var" Das Verzeichnis, in dem die Datenbankdateien gespeichert sind

innodb_log_group_home_dir = "/user/local/mysql/var" Protokollspeicherverzeichnis

innodb_data_file_path=ibdata1:10M:autoextend legt eine separate Datei (gemeinsam genutzte Datendatei) namens ibdata1 mit einer erweiterbaren Größe von 10 MB fest. Für die Datei ist kein Speicherort angegeben, daher ist die Standardeinstellung das MySQL-Datenverzeichnis.

innodb_file_per_table=1 Gibt an, ob gemeinsam genutzter oder exklusiver Tablespace verwendet werden soll (1: exklusiver Tablespace verwendet werden, 0: gemeinsam genutzter Tablespace verwendet werden)

Überprüfen Sie die Variable innodb_file_per_table. Wenn sie deaktiviert ist, bedeutet dies, dass ein gemeinsam genutzter Tablespace verwendet wird (standardmäßig wird ein gemeinsam genutzter Tablespace verwendet).

Wenn innodb_file_per_table geändert wird, wirkt sich dies nicht auf den zuvor verwendeten gemeinsam genutzten Tabellenbereich aus, sofern es nicht manuell geändert wird.

Beachten:

InnoDB erstellt keine Verzeichnisse. Stellen Sie daher sicher, dass das konfigurierte Pfadverzeichnis vorhanden ist, bevor Sie den Server starten.

Achten Sie beim Migrieren und Sichern von Daten auf die Integrität der Datendateien.

Das könnte Sie auch interessieren:
  • InnoDB-Typ MySql stellt Tabellenstruktur und Daten wieder her
  • Lösung für das Problem, dass die InnoDB-Engine beim Starten von MySQL deaktiviert wird
  • MySQL führt SQL-Datei aus und meldet Fehler Fehler: Unbekannte Speicher-Engine „InnoDB“-Lösung
  • Erfahrungsaustausch zur Reparatur von MySQL InnoDB-Ausnahmen
  • MySQL InnoDB-Überwachung (Systemebene, Datenbankebene)
  • Zusammenfassung der Betriebsaufzeichnungen zum Ändern der MyISAM-Speicher-Engine in Innodb in MySQL
  • Über MySQL innodb_autoinc_lock_mode
  • MySQL-Optimierung: InnoDB-Optimierung
  • Detaillierte Erklärung des Unterschieds zwischen MyISAM und InnoDB in der MySQL-Speicher-Engine
  • MySQL weist darauf hin, dass die InnoDB-Funktion deaktiviert ist und InnoDB aktiviert werden muss. Lösung
  • Tutorial zur Beziehung zwischen Innodb-Transaktionsisolationsebene und Sperre in MySQL

<<:  Von VirtualBox erstellte virtuelle Debian-Maschine teilt Dateien mit dem Windows-Host

>>:  So kapseln Sie Axios in ein Vue-Projekt (einheitliche Verwaltung von HTTP-Anfragen)

Artikel empfehlen

CSS steuert den Abstand zwischen Wörtern durch die Eigenschaft „letter-spacing“

Eigenschaft „letter-spacing“ : Vergrößern oder ve...

Tutorial zum Verbinden und Verwenden von MySQL 8.0 im Maven-Projekt von IDEA

Schauen wir uns zunächst meine grundlegende Entwi...

Was ist Software 404 und 404-Fehler und was ist der Unterschied zwischen ihnen

Zunächst einmal: Was ist 404 und Soft 404? 404: Ei...

HTML-Tags: Sub-Tag und Sup-Tag

Heute stelle ich zwei HTML-Tags vor, die ich nich...

Schnelle und sichere Methode zum Umbenennen einer MySQL-Datenbank (3 Arten)

Inhaltsverzeichnis So benennen Sie eine MySQL-Dat...

Detaillierte Erklärung der Tastaturereignisse von Vue

Inhaltsverzeichnis Allgemeine Schlüsselaliase Sch...

So ändern Sie $ in # in Linux

In diesem System steht das #-Zeichen für den Root...

Drei Beispiele für Unschärfe-Hintergrundeffekte mit CSS3

Beginnen wir nicht mit der Einleitung, sondern ko...

So setzen Sie das Root-Passwort in CentOS7 zurück

Beim Verschieben von Bausteinen treten verschiede...

Mehrere wichtige MySQL-Variablen

Es gibt viele MySQL-Variablen, von denen einige u...

6 Vererbungsmethoden von JS Advanced ES6

Inhaltsverzeichnis 1. Vererbung der Prototypkette...

Verstehen Sie das elastische CSS3 FlexBox-Layout in 10 Minuten

Grundlegende Einführung Merkmale Flexbox ist ein ...