web-dev-qa-db-fra.com

Comment éviter les réparations avec Keycache?

J'ai eu quelques expériences avec l'optimisation du fichier my.cnf mais ma base de données contient environ 4 millions d'enregistrements (MyISAM). J'essaie de restaurer à partir d'un mysqldump mais chaque fois que je le fais, j'obtiens finalement le redoutable "Repair With Keycache", cela peut prendre des jours. Y a-t-il un moyen de dépasser cela et de le laisser passer comme "Réparation par tri"?

J'ai 2 Go de RAM, deux cœurs, beaucoup d'espace disque supplémentaire.

Snip sur my.cnf:

set-variable = max_connections=650
set-variable = key_buffer=256M
set-variable = myisam_sort_buffer_size=64M
set-variable = join_buffer=1M
set-variable = record_buffer=1M
set-variable = sort_buffer_size=2M
set-variable = read_buffer_size=2M
set-variable = query_cache_size=32M
set-variable = table_cache=1024
set-variable = thread_cache_size=256
set-variable = wait_timeout=7200
set-variable = connect_timeout=10
set-variable = max_allowed_packet=16M
set-variable = max_connect_errors=10
set-variable = thread_concurrency=8
31
dvancouver

"Réparer par tri" utilise la routine filesort, qui crée plusieurs fichiers temporaires (généralement) dans votre répertoire tmpdir.

Si votre tmpdir ne dispose pas de suffisamment d'espace pour eux, il repasse à "Réparer par keycache". Ceci est extrêmement mauvais car il est beaucoup plus lent et crée des index moins optimaux.

Il y a d'autres conditions mais je ne les ai pas identifiées.

Déterminer la taille de tmpdir dont vous avez besoin pour filesort () n’est pas trivial; les données de format stockées dans le tampon de port de fichiers n’est pas la même chose que les fichiers MYD, elle utilise généralement beaucoup plus d’espace.

Donc, si votre tmpdir pointe sur un petit/tmp (ou tmpfs), vous voudrez peut-être le changer pour un plus grand/var/tmp - si cela existe.

34
MarkR

MySQL utilisera repair by keycache pour les tables MyISAM lorsque la taille maximale possible des index des tables est supérieure à la valeur de la variable myisam_max_sort_file_size. 

Vous pouvez calculer la taille maximale de l'index en additionnant les valeurs de taille en octets de toutes les clés de tous les index et en les multipliant par le nombre de lignes de votre table. 

Augmentez myisam_max_sort_file_size et votre index sera recréé à l'aide du tri sur disque, plutôt que de la méthode lente keycache.

15
Marc Gear

J'ai accidentellement fait tourner rapidement une table de réparation sur une nouvelle base de données que je n'avais pas configurée pour être rapide. myisam_max_sort_file_size qui était beaucoup trop petit par rapport au fichier .MID (qui est de taille 88279393280, environ 88 Go). Le fichier de données est de 85 Go. La table contient 1,2 milliard d’enregistrements, composés d’un identifiant, de deux dates, d’un petit texte, de quelques bigints et d’un double. Mon serveur (linux virtuel de 2 Go fonctionnant dans une boîte sous Windows7) ne possède qu'un seul noyau sur les 4 du serveur Windows, mais il exécute 3+ GHZ. Je craignais que cet événement de "réparation par keycache" prenne une éternité - des histoires d'horreur avec des tables beaucoup plus petites.

Heureusement, "seulement" prenait 1 jour, 10 heures et 20,72 secondes pour terminer l'opération rapide du tableau de réparation.

Ce qui me manque le plus, c’est un moyen de savoir à quel point mysql est utilisé et combien de temps il sera peut-être terminé. Ceci m'est toujours inconnu.

J'ai maintenant changé mon fichier my.ini et vérifié à nouveau avec df que je dispose de suffisamment d'espace disque pour ces fichiers temporaires volumineux.

