Warum speichert InnoDB alle Datenbanken in einer Datei?


51

Es war praktisch, dass MyISAM verwendet wurde, um jede Tabelle in einer entsprechenden Datei zu speichern. InnoDB hat in vielerlei Hinsicht Fortschritte gemacht, aber ich frage mich, warum InnoDB ( ibdata1standardmäßig) alle Datenbanken in einer Datei speichert .

Ich verstehe, dass InnoDB die Position der Daten in der Datei nach einzelnen Indexdateien für Tabellen abbildet, aber ich verstehe nicht, warum alle Daten in einer Datei gemischt werden. Und was noch wichtiger ist: Warum sollten die Daten aller Datenbanken auf dem Server gemischt werden?

Ein interessantes Merkmal von MyISAM ist, dass man einen Datenbankordner auf einen anderen Rechner kopieren / einfügen und dann die Datenbank verwenden kann (ohne einen Speicherauszug).

Antworten:


66

Die Architektur von InnoDB erfordert die Verwendung von vier grundlegenden Arten von Informationsseiten

  • Tabellendatenseiten
  • Tabellenindex-Seiten
  • Tabellen-Metadaten
  • MVCC- Daten (zur Unterstützung der Transaktionsisolation und der Einhaltung von ACID )
    • Rollback-Segmente
    • Leerzeichen rückgängig machen
    • Double Write Buffer (Hintergrundschreiben, um das Caching des Betriebssystems zu verhindern)
    • Insert Buffer (Verwalten von Änderungen an nicht eindeutigen Sekundärindizes)

Siehe die bildliche Darstellung von ibdata1

Standardmäßig ist innodb_file_per_table deaktiviert. Dies führt dazu, dass alle vier Informationsseitentypen eine einzige Datei mit dem Namen ibdata1 speichern. Viele Menschen versuchen, die Daten zu verteilen, indem sie mehrere ibdata-Dateien erstellen. Dies kann zur Fragmentierung von Daten und Indexseiten führen.

Aus diesem Grund empfehle ich oft , die InnoDB-Infrastruktur mit der Standarddatei ibdata1 und nicht mehr zu bereinigen .

Das Kopieren ist aufgrund der Infrastruktur, unter der InnoDB arbeitet, sehr gefährlich. Es gibt zwei grundlegende Infrastrukturen

  • innodb_file_per_table deaktiviert
  • innodb_file_per_table aktiviert

InnoDB ( innodb_file_per_table deaktiviert)

Mit innodb_file_per_table Behinderte, alle diese Arten von InnoDB info leben innerhalb ibdata1. Die einzige Manifestation einer InnoDB-Tabelle außerhalb von ibdata1 ist die .frm-Datei der InnoDB-Tabelle. Um alle InnoDB-Daten auf einmal zu kopieren, muss das gesamte Verzeichnis / var / lib / mysql kopiert werden.

Das Kopieren einer einzelnen InnoDB-Tabelle ist völlig unmöglich. Sie müssen einen MySQL-Dump erstellen, um einen Dump der Tabelle als logische Darstellung der Daten und der zugehörigen Indexdefinitionen zu extrahieren. Sie würden diesen Speicherauszug dann in eine andere Datenbank auf demselben oder einem anderen Server laden.

InnoDB ( innodb_file_per_table enabled)

Mit innodb_file_per_table aktiviert ist , Tabellendaten und ihre Indizes leben in der Datenbank Ordner neben der FRM - Datei. Beispiel: Für die Tabelle db1.mytable lautet die Manifestation dieser InnoDB-Tabelle außerhalb von ibdata1:

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

System Tablespace ibdata1

Alle Metadaten für db1.mytable befinden sich immer noch in ibdata1, und daran führt absolut kein Weg vorbei . Redo-Logs und MVCC-Daten leben auch noch mit ibdata1.

