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
  1. Bei 1 anfangen und nur erhöhen, wenn er nicht startet — Stufen über 4 können Daten zerstören.
  2. Alles dumpen, sobald er läuft — mysqldump --all-databases > rescue.sql
  3. 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.