InnoDB

InnoDB
Basisdaten

EntwicklerHeikki Tuuri, Innobase Oy Inc. (Oracle Corporation)
BetriebssystemUnix, Linux, Windows, OS X, i5/OS, OpenVMS
Programmier­spracheC
KategorieSpeichersubsystem
LizenzDuales Lizenzsystem (Kommerziell und GNU General Public License)
deutschsprachignein
innodb.com

InnoDB ist ein freies Speichersubsystem für das Datenbankmanagementsystem MySQL. Sein Hauptvorteil gegenüber anderen Speichersubsystemen für MySQL ist, dass Transaktionssicherheit und referentielle Integrität über Fremdschlüssel gewährleistet werden.

Innobase Oy, der Hersteller von InnoDB, wurde im Oktober 2005 von Oracle Systems übernommen.[1]

Die Software ist doppellizenziert: Für Open-Source-Anwendungen steht sie unter der GPL; für Nicht-Open-Source-Anwendungen ist daneben eine proprietäre Lizenz erhältlich.[2]

Eigenschaften

Bei MySQL Version 5.0 wird InnoDB bei einer Installation unter Windows als Standard-Speichersubsystem installiert. Bei einer Installation unter Unix wird MyISAM als Standard-Speichersubsystem installiert. Seit MySQL 5.5 ist InnoDB das Standard-Speichersubsystem unter allen Systemen.[3]

InnoDB unterstützt Transaktionen, das heißt:

  • Die in der Transaktion erfolgten Schreiboperationen können durch einen Transaktionsabbruch (abort) widerrufen werden (rollback).
  • Wiederholte Lesezugriffe innerhalb einer Transaktion sind von Schreibzugriffen anderer Transaktionen nicht beeinflusst (Isolation aus ACID).
  • Schreibzugriffe in einer Transaktion bewirken eine Schreibsperre der betroffenen Datensätze für alle anderen Transaktionen (Row level locking).[4]

Um explizit eine Tabelle mit InnoDB als Speichersubsystem anzulegen, kann die SQL-Option ENGINE verwendet werden:

CREATE TABLE t (i INT) ENGINE = InnoDB;

(Anmerkung: Ältere Versionen von MySQL verwenden das Schlüsselwort TYPE statt ENGINE (Beispiel: TYPE = INNODB). MySQL 5.0 und 5.1 unterstützen diese Syntax abwärtskompatibel, allerdings wird die Verwendung von ENGINE empfohlen, denn seit MySQL 5.5 wird nur noch das Schlüsselwort ENGINE unterstützt.)[5][6]

Tabellenraum

InnoDB speichert die Tabellenstruktur in frm-Dateien, Nutzdaten und Indizes in einem Tabellenraum. Der Tabellenraum wird vor Beginn der Arbeit mit dem Datenbankserver eingestellt und kann sich über eine oder mehrere Dateien erstrecken. Die Dateien des Tabellenraums können auf verschiedene Verzeichnisse verteilt werden. Ähnlich einer Festplattenpartition kann die Konfiguration des Tabellenraums nicht nachträglich angepasst werden, ohne Datenverlust zu riskieren. Nach einer Änderung der Konfiguration des Tabellenraums wird die gesamte Datenbank von einer Sicherungskopie wiederhergestellt.

Mit der Option innodb_file_per_table wird für jede Tabelle ein eigener Tabellenraum angelegt, d. h. MySQL speichert Nutzdaten und Indizes in der Datei t.ibd zusammen mit der Strukturdatei t.frm im Datenbankverzeichnis. Tabellendaten können mit der Null-Operation aus dem Tabellenraum nachträglich extrahiert werden:

ALTER TABLE t ENGINE=InnoDB;

Speicherfreigabe

Nach dem Löschen von InnoDB-Tabellen wird der Speicher innerhalb des Tabellenraums freigegeben. Diese Freigabe wird jedoch nicht an das Betriebssystem weitergegeben, sodass die Größe der Tabellenraumdateien nicht reduziert wird. Die aufwändige Freigabe des Festplattenspeichers erfolgt durch Löschen des gesamten Tabellenraums und Wiederherstellung der Datenbank von einer Sicherungskopie.

Eine Alternative bietet der Per-Table-Tabellenraum, bei dem für jede Tabelle eine eigene Tabellenraumdatei erzeugt und nach dem Löschen der Tabelle wieder gelöscht wird.[7] Der Nachteil dieses Modus ist, dass man einen Teil der Datenverwaltung von MySQL auf das Betriebssystem verlagert, das diese u. U. weniger effizient erledigt. Vor dem Erstellen und Füllen einer großen Tabelle kann der Per-Table-Tabellenraum zur Laufzeit aktiviert und wieder deaktiviert werden, um später den Festplattenspeicher für eine einzelne Tabelle gezielt freizugeben.

SHOW VARIABLES LIKE 'innodb_file_per_table'; -- aktuelle Einstellung anzeigen
SET @@global.innodb_file_per_table = TRUE; -- Per-Table-Tablespace aktivieren
CREATE TABLE a (...) ENGINE=InnoDB; -- Eine Tabelle im Per-Table-Tablespace erstellen
ALTER TABLE t ENGINE=InnoDB; -- Eine Tabelle nachträglich in den Per-Table-Tablespace verschieben
SET @@global.innodb_file_per_table = FALSE; -- Per-Table-Tablespace deaktivieren
CREATE TABLE b (...) ENGINE=InnoDB; -- Eine Tabelle im Tablespace erstellen

DROP TABLE a; -- Tabelle löschen und Festplattenspeicher freigeben
DROP TABLE b; -- Tabelle löschen, Festplattenspeicher wird nicht freigegeben

Literatur

  • Sasha Pachev: Understanding MySQL Internals, O’Reilly 2007, ISBN 978-0-596-00957-1

Einzelnachweise

  1. Oracle verkündet Aufkauf von Innobase, einem Hersteller von Open-Source-Software. Oracle, abgerufen am 16. Januar 2015.
  2. Lizenzierung von MySQL und InnoDB. InnoDB.com, abgerufen am 9. Juli 2010.
  3. http://www.oracle.com/us/corporate/press/195726
  4. siehe z. B. Pachev: Understanding MySQL Internals, Chapter 10: Storage Engines
  5. Archivlink MySQL - CREATE TABLE (Memento vom 29. Januar 2012 im Internet Archive)
  6. http://dev.mysql.com/doc/refman/5.5/en/create-table.html
  7. InnoDB-Speicher automatisch freigeben. 15. Mai 2013, abgerufen am 10. Juni 2013.