Wenn es um die Fragmentierung von Tabellen geht, passiert mit ibdata1 Folgendes:

  • innodb_file_per_table enabled : Sie können db1.mytables mitALTER TABLE db1.mytable ENGINE=InnoDB;oderverkleinernOPTIMIZE TABLE db1.mytable;. Dies führt dazu, dass /var/lib/mysql/db1/mytable.ibd ohne Fragmentierung physisch kleiner ist.
  • innodb_file_per_table deaktiviert : Sie können db1.mytables nicht mitALTER TABLE db1.mytable ENGINE=InnoDB;oderverkleinern,OPTIMIZE TABLE db1.mytable;da es sich in ibdata1 befindet. Wenn Sie einen der beiden Befehle ausführen, wird die Tabelle zusammenhängend und kann schneller gelesen und beschrieben werden. Leider tritt das am Ende von ibdata1 auf. Dadurch wächst ibdata1 schnell. Dies wird in meinem InnoDB-Bereinigungsbeitrag ausführlich behandelt .

WARNUNG (oder GEFAHR, wie der Roboter in Lost in Space sagen würde )

Wenn Sie nur daran denken, die .frm- und .ibd-Datei zu kopieren, sind Sie für die Welt der Verletzungen gut gerüstet. Das Kopieren der .frm- und .ibd-Datei einer InnoDB-Tabelle ist nur dann sinnvoll, wenn Sie sicherstellen können, dass die Tablespace-ID der .ibd-Datei genau mit dem Tablespace-ID-Eintrag in den Metadaten der ibdata1-Datei übereinstimmt .

Ich habe in DBA StackExchange zwei Posts über dieses Tablespace-ID-Konzept geschrieben

Hier finden Sie einen hervorragenden Link zum erneuten Anhängen einer .ibd-Datei an ibdata1 im Falle von nicht übereinstimmenden Tablespace-IDs: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Nachdem Sie dies gelesen haben, sollten Sie sofort feststellen, dass das Kopieren von .ibd-Dateien einfach verrückt ist.

Für InnoDB benötigen Sie nur etwas, um sich zu bewegen

CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;

um eine Kopie einer InnoDB-Tabelle zu erstellen.

Wenn Sie es auf einen anderen DB-Server migrieren, verwenden Sie mysqldump.

In Bezug auf das Mischen aller InnoDB-Tabellen aus allen Datenbanken kann ich tatsächlich die Weisheit darin erkennen. Bei der DB / Web-Hosting-Firma meines Arbeitgebers habe ich einen MySQL-Client, der eine Tabelle in einer Datenbank hat, deren Einschränkungen einer anderen Tabelle in einer anderen Datenbank innerhalb derselben MySQL-Instanz zugeordnet sind. Mit einem gemeinsamen Metadaten-Repository werden Transaktionsunterstützung und MVCC-Funktionsfähigkeit über mehrere Datenbanken hinweg ermöglicht.


Bedeutet das, wenn ich innodb file per table aktiviert habe und wenn ich meine Daten von einem Server auf einen anderen importieren muss, muss ich nur mysqldump und keine anderen Tools wie Percona xtrabackup verwenden?
Tesla747

14

Sie können InnoDB umschalten, um Tabellen pro Datei zu speichern, indem Sie Ihrer cnf innodb-file-per-table hinzufügen.

Innodb kümmert sich im Grunde nur um Datenseiten. Tatsächlich können Sie InnoDB so einrichten, dass nur ein Raw-Block-Gerät ohne Dateisystem verwendet wird. http://dev.mysql.com/doc/refman/5.5/en/innodb-raw-devices.html

Das Speichern von Tabellen für Dateien bietet einige Vorteile, z. B. die einfachere Wiederherstellung des verwendeten Speicherplatzes durch Optimieren.

Selbst bei Dateien pro Tabelle können Sie die ibd-Dateien nicht so einfach kopieren, da InnoDB transaktionell ist und Informationen über den Status in den global freigegebenen ibdata / log-Dateien speichert.

Das heißt nicht, dass es nicht möglich ist. Wenn die Tabelle offline ist, können Sie die Tablespaces verwerfen / importieren und die IDBS unter http://dev.mysql.com/doc/refman/5.5/de/innodb-multiple-tablespaces.html kopieren


