MySQL: Comment vérifier l'intégrité des tables

La commande CHECK TABLE permet de vérifier qu'une table n'est pas détériorée, mais comment tester toutes les tables de la base de donnée?

Le script PHP que nous fournissons permet de le faire, il fonctionne directement sur Wordpress, phpBB et fluxBB et peut être modifié pour d'autres CMS.

Il charge le fichier de configuration du CMS pour obtenir les variables d'accès à la base de données, mais différents CMS utilisent différents noms de variables et donc ces noms doivent être assignés aux noms par défaut du script, pour les CMS autres que Wordpress etc...

Comment le script fonctionne

Le script récupère la liste des tables avec la commande SQL SHOW TABLES:

$hndtable = mysql_query("SHOW TABLES")  

Pour chaque table il applique la commande CHECK TABLE:

$status = mysqli_query($link, "CHECK TABLE `$tname` EXTENDED")

Il récupère les données de résultat et les affiche:

while($messages = mysqli_fetch_assoc($status))
{
   ...
   echo $messages['status'];
   ...
}

L'algorithme complet:

 $flag = true;
while(list($tname) = mysql_fetch_row($hndtable))
{
echo "Checking $tname : ";
$status = mysqli_query($link, "CHECK TABLE `$tname` EXTENDED");
if (!$status || mysqli_num_rows($status) <= 0)
{
echo "Can not get status for table $tname.<br>";
$flag = false;
continue;
}
while($messages = mysqli_fetch_assoc($status))
{
$r = $messages['Msg_text'];
echo $messages['status']." ".$messages['Msg_type']." $r<br>";
if($r != "OK") $flag = false;
}
}

Code qui est complété par les commandes d'accès à la base, que l'on trouvera dans le source à télécharger...

Exception

Certaines tables comme online sur fluxBB produisent la note suivante:

The storage engine for the table doesn't support check

Parce que c'est une table de type MEMORY ou autre raison. Ce n'est pas le fait d'une détérioration de la table.

Télécharger le script

Pour l'utiliser, téléchargez le à la racine du CMS, par exemple dans /forum/ s'il s'agit d'un forum, et taper le nom du fichier dans la barre d'URL du navigateur, exemple:

http://www.example.com/forum/check.php

Supprimez ensuite le script sur le site.