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 TABLEREPAIR 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 TABLEFOR 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.