Speicherplatz bei InnoDB wieder freigeben

Questioner

Neuer Benutzer
Beiträge
4
Hi Leute,

ich betreibe eine Software (keine Eigenentwicklung), die Textdateien aus einem Verzeichnis einließt und in einer Queue-Tabelle für die weitere Verarbeitung zwischenspeichert. Nach der Verarbeitung einer Datei wird diese aus der Queue-Tabelle gelöscht.

In aller Regel befinden sich nur wenige Dateien in der Tabelle. Sollte das System aber mal stehen bleiben füllt sich das Verzeichnis kontinuierlich weiter und der Speicherplatz der Queue-Tabelle explodiert etwas, sobald die Dateien dann geballt eingelesen werden.

Die InnoDB gibt den Speicherplatz aber nach dem Löschen der Datensätze nicht wieder frei... Nach einiger Recherche und viel Zeit habe ich die Datenbank jetzt veranlasst, für jede Tabelle einen eigenen Tablespace anzulegen. Jedoch zeigt sich hier das gleiche Verhalten.

Gibt es keine Möglichkeit den Speicherplatz wieder freizugeben ohne die gesamte Tabelle zu löschen und einen Dump neu einzuspielen?! Das ist bei derartigen Datenmengen kaum zu bewältigen, zumal ja nochmal zusätzlicher Speicherplatz für den jeweiligen Dump erforderlich ist...

Liebe Grüße
Questioner
 
Werbung:
Die InnoDB gibt den Speicherplatz aber nach dem Löschen der Datensätze nicht wieder frei... Nach einiger Recherche und viel Zeit habe ich die Datenbank jetzt veranlasst, für jede Tabelle einen eigenen Tablespace anzulegen. Jedoch zeigt sich hier das gleiche Verhalten.

Du suchst innodb_file_per_table. Das hast scheinbar (noch immer) nicht gesetzt.

Und ja: Willkommen in der tollen Welt von MySQL!
 
Hallo akretschmer,

vielen Dank für die rasche Antwort.
Doch ich habe innodb_file_per_table gesetzt und das funktioniert soweit auch. Für jede Tabelle wurde eine ibd-Datei erstellt. Wenn ich die Datenbank nun etwas füttere, so wachsen die entsprechenden Dateien, die ibdata1 bleibt jedoch konstant.
Soweit so gut.

Doch sobald ich Daten aus einer Tabelle wieder lösche wird die zugehörige ibd-Datei trotzdem nicht wieder kleiner. Fakto bleibt der Speicherplatz belegt. Auch hier müsste ich jetzt wieder hergehen, die Tabelle dumpen, löschen und neu einspielen. Der einzig erkennbare Vorteil ist, dass ich das jetzt mit jeder Tabelle einzeln machen kann/muss und nicht immer mit der ganzen Datenbank und dass ich hierfür den OPTIMIZE-Befehl nutzen kann, was die Arbeit etwas erleichtert.

Das Grundproblem bleibt aber erhalten: Wenn das System zum stehen kommt, weil der Speicherplatz voll ist (und vorher meldet sich keiner), habe ich auch keinen Platz mehr für einen Dump. Auch OPTIMIZE TABLE macht im Grunde nichts anderes, als die Tabelle in eine Temp-Tabelle zu kopieren, die eigentliche Tabelle zu löschen und anschließend die Daten aus der Temp-Tabelle wieder herzustellen. Somit braucht auch OPTIMIZE-Table zusätzliche Speicherkapazitäten.

Ich hatte gehofft, die Dateien würden selbständig wieder verkleinert werden, was jedoch ein großer Irrtum war. Und selbst manuell lassen sich die Dateien nicht verkleinern ohne weiteren Speicherplatz zu belegen.

Liebe Grüße
Questioner
 
Werbung:
Ich hatte gehofft, die Dateien würden selbständig wieder verkleinert werden, was jedoch ein großer Irrtum war. Und selbst manuell lassen sich die Dateien nicht verkleinern ohne weiteren Speicherplatz zu belegen.

Liebe Grüße
Questioner

Tja, MySQL halt. Ich nutze es nicht und kann Dir hier mangels Wissen / Erfahrung auch nicht weiterhelfen.
 
Zurück
Oben