Quoi qu'il en soit .. mon point principal, qui pourrait être une connaissance très utile pour le prochain gars qui tombe dans ce piège .. est en fait ... ne paniquez pas! cela peut être lent, mais il est possible sur un matériel plutôt sous-pair d'obtenir plus d'un milliard d'enregistrements triés en un jour ou deux. Vous avez trois index, un sur un champ de date, un sur un champ bigint et un primaire sur le champ ID.

J'aurais posté cela comme un commentaire sur l'une des solutions, mais je n'arrive pas à comprendre comment faire cela, avec l'interface utilisateur ici, alors je vais le déposer comme solution. Ne me donnez pas de vote, c'est juste une note que j'aurais bien aimé avoir ici. J'allais presque tuer mon fil de discussion "Sort by Keycache", car je pensais que cela pourrait prendre une semaine ou plus. 2 jours par milliard d'enregistrements est gérable.

Edit: Et maintenant, une table de réparation sur la même base de données, mais avec un paramètre assez grand pour mysiam_max_sort_file_size, a pris 10 heures, 20 minutes avec réparation par tri. La plus grande partie de l’espace disque utilisé était d’environ 250 Go, mais j’avais placé myisam_max_sort_file_size beaucoup plus haut, ce qui reflétait l’espace disque réellement disponible sur le serveur.

Suivre les progrès est difficile. L'espace disque a augmenté et diminué pendant la construction des index individuels, mais il y a eu des pauses d'une heure pendant lesquelles aucun changement n'a été apporté. utilisation de l'espace disque (tel que rapporté par df).

9
Dennis Fantoni

Merci Mark, Oui, c’est exactement ce que j’ai essayé et j’ai constaté dans les journaux que c’est la raison pour laquelle il est passé à "Réparation avec keycache", était une erreur d’espace.

C’est ce que j’ai fait pour mettre ma solution en place car je n’expliquerai pas le fait qu’elle indiquait /tmp/mysqltmp/, qui ne comptait qu’un maximum de 2 Mo.

Alors j'ai fait ceci:

mkdir /home/mysqltmp

chown mysql:mysql /home/mysqltmp

a changé mon répertoire tmp dans my.conf en tmpdir=/home/mysqltmp/

Maintenant, si j'utilise df -h /home/mysqltmp, ce que je vois est que dir a 285 Go disponibles, ce qui était vraiment agréable à voir, il y avait beaucoup d'espace libre, et je pouvais voir que MySQL manquait facilement de 20 Go. Donc, ce qui me prenait 12 heures auparavant est terminé en 20 minutes, soit plus de 3 millions d'insertions d'index.

5
dvancouver

Aucune des solutions ici ne fonctionnait pour moi: peu importe combien j'ai augmenté la variable myisam_sort_buffer_size ou l'endroit où j'ai fait pointer la variable tmpdir à, la table était toujours réparée avec keycache.

Ce qui a fonctionné a été d’utiliser l’utilitaire de ligne de commande myisamchk:

myisamchk --sort-recover --sort_buffer_size=14G /path/to/table

où:

  • /path/to/table est le chemin du fichier de base de données sans son extension (donc, sans le .MYI à la fin). Il se trouve par défaut dans le répertoire /var/lib/mysql/your_database.

  • Modifiez la taille de la mémoire tampon de 14G à l’espace libre dont vous disposez.

En prime, il affiche également les progrès en cours au fur et à mesure du brassage des données.

0
Jealie

Selon le manuel de référence de MySQL, l'espace disque doit être disponible " dans le système de fichiers contenant le répertoire où se trouve le fichier d'index d'origine " ( http://dev.mysql.com/doc/refman /5.5/fr/server-system-variables.html#sysvar_myisam_max_sort_file_size ) - ceci s'applique à (au moins) v5.0 et versions ultérieures. Ceci contredit certaines des réponses ci-dessus, qui prétendent qu'une augmentation de l'espace disque pour le répertoire tmp aiderait.

Je peux confirmer le comportement décrit dans le Manuel de référence: un espace disque temporaire est utilisé lorsque les fichiers de données (*.MYD) et d'index (*.MYI) de la table sont stockés, mais pas dans la variable tmpdir.

0
twonkeys