Può capitare, a seguito di un blocco del server o di uno shutdown irregolare, che accedendo ad un dB MySQL si ottenga l'errore
mysql error: Can't open file: 'file.MYD'. (errno: 145)
mysql error number: 1016
Questo è dovuto a delle inconsistenze all'interno del file. Fortunatamente per noi MySQL ha delle utility per il recupero delle tabelle che possono aiutarci a ripristinare il dB.
mysql error: Can't open file: 'file.MYD'. (errno: 145)
mysql error number: 1016
Questo è dovuto a delle inconsistenze all'interno del file. Fortunatamente per noi MySQL ha delle utility per il recupero delle tabelle che possono aiutarci a ripristinare il dB.
Tale ripristino non è sicuro al 100%, se il file è fisicamente danneggiato o se non ci sono sufficenti informazioni all'interno da poter recuperare, può capitare di avere un recupero parziale delle tabelle, o di non riuscire a recuperare nulla.
Però fare un tentativo non ci costa nulla, male che vada dovremmo eseguire il restore di un backup per riportare in funzione il db, anche se con la perdita dei dati inseriti dopo la creazione del backup.
Andiamo con ordine.
Per prima cosa dal propmt dei comandi dobbiamo entrare dentro al dB in questione.
Se avete nel path la directory bin di mysql vi basterà digitare il seguente comando, altrimenti dovrete andare a cercare il file mysql.exe all'interno di mysql/bin.
lanciamo il prompt di mysql con il comando
mysql -u %DBUSERNAME% -h %DBSERVER% -p %DBNAME%
sostituendo alle variabili i vostri dati:
DBSERVER è il nome del server che contiene il vostro dB
DBUSERNAME è il nome dell'utente che ha diritti amministrativi su quel dB
DBNAME è il nome del dB a cui non riuscite ad accedere
Per esempio:
mysql -u john -h db.johndoe_db -p johndb
A questo punto il sistema vi chiederà la password per l'autenticazione
Enter password:
Una volta inserita otterremo il prompt di MySQL:
mysql>
Come accennavo prima, MySQL mette a disposizione due validi tool per eseguire la manutenzione del dB:
check e repair table
Check table fa un controllo della tabella e ne visualizza eventuali incongruenze, la sintassi del comando è molto semplice:
check table %NOMETABELLA%;
dove %NOMETABELLA% è il nome della tabella o l'insieme delle tabelle separate da un virgola.
L'output del comando sarà simile a quello riportato:
+--------------------------------------+--------+------------+------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------------------------------+--------+------------+------------------------------------------+
| %DBNAME%.%NOMETABELLA[0]% | check | warning | Table is marked as crashed |
| %DBNAME%.%NOMETABELLA[1]% | check | status | OK |
+--------------------------------------+--------+-----------+-------------------------------------------+
A questo punto sappiamo che la tabella %NOMETABELLA[0]% è rovinata e dobbiamo ripristinarla.
Per il ripristino usiamo il comando repair table con la sintassi:
repair table %NOMETABELLA[0]%
Otterremo in risposta una schermata simile a
+--------------------------------------+-------+-----------+-----------+
| Table | Op | Msg_type | Msg_text |
+--------------------------------------+-------+-----------+-----------+
| %DBNAME%.%NOMETABELLA[0]% | check | status | OK |
+--------------------------------------+-------+-----------+-----------+
Ripetendo l'operazioen per tutte le tabelle che risultano danneggiate è possibile ripristinare il dB.
MySQL mette a disposizione altri comandi per la manutenzione dei dB come, ad esempio, MyISAMChk che lavora a dB arrestato, con le tabelle MyISAM, ovvero le tabelle stoccate nei file .MYD e .MYI
MyISAMChk è utile se non conosociamo il nome delle tabelle all'interno del dB e se non abbiamo modo di reperire tale informazione. Con due soli passagi possiamo controllare e correggere tutte le tabelle all'interno dei file MyISAM:
myisamchk --silent --force --fast --update-state \
--key_buffer_size=64M --sort_buffer_size=64M \
--read_buffer_size=1M --write_buffer_size=1M \
/%PATH_FILE_MYI%/*.MYI
isamchk --silent --force --key_buffer_size=64M \
--sort_buffer_size=64M --read_buffer_size=1M --write_buffer_size=1M \
/%PATH_FILE_ISM%/*.ISM
Altro tool di MySQL simile a MyISAMChk è MySQLCheck, che può eseguire un controllo e la correzione sulle tabelle in un unica operazione anche a dB attivo.
Per l'utilizzo di questi due tool fate riferimento al manuale di MySQL per i comandi mysqlcheck e myisamchk