Sie müssen mit innodb_file_per_table gehen und Sie müssen einige wie Reinigung mit der aktuellen Infrastruktur von InnoDB tun.
Ich habe gesehen, dass viele DB-Hosting-Clients MySQL eingerichtet haben und InnoDB in seinem Standardzustand belassen. Dies führt dazu, dass der Systemtabellenbereich (besser bekannt als ibdata1) stark wächst.
Auch wenn Sie zu innodb_file_per_table gewechselt haben, müsste die .ibd-Datei aus ibdata1 extrahiert werden, und ibdata wird niemals verkleinert. Wenn Sie beispielsweise eine Tabelle mit dem Namen mydb.mytable in ibdata1 haben, die 2 GB belegt, müssen Sie Folgendes ausführen, um sie zu extrahieren:
SCHRITT 01) Fügen Sie dies zu /etc/my.cnf hinzu
[mysqld]
innodb_file_per_table
SCHRITT 02) service mysql restart
SCHRITT 03) ALTER TABLE mydb.mytable ENGINE=InnoDB;
Dadurch wird die Datei /var/lib/mysql/mydb/mytable.ibd erstellt
Leider können die 2 GB Speicherplatz, die vor der Änderung von der Tabelle belegt wurden, nicht zurückgefordert werden. Ich habe in früheren Beiträgen darüber geschrieben, wie und warum die Infrastruktur von InnoDB bereinigt werden soll:
Vergessen Sie nicht, innodb_open_files (Standard 300) zu erhöhen, sobald Sie diese wichtige Änderung vorgenommen haben . Andernfalls ist der Festplattenzugriff sehr eingeschränkt.
Stellen Sie in Bezug auf Verknüpfungen sicher, dass Sie über geeignete Indizes verfügen, die die Verknüpfungskriterien unterstützen.
UPDATE 2012-04-02 11:30 EDT
Die Verwendung von innodb_file_per_table in einer neuen Installation führt dazu, dass ibdata1 sehr langsam wächst, da alle DDLs außerhalb von ibdata ausgeführt werden. Sie können jede InnoDB-Tabelle wie oben erwähnt wie folgt verkleinern:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
UPDATE 2012-04-02 16:50 EDT
Seien Sie beim Erstellen von Sicherungskopien äußerst vorsichtig .ibd-Dateien. Warum?
In jeder .ibd-Datei befindet sich ein spezieller Wert, der als tablespace_id bezeichnet wird. In ibdata1 befindet sich eine Liste der Werte für tablespace_id. Wenn Sie jemals eine Tabellenpflege durchführen, bei der die Tabelle gelöscht und neu erstellt werden muss, ändert sich die Tablespace-ID. Das Erstellen einer Kopie einer solchen .ibd-Datei kann nur dann in die Datenbank zurückgespielt werden, wenn Sie auch eine Kopie von ibdata1 erstellen. Dies gefährdet die tablespace_id aller anderen InnoDB-Tabellen. In Anbetracht dessen ist es vorzuziehen, dass Sie mysqldump-Sicherungen durchführen, da mysqldumps logische Kopien der Daten sind. Mit anderen Worten, das Backup ist unabhängig vom Zeitpunkt der ibdata1 und Sie können ohne Bedienungsprobleme neu laden.
Stimmen Sie mit @RolandoMySQLDBA überein, für etwas, das er nicht erwähnt: Backups.
Wenn Ihr MySQL-Backup-Regime gut funktioniert hat und Sie die .ibd-Datei nicht in Ihre Dateisystem-Backup-Strategie einbeziehen, ist dies nicht so wichtig. Bedenken Sie jedoch, dass das Hinzufügen von ONE BYTES zu einer Innodb-Tabelle eine inkrementelle Sicherung Ihrer .ibd-Tabelle zur Folge hat, und Sie sehen, dass Ihnen der Sicherungsspeicher schnell ausgeht.
quelle
Ich habe eine Anwendung, in der ich genau diese Situation habe: einige große Tabellen und einige kleinere.
Ich beschloss, die Kleinen zu belassen,
ibdata1
während die Größeren in ihren eigenen Akten abgelegt wurden.Ich habe das
innodb_file_per_table
standardmäßig eingeschaltet und schalte es nur vorübergehend aus, um einen Tischibdata1
mit zu verschiebenALTER TABLE
.quelle
ALTER TABLE
ihnen. Meine Strategie ist es also,innodb_file_per_table
regelmäßig eingeschaltet zu haben und es zufällig auszuschalten, um einen kleinen Tisch hinein-ibdata1
und wieder einzuschalten.