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 TABLE
auf einer InnoDB - Tabelle, wächst ibdata1 schnell. Daten, die mit gelöscht werden DROP TABLE
und DROP DATABASE
nicht 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=1
kö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 TABLE
bleibt 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 TABLE
danach ausführen, wird die .ibd
Tablespace-Datei für jede InnoDB-Tabelle tatsächlich verkleinert .
InnoDB speichert nur dann alle Ihre InnoDB-Tabellen in ibdata1, wenn Sie die folgende Einstellung in Ihrer my.cnf-Standarddatei nicht verwenden:
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.
quelle