Wie kann ich die Innodb-Datei ibdata1 verkleinern, ohne alle Datenbanken zu sichern?

24

InnoDB speichert alle Tabellen in einer großen Datei ibdata1.

Nach dem Ablegen eines großen Tisches behält die Datei ihre Größe, egal wie groß der Tisch war. Wie kann ich diese Datei verkleinern, ohne die gesamte Datenbank (mit insgesamt mehreren Hundert GB) sichern und erneut importieren zu müssen?

Ich denke, der Grund dafür ist, dass Sie das Löschen immer noch rückgängig machen können. In meinem Fall muss ich nicht.

rubo77
quelle

Antworten:

30

Dies ist eines der kontroversesten Themen, mit denen ich mich im Laufe der Jahre als MySQL-DBA und im DBA-StackExchange auseinandergesetzt habe.

Um es milde auszudrücken, es gibt einfach keine andere Möglichkeit, ibdata1 zu verkleinern . Mit innodb_file_per_table Behinderte, jedes Mal , wenn Sie OPTIMIZE TABLEauf einer InnoDB - Tabelle, wächst ibdata1 schnell. Daten, die mit gelöscht werden DROP TABLEund DROP DATABASEnicht zurückgesetzt werden können, da es sich um DDL und nicht um DML handelt. Ich glaube, Oracle und MSSQL können DDL zurücksetzen. MySQL kann das nicht.

Es gibt mehrere Informationsklassen, die sich in ibdata1 befinden

  • Tabellendaten
  • Tabellenindizes
  • Tabellen-Metadaten
  • MVCC-Steuerdaten
  • Doppelter Schreibpuffer (Hintergrundschreiben, um die Abhängigkeit vom Zwischenspeichern des Betriebssystems zu verhindern)
  • Puffer einfügen (Änderungen an nicht eindeutigen Sekundärindizes verwalten)

Mit innodb_file_per_table=1können Sie neue Tabellen mit Tabellendaten und Tabellenindizes erstellen, die außerhalb von ibdata1 erstellt werden. Sie können mit ALTER TABLE ... ENGINE=InnoDB;oder alle Tabellen extrahieren, die noch in ibdata1 enthalten sind. Dadurch OPTIMIZE TABLEbleibt jedoch der große klaffende ungenutzte Speicherplatz in ibdata1.

Ungeachtet dessen müssen Sie die InnoDB-Infrastruktur bereinigen. Ich habe bereits StackExchange-Posts darüber geschrieben, wie und warum dies geschehen soll:

Gute Nachrichten

Sie müssen nur die Daten sichern, erneut laden und dieses Problem nie wieder beheben . Wenn Sie OPTIMIZE TABLEdanach ausführen, wird die .ibdTablespace-Datei für jede InnoDB-Tabelle tatsächlich verkleinert .

RolandoMySQLDBA
quelle
1
Kleinere Korrekturen: MSSQL und PostgreSQL können DDL zurücksetzen. Oracle kann nicht. Tatsächlich gibt Oracle ein implizites Commit aus, wenn es DDL sieht!
Chris Travers
1
@RolandoMySQLDBA seit welcher Version von MySQL funktioniert diese "gute Nachricht" des automatischen Schrumpfens?
Gavriel
@Gavriel - Ich glaube du hast falsch gelesen. Sie müssen noch entleeren; entferne ibdata1; Neustart; und neu laden. Kein Autoshrink von ibdata1. (Das Ändern von iblog * ist jetzt einfacher.)
Rick James
2

InnoDB speichert nur dann alle Ihre InnoDB-Tabellen in ibdata1, wenn Sie die folgende Einstellung in Ihrer my.cnf-Standarddatei nicht verwenden:

innodb_file_per_table = 1

DROP TABLE (und DROP DATABASE) können nicht zurückgesetzt werden.

Das ist nicht der Grund, warum Sie ibdata1 nicht verkleinern können.

Dies ist eine abgekürzte Erklärung, aber ibdata1 enthält zusätzlich zu Ihren Tabellendaten InnoDB-Interna. Um es zu verkleinern, müsste es meines Erachtens defragmentiert werden, was keine unterstützte Operation ist.

Michael - sqlbot
quelle