Kein Zweifel, dass InnoDB eine flexible Engine ist, aber ich verstehe nicht, wie vorteilhaft es ist, alle Daten in einer Datei zu speichern (da diese neue Struktur in InnoDB im Vergleich zu MyISAM implementiert wurde).
Googlebot

Ich denke, es ist eher so, dass es im Nachhinein 20/20 Dinge sind. Die Option "Datei pro Tabelle" wurde hinzugefügt, nachdem innodb zum ersten Mal aus den Regalen gerollt war. Abgesehen davon, dass es ein eigenes Blockgerät ist, um den Overhead des Dateisystems zu vermeiden, kann ich keinen Grund angeben, warum es besser ist, alle zusammen abzulegen (und das ganze Blockgerät ist eine eigene Debatte). Bei allen Innodb-Setups ist die Datei pro Tabelle aktiviert.
atxdba

Das ist der Punkt, sich nicht auf das Dateisystem zu verlassen, kann von unschätzbarem Wert sein, ist aber standardmäßig nicht aktiv. Daher werden es einige Benutzer verwenden.
Googlebot

1
Eine Datei pro Tabellenoption kann Schaden anrichten, wenn Sie über viele Tabellen und nicht viel RAM verfügen (ein Magento-Speicher verfügt beispielsweise möglicherweise über 1000 Tabellen). Auch die Einstellung für geöffnete Dateien muss optimiert werden (unter Berücksichtigung der Einschränkungen des Betriebssystems). Also mit Vorsicht verwenden.
ypercubeᵀᴹ

Dies kann die Wiederherstellungsbemühungen sicherlich dämpfen. Ja, Sie sollten ein Backup haben. Andernfalls erschwert InnoDB die Arbeit aufgrund dieser Struktur.
Mikato

10

Dies ist das Standardverhalten, jedoch nicht obligatorisch. Von MySQL - Dokumentation, Am Per-Tabelle Tablespaces :

Standardmäßig werden alle InnoDB-Tabellen und -Indizes im Systemtabellenbereich gespeichert. Alternativ können Sie jede InnoDB-Tabelle und ihre Indizes in einer eigenen Datei speichern . Diese Funktion wird als "mehrere Tablespaces" bezeichnet, da jede Tabelle, die mit dieser Einstellung erstellt wird, über einen eigenen Tablespace verfügt.

Der Grund dafür ist wahrscheinlich die unterschiedliche Architektur der beiden Engines (MyISAM und InnoDB). In InnoDB können Sie beispielsweise die .ibd-Datei nicht einfach in eine andere Datenbank oder Installation kopieren. Erklärung (von derselben Seite):

Überlegungen zur Portabilität von .ibd-Dateien

Sie können .ibd-Dateien nicht wie bei MyISAM-Tabellendateien frei zwischen Datenbankverzeichnissen verschieben. Die im gemeinsam genutzten InnoDB-Tabellenbereich gespeicherte Tabellendefinition enthält den Datenbanknamen. Die in den Tablespace-Dateien gespeicherten Transaktions-IDs und Protokollfolgenummern unterscheiden sich auch zwischen den Datenbanken.


Sehr informative Antwort und Klärung des Problems, aber ich bin trotzdem gespannt, wie eine große Datei, die alle Datenbanken enthält, die Leistung verbessern kann (wenn ja).
Googlebot

Die Leistung ist nicht besser, weil eine Datei für alle vorhanden ist. Verschiedene Merkmale wie Sperren auf Zeilenebene anstelle von Sperren auf Tabellenebene tragen zur Leistung bei. Und natürlich ist der Hauptvorteil Transaktionen und FK-Einschränkungen (und damit die Integrität der Datenbank).
ypercubeᵀᴹ

1
Sie haben völlig Recht mit Integrität! Ich verstehe, warum es besser ist, alle Tabellen einer Datenbank in einer einzigen Datei abzulegen. aber ich verstehe nicht, warum alle Datenbanken (die völlig unabhängig sind) auf die gleiche Datei setzen. InnoDB verwendet standardmäßig nur eine Datei zum Speichern von Daten.
Googlebot
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.