Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So verkleinern/löschen Sie die ibdata1-Datei in MySQL

Das ibdata1 schrumpft nicht, ist eine besonders ärgerliche Eigenschaft von MySQL. Die ibdata1 Datei kann nicht tatsächlich verkleinert werden, es sei denn, Sie löschen alle Datenbanken, entfernen die Dateien und laden einen Dump neu.

Sie können MySQL jedoch so konfigurieren, dass jede Tabelle einschließlich ihrer Indizes als separate Datei gespeichert wird. Auf diese Weise ibdata1 wird nicht so groß. Laut Bill Karwins Kommentar ab Version 5.6.6 von MySQL ist dies standardmäßig aktiviert.

Es ist eine Weile her, dass ich das getan habe. Um Ihren Server jedoch so einzurichten, dass er separate Dateien für jede Tabelle verwendet, müssen Sie my.cnf ändern um dies zu ermöglichen:

[mysqld]
innodb_file_per_table=1

https://dev.mysql .com/doc/refman/5.6/en/innodb-file-per-table-tablespaces.html

Da Sie den Speicherplatz von ibdata1 zurückfordern möchten Sie müssen die Datei tatsächlich löschen:

  1. Führen Sie einen mysqldump durch aller Datenbanken, Prozeduren, Trigger usw. außer mysql und performance_schema Datenbanken
  2. Löschen Sie alle Datenbanken mit Ausnahme der beiden oben genannten Datenbanken
  3. Mysql stoppen
  4. Löschen Sie ibdata1 und ib_log Dateien
  5. Starten Sie mysql
  6. Aus Dump wiederherstellen

Wenn Sie MySQL in Schritt 5 starten, wird die Datei ibdata1 und ib_log Dateien werden neu erstellt.

Jetzt bist du startklar. Wenn Sie eine neue Datenbank zur Analyse erstellen, befinden sich die Tabellen in separaten ibd* Dateien, nicht in ibdata1 . Da Sie die Datenbank normalerweise bald danach löschen, wird die Datei ibd* Dateien werden gelöscht.

http://dev.mysql.com/doc/refman /5.1/en/drop-database.html

Sie haben wahrscheinlich Folgendes gesehen:
http://bugs.mysql.com /bug.php?id=1341

Mit dem Befehl ALTER TABLE <tablename> ENGINE=innodb oder OPTIMIZE TABLE <tablename> man kann Daten und Indexseiten aus ibdata1 in separate Dateien extrahieren. ibdata1 wird jedoch nicht verkleinert, es sei denn, Sie führen die obigen Schritte aus.

Bezüglich des information_schema , das ist weder notwendig noch möglich zu löschen. Es handelt sich tatsächlich nur um eine Reihe von schreibgeschützten Ansichten, nicht um Tabellen. Und ihnen sind keine Dateien zugeordnet, nicht einmal ein Datenbankverzeichnis. Das informations_schema verwendet die Speicher-DB-Engine und wird beim Beenden/Neustart von mysqld gelöscht und neu generiert. Siehe https://dev.mysql.com/doc/ refman/5.7/en/information-schema.html .