Una tabella corrotta è quasi sempre un sintomo: un'interruzione di corrente, un disco che si è riempito, o dell'hardware che sta cedendo. Ripari la tabella, poi scopra quale dei tre è stato - altrimenti succede di nuovo la settimana prossima.

MyISAM

mysqlcheck --check --auto-repair --databases shop
# or, for one table
mysql -e "REPAIR TABLE shop.sessions"

MyISAM non ha ripristino dopo un crash, quindi uno spegnimento sporco lascia le tabelle segnate come crashate. REPAIR di solito le sistema in pochi secondi, e può buttare via le righe rovinate.

InnoDB è un'altra cosa

REPAIR TABLE non funziona su InnoDB e lì una corruzione è seria: normalmente il motore si ripristina da solo all'avvio. Se InnoDB segnala corruzione, la strada sicura è il ripristino da un backup, non un tentativo di riparazione.
mysql -e "CHECK TABLE shop.orders"
sudo tail -100 /var/log/mysql/error.log

Se il server per questo non parte

# my.cnf - TEMPORARY, to get the data out
innodb_force_recovery = 1
  1. Parta da 1 e alzi solo se non si avvia — i livelli sopra il 4 possono distruggere dati.
  2. Faccia il dump di tutto appena parte — mysqldump --all-databases > rescue.sql
  3. Tolga l'impostazione, ricostruisca la directory dei dati — e importi il dump.
Sopra innodb_force_recovery = 3 il motore gira in una modalità ridotta in cui le scritture possono peggiorare le cose. Prenda il dump ed esca; non ci faccia girare sopra un sito.

Poi trovi la causa

sudo dmesg -T | grep -iE 'i/o error|ata|nvme'
df -h
sudo smartctl -H /dev/sda

E si allontani da MyISAM

SELECT table_name, engine FROM information_schema.tables
 WHERE table_schema = 'shop' AND engine <> 'InnoDB';

ALTER TABLE shop.sessions ENGINE=InnoDB;
InnoDB ha il ripristino dopo un crash, il blocco a livello di riga e transazioni vere. Non c'è nessun buon motivo perché una tabella nuova sia MyISAM, e convertire elimina tutta questa famiglia di problemi.