Eine beschädigte Tabelle ist fast immer ein Symptom: ein Stromausfall, eine vollgelaufene Platte oder sterbende Hardware. Reparieren Sie die Tabelle und finden Sie dann heraus, was davon es war - sonst passiert es nächste Woche wieder.
MyISAM
mysqlcheck --check --auto-repair --databases shop
# or, for one table
mysql -e "REPAIR TABLE shop.sessions"
MyISAM kennt keine Absturzwiederherstellung, ein unsauberes Herunterfahren hinterlässt Tabellen also als abgestürzt markiert. REPAIR bringt sie meist in Sekunden in Ordnung und wirft dabei womöglich die beschädigten Zeilen weg.
InnoDB ist anders
REPAIR TABLE wirkt bei InnoDB nicht, und eine Beschädigung dort ist ernst - normalerweise erholt sich die Engine beim Start selbst. Meldet InnoDB eine Beschädigung, ist die Wiederherstellung aus einer Sicherung der sichere Weg, kein Reparaturversuch.
mysql -e "CHECK TABLE shop.orders"
sudo tail -100 /var/log/mysql/error.log
Wenn der Server deswegen nicht startet
# my.cnf - TEMPORARY, to get the data out
innodb_force_recovery = 1
- Bei 1 anfangen und nur erhöhen, wenn er nicht startet — Stufen über 4 können Daten zerstören.
- Alles dumpen, sobald er läuft —
mysqldump --all-databases > rescue.sql - Die Einstellung entfernen, das Datenverzeichnis neu aufbauen — und den Dump importieren.
Über innodb_force_recovery = 3 läuft die Engine in einem eingeschränkten Modus, in dem Schreibvorgänge die Lage verschlimmern können. Holen Sie den Dump und verschwinden Sie; betreiben Sie darauf keine Website.
Dann die Ursache finden
sudo dmesg -T | grep -iE 'i/o error|ata|nvme'
df -h
sudo smartctl -H /dev/sda
Und weg von MyISAM konvertieren
SELECT table_name, engine FROM information_schema.tables
WHERE table_schema = 'shop' AND engine <> 'InnoDB';
ALTER TABLE shop.sessions ENGINE=InnoDB;
InnoDB hat Absturzwiederherstellung, Sperren auf Zeilenebene und echte Transaktionen. Es gibt keinen guten Grund, eine neue Tabelle als MyISAM anzulegen, und die Umstellung beseitigt diese ganze Problemklasse.
