Come appare il messaggio
ERROR 1194 (HY000): Table 'wp_options' is marked as crashed and should be repaired
ERROR 145 (HY000): Table './shop/orders' is marked as crashed and should be repairedCause frequenti
- Il server è stato terminato o è andato in crash durante una scrittura: OOM killer, mancanza di corrente, arresto forzato.
- Il disco si è riempito mentre la tabella veniva scritta.
- La tabella usa MyISAM o Aria, che non hanno il ripristino da crash di InnoDB.
- I file della tabella sono stati copiati mentre il server era in esecuzione.
- Disco in avaria o errori del filesystem.
Verifica
- Che engine usa la tabella? (sostituisci db e tabella)
mysql -e "SELECT table_name, engine FROM information_schema.tables WHERE table_schema = 'shop' AND table_name = 'orders'" - Controlla la tabella (lock in lettura mentre gira)
mysqlcheck --check shop orders - C'è spazio libero sul disco dei dati?
df -h /var/lib/mysql - Perché si è fermato il server? Crash o kill nel log
Soluzione
- Prima fai una copia. Se la tabella è ancora leggibile:
mysqldump shop orders > orders.sql. Altrimenti copia i file della tabella con il server fermo. - Ripara:
mysqlcheck --repair shop ordersoppure in SQLREPAIR TABLE shop.orders;. Una riparazione può scartare righe danneggiate, quindi confronta il numero di righe con il backup. - Se non funziona, ferma il server ed esegui
myisamchk(MyISAM) oaria_chk(Aria) sui file. Prima fai una copia dei file. - Ripristina da un backup se la riparazione perde troppo.
- Correggi la causa (memoria, disco, corrente) e valuta la conversione a InnoDB:
ALTER TABLE shop.orders ENGINE=InnoDB;. Provala prima, perché cambia i lock e la dimensione della tabella.
Domande frequenti
Perché solo alcune tabelle si rompono?
Solo le tabelle MyISAM e Aria sono aperte in scrittura in un modo che può rompersi con un crash. InnoDB usa un log per ripristinarsi.
REPAIR TABLE fa perdere dati?
Prova a conservare tutto, ma può scartare righe illeggibili. Per questo prima si fa la copia.