2016-07-13 29 views
0

Ich habe etwa eine 25 GB-Tabelle, die ich eine Spalte hinzufügen müssen.tmp Tabelle nicht wachsen beim Ausführen ALTER, um neue Spalte

Ich ein Skript ausführen und wenn ich es ausführen, kann ich die temporäre Tabelle im Datenverzeichnis sehen, aber es bleibt bei etwa 480K stecken. Ich kann in der Prozessliste sehen, dass der ALTER läuft und es keine Probleme gibt.

Wenn ich das Skript nach einer langen Zeit der Aktivität zu töten, dann in der Prozessliste die Abfrage bleibt "getötet" Zustand und die tmp-Datei beginnt zu wachsen, bis die Abfrage LITERALLY getötet wird (dh, geht aus "getötet" -Zustand) in der Prozessliste zum vollständigen Verschwinden der Prozessliste).

Wenn ich die folgenden ausführen (vor der Abfrage zu töten):

select * from global_temporary_tables\G 

es zeigt keine Zeilen entweder hinzugefügt werden.

Gibt es noch etwas, das ich tun kann?

+0

InnoDB oder MyISAM? –

Antwort

1

Erstens, was Ihr "PS" -Ausgabebericht zeigen kann, hat nichts mit irgendetwas zu tun. Verlassen Sie sich nicht auf das, was "ps" sagt: Es enthält veraltete Daten.

Wenn der Prozess beendet wurde (SIGKILL, nicht SIGTERM), garantiere ich Ihnen, dass es keine Ausgabe mehr liefert. Wenn es SIGTERMed war, hängt es davon ab, welche Signalhandler Sie angehängt haben. Ich werde eine wilde Vermutung riskieren, dass Sie keine Signalhandler registriert haben.

Die meisten Produktions-DBMS richten Speicher in Chunks ein. X Raum wird erhalten, der einen "schlaffen" Raum enthalten kann, in dem Zeilen und/oder Spalten hinzugefügt werden können (ich sage NICHT, dass die beiden Mechanismen identisch sind). Nur weil etwas nicht in einer Weise gewachsen ist, die man wahrnehmen konnte, heißt das nicht, dass die Veränderungen nicht gemacht wurden. Schauen Sie sich das Datenlexikon an und überprüfen Sie die aktuelle Struktur der Tabelle.

Haben Sie Ihre Änderungen COMMIT? In einigen DBMS werden DDL-Operationen als commitable/rollbackable (yecch) -Ereignisse angesehen.