Ich habe eine MySQL-Tabelle mit der InnoDB-Speicher-Engine. Es enthält ungefähr 2 Millionen Datenzeilen. Beim Löschen von Datenzeilen aus der Tabelle wurde kein zugewiesener Speicherplatz freigegeben. Auch die Größe der Datei ibdata1 wurde nach dem Ausführen des optimize table
Befehls nicht verringert .
Gibt es eine Möglichkeit, Speicherplatz von MySQL zurückzugewinnen?
Ich bin in einer schlechten Situation; Diese Anwendung wird an ungefähr 50 verschiedenen Orten ausgeführt, und jetzt tritt bei fast allen das Problem des geringen Speicherplatzes auf.
mysql
innodb
delete-row
Sumit Deo
quelle
quelle
innodb_file_per_table
. Die gute Nachricht ist, dass diese Optionon
in neueren Versionen von MySQL standardmäßig verfügbar ist.Antworten:
MySQL reduziert die Größe von ibdata1 nicht. Je. Selbst wenn Sie den verwendeten
optimize table
Speicherplatz von gelöschten Datensätzen freigeben, wird er später wiederverwendet.Eine Alternative besteht darin, den zu verwendenden Server zu konfigurieren.
innodb_file_per_table
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 reduziert wirdoptimize table
.quelle
ALTER TABLE t ENGINE=INNODB
für die vorhandene Tabelle ausführen . "" Dies bedeutet, dass Sie diese Funktion aktivieren, die vorhandenen Tabellen in eine separate InnoDB-Datei mit dem Befehl ALTER TABLE "konvertieren" und dann die Tabelle OPTIMIEREN können, um ihre Größe zu verringern. Sobald Sie fertig sind, müssen Sie jedoch herausfinden, wie Sie die (riesige) InnoDB-Quelldatei löschen können ...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 stoppen, die Dateien manuell entfernen, MySQL starten, Datenbank und Benutzer erstellen und dann importieren. Gott sei Dank hatte ich nur Zeilen im Wert von 200 MB, aber 250 GB Innodb-Datei wurden geschont.
Fail by Design.
quelle
Wenn Sie innodb_file_per_table nicht verwenden , ist die Rückgewinnung von Speicherplatz möglich, aber recht langwierig und erfordert erhebliche Ausfallzeiten.
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.
quelle
Zehn Jahre später hatte ich das gleiche Problem. Ich habe es folgendermaßen gelöst:
Das ist alles :)
quelle
Eine andere Möglichkeit, das Problem der Speicherplatzrückgewinnung zu lösen, besteht darin, mehrere Partitionen in tabellenbasierten, wertbasierten Partitionen zu erstellen und die Partition einfach zu löschen / abzuschneiden, um den Speicherplatz zurückzugewinnen. Dadurch wird der Speicherplatz freigegeben, der von den gesamten in der jeweiligen Partition gespeicherten Daten verwendet wird.
Wenn Sie die Partitionierung für Ihre Tabelle einführen, sind einige Änderungen im Tabellenschema erforderlich, z. B. - Eindeutige Schlüssel, Indizes mit Partitionsspalte usw.
quelle
Vor einem Jahr hatte ich auch das gleiche Problem mit der mysql5.7-Version und ibdata1 belegte 150 GB. Also habe ich Tablespaces rückgängig gemacht
Mysqldump-Backup erstellen MySQL-
Dienst
beenden Alle Daten aus dem Datenverzeichnis entfernen
Fügen Sie den folgenden Parameter zum Rückgängigmachen des Tabellenbereichs in der aktuellen Datei my.cnf hinzu
Starten Sie den MySQL-Dienst
die MySQL-Sicherung mysqldump
Problem gelöst !!
quelle
Es gibt verschiedene Möglichkeiten, Speicherplatz zurückzugewinnen, nachdem Daten aus der Tabelle für die MySQL Inodb-Engine gelöscht wurden
Wenn Sie innodb_file_per_table nicht von Anfang an verwenden, können Sie nur alle Daten sichern, alle Dateien löschen, die Datenbank neu erstellen und die Daten erneut importieren (siehe Antworten von FlipMcF oben).
Wenn Sie innodb_file_per_table verwenden, können Sie es versuchen
quelle