Ist innodb_file_per_table ratsam?


19

Wir haben eine Anwendung, bei der nur einer der Tische zu Millionen Zeilen anwächst, der Rest jedoch knapp unter einer Million. Welchen Rat sollten wir also zu innodb_file_per_table geben oder einfach als eine .ibd-Datei lassen? Ich habe einige Artikel gelesen, in denen steht, dass Sie nicht mitmachen sollten, da Sie mehr Festplattenzugriff benötigen, wenn Verknüpfungen ausgeführt werden sollen. Wir werden diese Tabelle zu Berichtserstellungszwecken mit anderen verknüpfen.

Antworten:


24

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.


Das wird ein frischer Server. Also, was soll ich dann tun? Warum ist es Ihrer Meinung nach gut, mit innodb_file_per_table zu arbeiten? Im Laufe der Zeit wird diese Tabelle immer größer. Worauf sollte man achten, wenn es irgendwelche Grenzwertfehler gibt?
Neuling 14

7

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.


Lieber alle, ja, ich plane auch ein Backup. Wenn ich Master-to-Master-Backup benötige, was ist der Unterschied zwischen Master und Slave? Sind es beide, die sich gegenseitig unterstützen, oder? Welche Einstellungen müssen geändert werden?
Neuling 14

4

Ich habe eine Anwendung, in der ich genau diese Situation habe: einige große Tabellen und einige kleinere.

Ich beschloss, die Kleinen zu belassen, ibdata1während die Größeren in ihren eigenen Akten abgelegt wurden.

Ich habe das innodb_file_per_tablestandardmäßig eingeschaltet und schalte es nur vorübergehend aus, um einen Tisch ibdata1mit zu verschieben ALTER TABLE.


@gigigi wie man die kleinen in ibdata1 und die großen in ihren eigenen Dateien belässt ist es nicht so, dass wenn man diese innodb_file_per_table setzt, alle in ihren eigenen Dateien sein werden?
Neuling 14

Nur nach dir ALTER TABLEihnen. Meine Strategie ist es also, innodb_file_per_tableregelmäßig eingeschaltet zu haben und es zufällig auszuschalten, um einen kleinen Tisch hinein- ibdata1und wieder einzuschalten.
Glglgl

ist es in ordnung hier immer so zu bleiben wie innodb_file_per_table kein problem oder?
Neuling 14

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.