it-swarm.com.de

MySQL InnoDB gibt nach dem Löschen von Datenzeilen aus der Tabelle keinen Speicherplatz mehr frei

Ich habe eine MySQL-Tabelle, die die InnoDB-Speicher-Engine verwendet. Es enthält ungefähr 2 Millionen Datenzeilen. Beim Löschen von Datenzeilen aus der Tabelle wurde der zugewiesene Speicherplatz nicht freigegeben. Auch die Größe der Datei ibdata1 wurde nach dem Ausführen des Befehls optimize table Nicht verringert.

Gibt es eine Möglichkeit, Speicherplatz von MySQL zurückzugewinnen?

Ich bin in einer schlechten Situation; Diese Anwendung wird an ca. 50 verschiedenen Standorten ausgeführt und fast alle weisen jetzt ein Problem mit dem geringen Speicherplatz auf.

126
Sumit Deo

MySQL reduziert die Größe von ibdata1 nicht. Je. Auch wenn Sie optimize table Verwenden, um den verwendeten Speicherplatz von gelöschten Datensätzen freizugeben, wird er später wiederverwendet.

Eine Alternative besteht darin, den Server für die Verwendung von innodb_file_per_table zu konfigurieren. Dies erfordert jedoch eine Sicherung, ein Löschen der Datenbank und eine Wiederherstellung. Die positive Seite ist, dass die .ibd-Datei für die Tabelle nach einem optimize table Verkleinert wird.

130
Leonel Martins

Ich hatte gerade das gleiche Problem.

Was passiert, ist, dass innodb auch dann keinen Speicherplatz freigibt, wenn Sie die Datenbank löschen. Ich musste exportieren, MySQL beenden, die Dateien manuell entfernen, MySQL starten, eine Datenbank und Benutzer erstellen und dann importieren. Gott sei Dank hatte ich nur Zeilen im Wert von 200 MB, aber es ersparte 250 GB Innodb-Datei.

Versagen von Entwurf

35
gilm

Wenn Sie innodb_file_per_table nicht verwenden, ist die Wiederherstellung des Speicherplatzes möglich, jedoch recht mühsam und erfordert eine erhebliche Ausfallzeit.

Das How To ist ziemlich ausführlich - aber ich habe den relevanten Teil unten eingefügt.

Stellen Sie sicher, dass Sie auch eine Kopie Ihres Schemas in Ihrem Speicherauszug aufbewahren.

Derzeit können Sie keine Datendatei aus dem Systemtabellenbereich entfernen. Gehen Sie folgendermaßen vor, um die Größe des Systemtabellenbereichs zu verringern:

Verwenden Sie mysqldump, um alle Ihre InnoDB-Tabellen zu sichern.

Stoppen Sie den Server.

Entfernen Sie alle vorhandenen Tablespace-Dateien, einschließlich der Dateien ibdata und ib_log. Wenn Sie eine Sicherungskopie der Informationen aufbewahren möchten, kopieren Sie alle ib * -Dateien an einen anderen Speicherort, bevor Sie die Dateien in Ihrer MySQL-Installation entfernen.

Entfernen Sie alle .frm-Dateien für InnoDB-Tabellen.

Konfigurieren Sie einen neuen Tablespace.

Starten Sie den Server neu.

Importieren Sie die Sicherungsdateien.

23
FlipMcF

Zehn Jahre später hatte ich das gleiche Problem. Ich habe es folgendermaßen gelöst:

  • Ich habe alle Datenbanken optimiert.
  • Ich habe meinen Computer und MySQL auf Diensten neu gestartet (Windows + r -> services.msc)

Das ist alles :)

1
Matheus Douglas

Eine andere Möglichkeit, das Problem der Speicherplatzfreigabe zu lösen, besteht darin, mehrere Partitionen in tabellenbasierten, auf Werten basierenden Partitionen zu erstellen und die Partition einfach zu löschen/zu kürzen, um den Speicherplatz freizugeben, der von den gesamten in der jeweiligen Partition gespeicherten Daten verwendet wird.

Es werden einige Änderungen im Tabellenschema erforderlich sein, wenn Sie die Partitionierung für Ihre Tabelle einführen, wie z. B. Eindeutige Schlüssel, Indizes, um Partitionsspalten usw. einzuschließen.

1