Ricerca nel sito web

Come correggere le tabelle danneggiate in MySQL


introduzione

Occasionalmente, le tabelle MySQL possono essere danneggiate, il che significa che si è verificato un errore e i dati contenuti al loro interno sono illeggibili. I tentativi di leggere da una tabella danneggiata di solito portano al crash del server.

Alcune cause comuni di tabelle danneggiate sono:

  • Il server MySQL si arresta nel mezzo di una scrittura.
  • Un programma esterno modifica una tabella che viene simultaneamente modificata dal server.
  • La macchina si è spenta inaspettatamente.
  • L'hardware del computer non funziona.
  • C'è un bug software da qualche parte nel codice MySQL.

Se sospetti che una delle tue tabelle sia stata danneggiata, dovresti eseguire un backup della directory dei dati prima di risolvere i problemi o tentare di riparare la tabella. Ciò contribuirà a ridurre al minimo il rischio di perdita di dati.

Innanzitutto, arresta il servizio MySQL:

  1. sudo systemctl stop mysql

Nota: su alcune piattaforme come Rocky Linux, il servizio MySQL potrebbe invece essere chiamato mysqld.

Quindi copia tutti i tuoi dati in una nuova directory di backup. Sui sistemi Ubuntu, la directory dei dati predefinita è /var/lib/mysql/:

  1. cp -r /var/lib/mysql /var/lib/mysql_bkp

Dopo aver effettuato il backup, sei pronto per iniziare a verificare se la tabella è effettivamente danneggiata. Se la tabella utilizza il motore di archiviazione MyISAM, puoi verificare se è danneggiato riavviando MySQL ed eseguendo un'istruzione CHECK TABLE dal prompt di MySQL:

  1. sudo systemctl start mysql
  1. CHECK TABLE table_name;

Nell'output di questa istruzione verrà visualizzato un messaggio che ti informa se è danneggiato o meno. Se la tabella MyISAM è effettivamente danneggiata, di solito può essere riparata emettendo un'istruzione REPAIR TABLE:

  1. REPAIR TABLE table_name;

Supponendo che la riparazione abbia avuto successo, vedrai un messaggio come questo nel tuo output:

Output
+--------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------------+--------+----------+----------+ | database_name.table_name | repair | status | OK | +--------------------------+--------+----------+----------+

Se la tabella è ancora danneggiata, tuttavia, la documentazione di MySQL suggerisce alcuni metodi alternativi per riparare le tabelle danneggiate.

D'altra parte, se la tabella danneggiata utilizza il motore di archiviazione InnoDB, il processo di riparazione sarà diverso. InnoDB è il motore di archiviazione predefinito in MySQL a partire dalla versione 8.0 e presenta operazioni di controllo e riparazione automatizzate della corruzione. InnoDB verifica la presenza di pagine danneggiate eseguendo checksum su ogni pagina che legge e, se trova una discrepanza di checksum, interromperà automaticamente il server MySQL.

Raramente è necessario riparare le tabelle InnoDB, poiché InnoDB dispone di un meccanismo di ripristino in caso di arresto anomalo che può risolvere la maggior parte dei problemi al riavvio del server. Tuttavia, se incontri una situazione in cui devi ricostruire una tabella InnoDB danneggiata, la documentazione di MySQL consiglia di utilizzare il backup logico della tabella, che manterrà la struttura della tabella e i dati al suo interno, e quindi ricaricare la tabella nel database.

Con questo in mente, prova a riavviare il servizio MySQL per vedere se ciò ti consentirà di accedere al server:

  1. sudo systemctl restart mysql

Se il server rimane bloccato o altrimenti inaccessibile, potrebbe essere utile abilitare l'opzione force_recovery di InnoDB. Puoi farlo modificando il file mysqld.cnf. Sui sistemi Ubuntu e Debian, questo file si trova solitamente in etc/mysql. Sui sistemi Red Hat e Rocky, questo file si trova solitamente in /etc/my.cnf.d.

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Nella sezione [mysqld], aggiungi la seguente riga:

. . .
[mysqld]
. . .
innodb_force_recovery=1

Salva e chiudi il file, quindi prova a riavviare nuovamente il servizio MySQL. Se riesci ad accedere correttamente alla tabella danneggiata, usa l'utilità mysqldump per eseguire il dump dei dati della tabella in un nuovo file. Puoi nominare questo file come preferisci, ma qui lo chiameremo out.sql:

  1. mysqldump database_name table_name > out.sql

Quindi eliminare la tabella dal database. Per evitare di dover riaprire il prompt di MySQL, puoi utilizzare la seguente sintassi:

  1. mysql -u user -p --execute="DROP TABLE database_name.table_name"

Successivamente, ripristina la tabella con il file dump appena creato:

  1. mysql -u user -p < out.sql

Si noti che il motore di archiviazione InnoDB è generalmente più tollerante ai guasti rispetto al vecchio motore MyISAM. Le tabelle che utilizzano InnoDB possono ancora essere danneggiate, ma grazie alle sue funzionalità di ripristino automatico il rischio di danneggiamento delle tabelle e arresti anomali è nettamente inferiore.