L'istruzione REPAIR TABLE
Ultima revisione a cura di Sante Caserio, 30 Gennaio, 2010 08:49
L’istruzione REPAIR TABLE serve a tentare di riparare una tabella il cui file dei dati, o degli indici, è corrotto. Se si ottengono strani errori, è possibile verificare lo stato di salute della tabella tramite l’istruzione CHECK TABLE.
Vedi: http://mysqlitalia.com/wiki/L’istruzione_CHECK_TABLE
Gli Storage Engine che supportano REPAIR TABLE sono MyISAM, Maria, Archive e CSV – quest’ultimo non lo supportava nelle versioni più vecchie. Per gli SE MyISAM e Maria esistono anche dei programmi chiamati myisamchk e mariachk.
REPAIR TABLE funziona anche sulle tabelle partizionate (se non si utilizza l’opzione USE_FRM), tuttavia è possibile tentare la riparazione di una singola partizione tramite ALTER TABLE … REPAIR PARTITION.
Nonostante CHECK TABLE possa essere eseguito su una vista, REPAIR funziona solo sulle tabelle. I problemi relativi alle definizioni delle viste devono essere corretti manualmente.
L’uso di REPAIR TABLE richiede i permessi SELECT e INSERT.
Sintassi
La sintassi è la seguente:
1 REPAIR [ NO_WRITE_TO_BINLOG ] TABLE nome_tabella 2 [ QUICK ] [ EXTENDED ] [ USE_FRM ]
nome_tabella è il nome della tabella che si desidera riparare; può anche essere un elenco di tabelle separate da virgola, nel qual caso ognuna delle tabelle verrà verificata con una sola istruzione. Esempio:
1 REPAIR TABLE utenti, permessi, log_accessi EXTENDED;
Le opzioni
Le opzioni di REPAIR TABLE funzionano su tutti gli Storage Engine che supportano questa istruzione.
Normalmente, quando si esegue REPAIR TABLE, questa istruzione viene scritta nel binlog e replicata sugli eventuali slave. Se non si vuole che ciò avvenga, occorre utilizzare l’opzione NO_WRITE_TO_BINLOG. Lo stesso risultato si può ottenere con il sinonimo LOCAL.
QUICK tenta di riparare soltanto gli indici, escludendo i dati. EXTENDED ricostruisce gli indici riga per riga. Queste due opzioni possono sembrare in contraddizione, ma è possibile utilizzarle insieme.
USE_FRM deve essere usato solo nel caso in cui la riparazione fallisce a causa di un problema nell’intestazione del file degli indici. In questo caso, il server la ignorerà e leggerà le informazioni necessarie nel file di definizione della tabella (.frm). Questo significa che l’ultimo valore AUTO_INCREMENT andrà perso e che i collegamenti ai record cancellati non verranno letti, causando così una perdita di spazio disponibile su disco e frammentando i dati. USE_FRM non deve essere utilizzato sulle tabelle MyISAM / Maria compresse perchè si rovinerebbero, in quanto MySQL non saprebbe che sono appunto compresse.
Nelle vecchie versioni di MySQL, l’uso di REPAIR TABLE con USE_FRM su una tabella creata da una versione di MySQL più vecchia di quella utilizzata poteva rovinare irrimediabilmente i dati. Nelle versioni recenti, il server non tenterà di riparare la tabella e restituirà il messaggio “Failed repairing incompatible .FRM file”. Sempre nelle versioni recenti, se non si utilizza la clausola USE_FRM, MySQL tenta di correggere eventuali problemi di compatibilità con le tabelle create da versioni più vecchie. Si tratta degli stessi problemi che è possibile correggere con CHECK TABLE … FOR UPGRADE.
L’output
L’output di REPAIR TABLE è un recordset simile a quello restituito da altre istruzioni amministrative (CHECK, ANALYZE…).
Le colonne restituite sono le seguenti:
- Table è il nome della tabella a cui si riferisce il record; utile quando si specificano più tabelle in una sola istruzione.
- Op è l’operazione eseguita e il valore è sempre repair.
- Msg_type può avere i seguenti valori: status, info, error, warning; rappresenta il tipo di messaggio.
- Msg_text è un messaggio informativo.
Per ogni tabella coinvolta nella REPAIR TABLE potrebbe essere restituito più di un messaggio.
L’ultimo record è di tipo /status/ e dovrebbe avere come valore OK, che significa che la tabella è stata controllata e non sono stati riscontrati errori. Se non si ottiene un messaggio di questo tipo relativo ad una tabella coinvolta nella CHECK TABLE, significa che è stato rilevato un errore che non è stato possibile correggere automaticamente. In questo caso, per le tabelle MyISAM e Maria, si può provare ad utilizzare i programmi myisamchk e mariachk che, sebbene non supportino un’equivalente di USE_FRM, supportano invece altre opzioni che non hanno corrispondenza in REPAIR TABLE.
I messaggi di tipo info, warning ed error (in ordine crescente di gravità) rappresentano problemi riscontrati nella riparazione di una tabella.
Precauzioni
Prima di eseguire REPAIR TABLE è bene effettuare un backup della tabella danneggiata. Vi è sempre la possibilità che la tabella venga ulteriormente rovinata a causa di errori del filesystem o di MySQL.
Se il server va in crash durante una riparazione, dopo il riavvio è necessario eseguire subito un nuovo REPAIR TABLE sulla tabella corrotta.
REPAIR TABLE, se possibile, dovrebbe essere preferito a myisamchk e mariachk.