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
- Parta da 1 e alzi solo se non si avvia — i livelli sopra il 4 possono distruggere dati.
- Faccia il dump di tutto appena parte —
mysqldump --all-databases > rescue.sql - 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.
