2010-12-02 7 views
3

Ich habe eine Datenbank von etwa 20 GB. Ich muss 5 Tabellen & löschen ein paar Spalten in einigen anderen 3 Tabellen löschen.Freier Speicherplatz in MySQL nach dem Löschen von Tabellen und Spalten?

Das Löschen von 5 Tabellen mit freien 3 GB und das Löschen von Spalten in anderen Tabellen sollten weitere 8 GB freigeben.

Wie kann ich diesen Speicherplatz von MySQL zurückfordern?

Ich habe gelesen, dumping die Datenbank und die Wiederherstellung zurück als eine der Lösung, aber ich bin mir nicht sicher, wie das funktioniert, ich bin nicht einmal sicher, ob dies nur zum Löschen der gesamten Datenbank oder nur Teile davon funktioniert ?

Bitte schlagen Sie vor, wie Sie vorgehen. Vielen Dank.

+0

@Gaurav - Sobald die Tabelle gelöscht wurde, wird mysql auch die physische Datei entfernen, logischerweise ist der Speicherplatz frei. Was ist dein Problem/deine Absicht? – ajreal

+0

Ich denke nicht, dass das der Fall ist, weil ich eine Tabelle von 1 GB fallen gelassen habe und ich bin ziemlich sicher, dass ich den Speicherplatz nicht zurück habe? Selbst wenn ich es täte, wie würdest du das machen, wenn du Spalten fallen lässt? – Gaurav

+0

@Gaurav - Hast du 'du -shc YOUR_DATABASE_DIRECTORY' vorher und nachher gemacht? Sie können 'optimize table' für das Löschen der Spalte verwenden, obwohl mysql wieder automatisch den Speicherplatz für das Tabellenschema-Update freigibt. – ajreal

Antwort

5

Aus den Kommentaren klingt es wie Sie InnoDB ohne die Datei pro Tabelle Option verwenden.

Das Freigeben von Speicherplatz aus dem innodb-Tablespace ist in diesem Modus im Allgemeinen nicht möglich. Ihre einzige Vorgehensweise besteht darin, die gesamte Datenbank zu sichern, den Modus "Datei-pro-Tabelle" einzuschalten und ihn erneut zu laden (mit einer vollständig sauberen mysql-Instanz). Dies wird bei einer großen Datenbank sehr lange dauern. mk-parallel-dump und restore tools sind zwar etwas schneller, aber es wird noch eine Weile dauern. Stellen Sie sicher, dass dieser Prozess zuerst auf einem Nicht-Produktionsserver getestet wird.

+3

Sobald die Option aktiviert ist, erhalten alle neuen Tabellen eine Datei. Das heißt, Sie können es einschalten und langsam eine Tabelle nach der anderen in eine eigene Datei verschieben (obwohl Sie die Tabelle entladen/neu geladen haben), bis Sie fertig sind. Dadurch können Sie die Ausfallzeit bei Bedarf in viele kleinere Zeiträume aufteilen, statt in einen großen. – MBCook

+0

@MBCook: Das klingt nach einer guten Idee. Werde es ausprobieren. – Gaurav

2

EDIT: Gilt nicht ohne file_per_table, Mark ist genau dort.

Was passiert ist, wenn MySQL einmal Platz braucht, wird es nicht zurück geben. Wenn Sie 500 Zeilen löschen und dann sofort 500 einfügen, muss der Speicherplatz nicht mehr an das Dateisystem zurückgegeben und dann erneut angefordert werden. Es ist eine Optimierung, um Dateisystem-Overhead zu vermeiden, und es funktioniert gut, wenn Sie kleine Bits löschen.

Wenn Sie eine große Menge löschen, wird es sehr lange dauern, bis Sie den gesamten Speicherplatz wieder verwenden, was ärgerlich sein kann. Dies kann auf zwei Arten behoben werden: Löschen der Tabelle und Neuladen des Inhalts oder Optimieren der Tabelle (die im Prinzip die Tabelle intern neu lädt).

Alles, was Sie tun müssen, um Raum aus einer Tabelle zurück zu bekommen ist:

OPTIMIZE TABLE my_big_table; 

Beachten Sie, dass dies eine Weile dauern kann, es ist nicht ein in der Nähe von Instant-Betrieb. Im Grunde planen Sie eine gewisse Ausfallzeit. Wenn Ihre Tische nur ein paar Gigs sind, sollte es nicht zu lange dauern (wahrscheinlich ein paar Minuten). Dies erstellt auch die Indizes neu und führt einige andere Aufgaben aus.

Sie können mehr über optimieren on the MySQL site. Hier ist es Rat:

OPTIMIZE TABLE verwendet werden sollten, wenn Sie einen großen Teil einer Tabelle gelöscht haben oder wenn Sie viele Änderungen an einer Tabelle mit Zeilen variabler Länge (Tabellen gemacht, die VARCHAR haben, VARBINARY, BLOB oder TEXT-Spalten). Gelöschte Zeilen werden in einer verknüpften Liste verwaltet, und nachfolgende INSERT-Operationen verwenden alte Zeilenpositionen erneut. Sie können OPTIMIZE TABLE verwenden, um den unbenutzten Speicherplatz zurückzugewinnen und die Datendatei zu defragmentieren.

+0

"Wenn deine Tische nur ein paar Gigs sind," Wenn du auf Gigs "Gigas" meinst, scheint deine Redewendung nicht wirklich korrekt zu sein. Ich brauchte 52 Minuten, um alle Tabellen einer Datenbank von 4Go zu optimieren :) Ich sage das nur für weitere Besucher. –

+0

Mysql wird intern komplett neu geschrieben. Bitte beachten Sie auch, dass der Speicherplatz der "realen Größe" der Tabelle verfügbar sein muss, wenn "OPTIMIZE TABLE [table]" ausgeführt wird – mblaettermann

Verwandte Themen