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 PROCESSLIST
zeigte, 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 mysql
es 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 ALTER
ausgeführt wurde. Löschen Sie sie einfach.
Sicherheitshalber habe ich es ALTER
, zumindest in 5,5 Tagen, so gemacht:
- Erstellen Sie eine neue, leere Tabelle wie die vorhandene Tabelle.
- Ändern Sie das Schema (fügen Sie in Ihrem Fall eine Spalte hinzu)
- Kopieren Sie alle Daten aus der vorhandenen Tabelle in die neue. (Der langsame Teil)
- Nehmen Sie einige Tabellenumbenennungen vor.
- 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.