Ich habe die vollständige Antwort auf diese Frage.
Sobald innodb_file_per_table eingerichtet ist und neue InnoDB-Tabellen mit verkleinert werden können, ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
werden neue .ibd
Dateien mit GARANTIE verkleinert.
Wenn Sie ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
eine InnoDB-Tabelle ausführen, die vor der Verwendung von innodb_file_per_table erstellt wurde, werden die Daten und Indizes für diese Tabelle aus der Datei ibdata1 entfernt und in einer .ibd
Datei gespeichert. Auf diese Weise verbleibt eine permanente Taube in der Datei ibdata1, die niemals wiederverwendet werden kann .
Die ibdata1
Datei enthält normalerweise vier Arten von Informationen
Hier ist die garantierte Möglichkeit, die ibdata1-Datei für immer zu verkleinern ...
SCHRITT 01) MySQLDump alle Datenbanken in eine SQL-Textdatei (nennen Sie es SQLData.sql)
SCHRITT 02) Löschen Sie alle Datenbanken (mit Ausnahme der Schemata mysql, information_schema und performance_schema).
SCHRITT 03) Fahren Sie mysql herunter
SCHRITT 04) Fügen Sie die folgenden Zeilen zu /etc/my.cnf hinzu
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
Anmerkung: Unabhängig von Ihrer Einstellung für innodb_buffer_pool_size müssen Sie sicherstellen, dass innodb_log_file_size 25% von innodb_buffer_pool_size beträgt.
- SCHRITT 05) Löschen Sie ibdata1, ib_logfile0 und ib_logfile1 ( siehe Update unten vor dem Löschen! )
Zu diesem Zeitpunkt sollte nur das MySQL-Schema in / var / lib / mysql vorhanden sein
- SCHRITT 06) Starten Sie mysql neu
Dadurch wird ibdata1 bei 10 MB neu erstellt (Option nicht konfigurieren), ib_logfile0 und ib_logfile1 bei jeweils 1 GB
- SCHRITT 07) Laden Sie SQLData.sql erneut in mysql
ibdata1
wächst, enthält jedoch nur Tabellenmetadaten und intermittierende MVCC-Daten.
Jede InnoDB-Tabelle existiert außerhalb von ibdata1
Angenommen, Sie haben eine InnoDB-Tabelle mit dem Namen mydb.mytable. Wenn Sie darauf zugreifen /var/lib/mysql/mydb
, werden zwei Dateien angezeigt, die die Tabelle darstellen
mytable.frm
(Speicher-Engine-Header)
mytable.ibd
(Heimat der Tabellendaten und Tabellenindizes für mydb.mytable
)
ibdata1
enthält keine InnoDB-Daten und -Indizes mehr.
Mit der Option innodb_file_per_table in /etc/my.cnf
können Sie OPTIMIZE TABLE mydb.mytable
OR ausführen ALTER TABLE mydb.mytable ENGINE=InnoDB;
und die Datei /var/lib/mysql/mydb/mytable.ibd
wird tatsächlich verkleinert.
Ich habe dies in meiner Karriere als MySQL-DBA unzählige Male getan, ohne danach ein einziges Problem zu haben. Tatsächlich habe ich beim ersten Mal eine 50 GB große ibdata1-Datei auf 50 MB reduziert.
Versuche es. Wenn Sie weitere Fragen dazu haben, senden Sie mir eine E-Mail. Vertrau mir. Dies wird kurzfristig und langfristig funktionieren.
UPDATE 2013-07-02 15:08 EDT
Ich habe diesbezüglich eine Einschränkung, die ich in anderen Beiträgen von mir aktualisiert habe, aber diese habe ich verpasst: Ich aktualisiere meine Antwort ein wenig mehr mit innodb_fast_shutdown, weil ich mysql neu gestartet und mysql dazu angehalten habe. Jetzt ist dieser Schritt von entscheidender Bedeutung, da jede nicht festgeschriebene Transaktion andere bewegliche Teile innerhalb und außerhalb der InnoDB-Transaktionsprotokolle enthalten kann ( siehe InnoDB-Infrastruktur ).
Bitte beachten Sie, dass das Setzen von innodb_fast_shutdown auf 2 die Abmeldungen ebenfalls bereinigen würde, aber noch mehr bewegliche Teile vorhanden sind und bei Crash Recovery während des Starts von mysqld ausgewählt werden. Die Einstellung 0 ist am besten.