it-swarm.com.de

Wie verkleinere ich die innodb-Datei ibdata1, ohne alle Datenbanken zu sichern?

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

Nach dem Löschen einer großen Tabelle behält die Datei ihre Größe bei, unabhängig davon, wie groß die Tabelle 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 Ablegen immer noch rückgängig machen können. In meinem Fall muss ich nicht.

24
rubo77

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

Um es milde auszudrücken, es gibt einfach keine andere Möglichkeit, ibdata1 zu verkleinern. Wenn innodb_file_per_table deaktiviert ist, wird jedes Mal, wenn Sie OPTIMIZE TABLE in einer InnoDB-Tabelle ausführen , ibdata1 wächst schnell. Daten, die mit DROP TABLE Und DROP DATABASE Abgelegt werden, können nicht zurückgesetzt werden, 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 Klassen von Informationen, die sich in ibdata1 befinden

  • Tabellendaten
  • Tabellenindizes
  • Tabelle MetaData
  • MVCC-Steuerdaten
  • Double Write Buffer (Hintergrundschreiben, um die Abhängigkeit vom Betriebssystem-Caching 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 alle Tabellen, die sich noch in ibdata1 befinden, mit ALTER TABLE ... ENGINE=InnoDB; Oder OPTIMIZE TABLE Extrahieren, aber dadurch bleibt der große klaffende ungenutzte Speicherplatz in ibdata1.

Trotzdem müssen Sie die InnoDB-Infrastruktur bereinigen. Ich habe bereits StackExchange-Beiträge darüber geschrieben, wie und warum dies zu tun ist:

Gute Nachrichten

Sie müssen nur die Daten sichern, noch einmal neu laden und dieses Problem nie wieder aufgreifen. Wenn Sie anschließend OPTIMIZE TABLE Ausführen, wird die Tablespace-Datei .ibd Für jede InnoDB-Tabelle verkleinert.

30
RolandoMySQLDBA

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

innodb_file_per_table = 1

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

Dies 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. Nach meinem Verständnis würde das Verkleinern eine Defragmentierung erfordern, was keine unterstützte Operation ist.

2