Apparence
Uubu.fr

Les systèmes Linux, l’open source, les réseaux, l’interopérabilité, etc.
« Il vaut mieux viser la perfection et la manquer que viser l’imperfection et l’atteindre. » (Bertrand Arthur William RUSSEL)
08 mai 2010

mysql db databases           Bases de données


myisamchk

myisamchk

Maintenance des tables et leur recouvrement

   Utilitaire pour vérifier et réparer les tables MyISAM (les tables avec les fichiers .MYI et MYD). Les même concepts s'appliquent à isamchk pour vérifier et réparer les tables ISAM (les tables avec les fichier .ISM et .ISD. myisamchk permet d'obtenir des informations sur les tables de la base de donnée, pour analyser, réparer ou optimiser ces tables. Bien penser à sauvegarder la base avant réparation d'une table. Les opérations qui affectent des index peuvent causer une recompilation des index FULLTEXT avec des paramètres qui ne sont pas les paramètres courants du serveur. Utiliser mysqlcheck pour les commandes, puisque le serveur se charge de tout alors qu'avec myisamchk, vous devez vous assurer que le serveur ne va pas utiliser les tables en même temps que vous.

syntaxe

shell› myisamchk [options] tbl_name
On peut spécifier plusieurs noms de table. On peut aussi spécifier un nom sous la forme d'un fichier d'index (avec l'option .MIY), qui permettra de spécifier toutes les tables dans un dossier en utilisant le schéma *.MIY. Par exemple
shell› myisamchk /path/to/database/*.MYI
Pour vérifier rapidement toutes les tables
myisamchk --silent --fast /path/to/datadir/*/*.MIY
isamchk --silent /path/to/datadir/*/*.ISM
Pour vérifier toutes les tables et réparer celles qui sont corrompue
myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.MYI
isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.ISM

   L'erreur suivante: myisamchk: warning: 1 clients is using or hasn't closed the table properly

   Signifie que vous essayez de vérifier une table qui a été modifiée par un autre programme (comme le serveur mysqld) qui n'a pas encore refermé le fichier de table, ou que le fichier n'a pas été correctement refermé. Si mysqld fonctionne, vous devez forcer la fermeture correcte des fichiers de tables avec la commande FLUSH TABLES, et vous assurer que personne n'utilise les tables durant vos opérations avec myisamchk.

Options générales de myisamchk

--debug=debug_options, -# debug_options Affiche le log de débogage. La chaîne debug_options vaut souvent : 'd:t:o,filename'.
--silent, -s Mode silencieux. Affiche uniquement les erreurs. Vous pouvez utiliser deux fois -s (-ss) pour que myisamchk soit très silencieux.
--verbose, -v Mode détaillé. Affiche plus d'informations. Vous pouvez combiner ce mode avec les options -d et -e. Utilisez -v plusieurs fois, (-vv, -vvv) pour plus de détails encore.
--version, -V Affiche la version et quitte.
--wait, -w Au lieu de s'arrêter avec une erreur si la table est verrouillé, le programme attend que la table soit libérée avant de continuer. Notez que si vous utilisez mysqld avec l'option --skip-external-locking, la table peut ne peut être verrouillée que par une autre commande myisamchk.

Options de vérifications pour myisamchk

-c, --check Vérifie les erreurs d'une table. Ceci est l'opération par défaut de myisamchk si vous ne lui donnez aucune autre option.
-e, --extend-check Vérifie la table minutieusement (ce qui est un peu lent si vous avez des index). Cette option ne doit être utilisée que pour les cas extrêmes. Normalement, myisamchk ou myisamchk --medium-check devrait, dans la plupart des cas, être capable de trouver s'il y a des erreurs dans la table. Si vous utilisez --extended-check et que vous avez beaucoup de mémoire, vous devez augmenter de beaucoup la valeur de key_buffer_size
-F, --fast Ne vérifie que les tables qui n'ont pas été fermées proprement.
-C, --check-only-changed Ne vérifie que les tables qui ont changé depuis la dernière vérification.
-f, --force Redémarrez myisamchk avec -r (répare) sur la table, si myisamchk trouve une erreur dans la table.
-i, --information Affiche des statistiques à propos de la table vérifiée.
-m, --medium-check Plus rapide que --extended-check, mais ne trouve que 99.99% des erreurs. Devrait, cependant, être bon pour la plupart des cas.
-U, --update-state Enregistre le fichier .MYI lorsque la table à été vérifiée ou a été corrompue. Cela devrait être utilisé pour tirer tous les avantages de l'option --check-only-changed, mais vous ne devez pas utiliser cette option si le serveur mysqld utilise cette table et que vous utilisez mysqld avec --skip-external-locking.
-T, --read-only Ne marque pas la table comme vérifiée. C'est pratique si vous utilisez myisamchk pour vérifier une table issue d'une autre application qui n'utilise pas les verrous. (comme mysqld --skip-external-locking).

Options de réparation de myisamchk

--backup, -B Fait une sauvegarde du fichier .MYD, sous le nom filename-time.BAK
--character-sets-dir=path Dossier qui contient les jeux de caractères.
--correct-checksum Somme de contrôle correcte pour la table.
--data-file-length=#, -D # Taille maximale du fichier de données (lors de la re-création du fichier de données, et qu'il est complet).
--extend-check, -e Essaie de retrouver toutes les lignes possibles du fichier de données. Normalement, cette option va aussi découvrir beaucoup de lignes erronées. N'utilisez pas cette option si vous n'êtes pas totalement désespérés.
--force, -f Écrase les anciens fichiers temporaires (table_name.TMD) au lieu d'annuler.
--keys-used=#, -k # Si vous utilisez les tables ISAM, indique au gestionnaire de table ISAM qu'il doit uniquement modifier les # premiers index. Si vous utilisez le gestionnaire de table MyISAM, cette option indique quelles clés utiliser, et chaque bit binaire représente une clé (la première clé est le bit 0). Cela permet de réaliser des insertions plus rapides. Les index désactivés pourront être réactivés avec l'option myisamchk -r.
--no-symlinks, -l Ne pas suivre les lignes symboliques. Normalement, myisamchk répare les tables qu'un lien symbolique représente.
--parallel-recover, -p Utilise la même technique que -r et -n, mais crée les clés avec des threads différents, en parallèle.
--quick, -q Réparation rapide, sans modifier le fichier de données. Il est possible d'ajouter l'option -q pour forcer myisamchk à modifier le fichier original en cas de clés doublons.
--recover, -r Peut réparer presque tout, sauf les clés uniques qui ne le sont plus (ce qui est extrêmement rare avec les tables ISAM/MyISAM). Si vous voulez restaurer un table, c'est l'option à utiliser en premier. Si myisamchk indique que la table ne peut pas être corrigée avec l'option -r, vous pouvez alors passer à l'option -o. Notez que dans le cas rarissime où -r, le fichier de données est toujours intact. Si vous avez beaucoup de mémoire, vous pouvez augmenter la taille du buffer sort_buffer_size
--safe-recover, -o Utilise une ancienne méthode de restauration (lit toutes les lignes dans l'ordre, et modifie l'arbre d'index conformément pour les lignes trouvées). C'est une méthode qui est beaucoup plus lente que l'option -r, mais elle est capable de traiter certaines situations exceptionnelles que -r ne pourrait pas traiter. Cette méthode utilise aussi moins d'espace disque que -r. Normalement, vous devriez commencer à réparer avec l'option -r, et uniquement sur l'échec de cette option, passer à -o. Si vous avez beaucoup de mémoire, vous devriez augmenter la taille du buffer de clé key_buffer_size
--set-character-set=name Change le jeu de caractères utilisé par l'index.
--sort-recover, -n Force myisamchk à utiliser le tri pour résoudre les clés, même si le fichier temporaire doit être énorme.
--tmpdir=path, -t path Chemin pour stocker les fichiers temporaires. Si cette option n'est pas fournie, myisamchk va utiliser la variable d'environnement TMPDIR pour cela.
--unpack, -u Décompresse des données compressées avec myisampack.

Autres options de myisamchk

-a, --analyze Analyse la distribution des clés. Cela améliore les performances des jointures en permettant à l'optimiseur de jointure de mieux choisir l'ordre d'utilisation des clés. myisamchk --describe --verbose table_name' ou SHOW KEYS dans MySQL.
-d, --description Affiche des informations sur la table.
-A, --set-auto-increment[=value] Force AUTO_INCREMENT à commencer avec une valeur supérieure. Si aucune valeur n'est fournie, la prochaine valeur de la colonne AUTO_INCREMENT sera la plus grande valeur de la colonne +1.
-S, --sort-index Trie les blocs de l'arbre d'index dans l'ordre haut/bas. Cela va optimiser les recherches, et les scans de tables par clés.
-R, --sort-records=# Trie les lignes en fonction de l'index. Cela rassemble vos données, et peut accélérer les lectures de lignes par intervalle avec SELECT et ORDER BY sur cet index (ce tri peut être très lent la première fois). Pour connaître les numéros d'index de tables, utilisez la commande SHOW INDEX, qui affiche les index dans le même ordre que myisamchk ne les voit. Les index sont numérotés à partir de 1.

L'espace mémoire est très important quand on utilise myisamchk
myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
myisamchk utilise des fichiers temporaires dans le dossier TEMPDIR. Lors de la réparation, il va aussi avoir besoin d'espace disque.

Utiliser myisamchk pour restaurer une table

   si mysqld a l'option --skip-external-locking, on ne peut pas utiliser myisamchk pour vérifier une table. Si vous utilisez myisamchk pour réparer ou optimiser les tables, vous devez toujours vous assurer que mysqld n'utilise pas cette table

Vérifier la cohérence d'une table

cette commande trouvera 99,9% des erreurs
myisamchk nom_de_table
cette commande trouvera 99,999% des erreurs
myisamchk -m nom_de_table
cette commande fait une vérification complète et exhaustive de toutes les données
myisamchk -e nom_de_table
idem mais affiche des informations statistiques
myisamchk -e -i nom_de_table

Réparer les tables

On peut réparer les tables MyISAM avec REPAIR TABLE. Les symptômes de corruption de tables sont des requêtes qui s'interrompent inopinément
tbl_name.frm locked against change: tbl_name.frm est verrouillée en écriture
Can't find file tbl_name.MYI (Errcode : ###): Impossible de trouver le fichier tbl_name.MYI (Errcode: ###)
Unexpected end of file: Fin de fichier inattendue
Record file is crashed: Fichier de données crashé
Got error ### from table handler: Reception de l'erreur ### de la part du gestionnaire de table
Pour obtenir plus d'informations sur l'erreur, vous pouvez exécuter la commande perror

Optimisation de table

Pour réorganiser les lignes fragmentées et éliminer l'espace perdu par les effacements et les modifications
shell› myisamchk -r table_name
de la même manière OPTIMIZE TABLE effectue une réparation de la table, et une analyse des index, puis trie l'arbre d'index pour accélérer les recherches de clé.
myisamchk dispose aussi d'un grand nombre d'options à utiliser pour améliorer les performances de la table
-S, --sort-index
-R index_num, --sort-records=index_num
-a, --analyse
Mettre en place un régime d'entretient de MySQL. Vérifier par un cron une fois par semaine
35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI
Défragmentation du fichier, mysqld éteint
shell› myisamchk -r -s --sort-index -O sort_buffer_size=16M */*.MYI
Pour les tables ISAM, la commande est similaire à
shell› isamchk -r -s --sort-index -O sort_buffer_size=16M */*.MYI

Obtenir des informations sur une table

Exécute myisamchk en "mode description" pour produire une description de votre table
myisamchk -d nom_de_table
Pour produire plus d'informations durant l'exécution de myisamchk
myisamchk -d -v nom_de_table
Affiche les informations les plus importantes pour une table
myisamchk -eis nom_de_table
C'est l'équivalent de -eis, mais qui vous indique ce qui se passe
myisamchk -eiv nom_de_table