L'istruzione CHECK TABLE

Ultima revisione a cura di Sante Caserio, 27 Gennaio, 2010 00:25

L’istruzione CHECK TABLE serve a verificare l’integrità di una tabella, controllando che il file dei dati e il file degli indici non siano corrotti. Se lo sono, MySQL tenterà di correggere automaticamente il problema; se non vi riesce, è possibile tentare di correggere il problema con l’istruzione REPAIR TABLE o con altri strumenti.
Vedi: http://mysqlitalia.com/wiki/L’istruzione_REPAIR_TABLE

Gli Storage Engine che supportano CHECK TABLE sono MyISAM, Maria, InnoDB, XtraDB, PBXT, 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. Se eseguito su una tabella PBXT, CHECK TABLE scrive nei log alcune informazioni aggiuntive sulla tabella.

CHECK TABLE funziona anche sulle tabelle partizionate, tuttavia è possibile verificare lo stato di salute delle singole partizioni tramite ALTER TABLECHECK PARTITION.

CHECK TABLE può anche essere eseguito su una vista. E’ in grado di rilevare alcuni problemi nella definizione, che poi dovranno essere corretti manualmente.

L’unico privilegio richiesto è quello di SELECT sulla tabella che si desidera controllare.

Sintassi

La sintassi è la seguente:

1 CHECK TABLE nome_tabella [ QUICK | FAST | CHANGED | MEDIUM | EXTENDED ]

nome_tabella è il nome della tabella che si desidera controllare; può anche essere un elenco di tabelle separate da virgola, nel qual caso ognuna delle tabelle verrà verificata con una sola istruzione. Esempio:

1 CHECK TABLE utenti, permessi, log_accessi CHANGED;

Le opzioni QUICK, FAST, CHANGED, MEDIUM ed EXTENDED specificano che tipo di verifiche dovrà essere eseguito. Si va da verifiche molto rapide (QUICK) a verifiche molto approfondite, che però su tabelle di grosse dimensioni potrebbero risultare lente (EXTENDED). Non è possibile specificare modalità diverse per tabelle diverse all’interno di un’unica istruzione.

Esiste anche CHECK TABLEFOR UPGRADE, che serve per verificare se una tabella che è stata creata con una versione più vecchia di MySQL è compatibile con la versione attualmente in uso. Poiché il suo scopo è differente, questa istruzione non verrà trattata in questa pagina.

Le opzioni

Non tutti gli SE tengono conto delle opzioni; ad esempio MyISAM e Maria ne tengono conto, ma InnoDB le ignora.

Le tabelle MyISAM e Maria con formato DYNAMIC supportano le opzioni QUICK, MEDIUM ed EXTENDED, mentre se il formato è FIXED le opzioni disponibili sono CHANGED, MEDIUM e FAST. L’opzione predefinita (che verrà utilizzata anche se si cerca di usarne una non valida) è MEDIUM.

  • CHANGED controlla solo le tabelle che sono state modificate dall’ultimo CHECK TABLE o che non sono state chiuse correttamente a causa di un bug o di un crash del server.
  • QUICK non controlla i collegamenti.
  • FAST controlla solo le tabelle che non sono state chiuse correttamente. L’uso di questa modalità è consigliato all’interno di script eseguiti a intervalli di tempo regolari.
  • MEDIUM controlla che i collegamenti eliminati siano validi; inoltre esegue un checksum delle righe e degli indici, per poi compararli.
  • EXTENDED compara interamente i record e i rispettivi indici per controllare che corrispondano. Questa opzione può risultare molto lenta e dovrebbe essere usata solo quando si sospetta che una tabella è corrotta ma con le altre modalità non è stato possibile individuare il problema.

L’output

L’output di CHECK TABLE è un recordset simile a quello restituito da altre istruzioni amministrative (REPAIR, ANALYZE…).

Le colonne restituite sono le seguenti:

  • Table è il nome della tabella a cui si riferisce il record; utile quando si analizzano più tabelle con una sola istruzione.
  • Op è l’operazione eseguita e il valore è sempre check.
  • 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 CHECK TABLE potrebbe essere restituito più di un messaggio.

L’ultimo record è di tipo status e dovrebbe avere come valore OK oppure The table is already up to date. Il primo significa che la tabella è stata controllata e non sono stati riscontrati errori. Il secondo indica che dall’ultima esecuzione di CHECK TABLE o ANALYZE TABLE la tabella non ha subito alcuna modifica, perciò non è stata controllata (o, più in generale, significa che lo SE non ha ritenuto necessario controllare la tabella). 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.

I messaggi di tipo info, warning ed error (in ordine crescente di gravità) rappresentano problemi in una tabella o in una vista.