MySQL kopiert temporäre Tabelle auf volle Festplatte. Wie entferne ich temporäre Dateien?

MySQL kopiert temporäre Tabelle auf volle Festplatte. Wie entferne ich temporäre Dateien?

Was ist die sicherste Art der Reinigung?

MySQL-Server 5.5.62-0 unter Debian 8 ohne Replikation.

Ich habe einen Fehler gemacht und eine neue Spalte in einer 26 GB-Tabelle erstellt. SHOW PROCESSLISTzeigte, dass MySQL die Daten bei 100 % CPU-Auslastung in eine temporäre Tabelle kopierte.

+-----------+------+-----------+--------+---------+------+-------------------+------------------+
| Id        | User | Host      | db     | Command | Time | State             | Info             |
+-----------+------+-----------+--------+---------+------+-------------------+------------------+
| 145904211 | root | localhost | huge   | Query   |  160 | copy to tmp table | ALTER TABLE ...  |
| 145905739 | root | localhost | NULL   | Query   |    0 | NULL              | show processlist |
+-----------+------+-----------+--------+---------+------+-------------------+------------------+

Ein paar Minuten später war die Hauptpartition voll und die CPU-Leistung fiel auf 0. Ich hoffte, dass systemctl stop mysqles die temporären Dateien bereinigen würde. Der Dienst ließ sich auch nicht neu starten.

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        79G   75G 1000K 100% /

$ sudo systemctl start mysql
Job for mysql.service failed. See 'systemctl status mysql.service' and 'journalctl -xn' for details.

Ich habe den VPS heruntergefahren und die Festplatte erweitert. Der Server wurde problemlos neu gestartet und ich konnte den MySQL-Prozess starten und eine Verbindung zu ihm herstellen. Alles scheint zu funktionieren.

Allerdings hat sich die Festplattennutzung seit dem Vorfall vor 20 Minuten nicht verringert.

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       158G   75G   75G  50% /

Wird der Reinigungsvorgang aktiviert oder muss ich das Chaos, das ich angerichtet habe, manuell beseitigen? Was ist der sicherste Weg, dies zu tun?

Antwort1

Zunächst vom MySQL-Befehlszeilentool aus:

kill 145904211;

Dassollenräumen Sie auf. Wenn nicht, suchen Sie nach Dateien, die mit etwas wie beginnen #sql.... Eine davon wird riesig sein und einen Zeitstempel enthalten, der angibt, wann die ALTERausgeführt wurde. Löschen Sie sie einfach.

Sicherheitshalber habe ich es ALTER, zumindest in 5,5 Tagen, so gemacht:

  1. Erstellen Sie eine neue, leere Tabelle wie die vorhandene Tabelle.
  2. Ändern Sie das Schema (fügen Sie in Ihrem Fall eine Spalte hinzu)
  3. Kopieren Sie alle Daten aus der vorhandenen Tabelle in die neue. (Der langsame Teil)
  4. Nehmen Sie einige Tabellenumbenennungen vor.
  5. Lassen Sie den alten Tisch fallen.

Wahrscheinlich bleiben Sie mitten in Schritt 3 hängen.

Der einzige riskante Zeitpunkt ist in Schritt 4, der sehr schnell ist. Davor ist die alte Tabelle noch aktiv und gesund. Danach wird sie durch die neue Tabelle ersetzt.

verwandte Informationen