MySQL et too many open files
Par Sébastien Le Ray le samedi 21 novembre 2009, 19:16 - Sysadmin - Lien permanent
Pourquoi qu'il dit "File 'toto.MYD' not found (Errcode: 24) when using LOCK TABLES" ? Elle existe ma table...
Un petit billet concis pour vous présenter la solution à cette erreur qui peut survenir lorsqu'une base contient pas mal de tables et qu'on essaie de la dumper ou tout simplement lorsque l'on tente de verrouiller beaucoup de tables en parallèle.
Comme d'hab, pour savoir à quoi correspond le code d'erreur, il suffit d'utiliser perror :
sebastien@boiboite:~$ perror 24 OS error code 24: Too many open files
Dans le cadre d'un dump, il est possible d'utiliser l'option --single-transaction pour contourner le problème, mais cela ne fournira un dump cohérent que dans le cas où l'on ne dispose que de tables prenant en charge les transactions (InnoDB). Si l'on n'a pas de garantie sur le format des tables ou que les verous ne sont pas posés à l'occasion d'un dump, il est nécessaire d'augmenter la limite du nombre de descripteurs de fichiers disponibles pour MySQL.
Cette limite est définie à deux niveaux, au niveau système ainsi qu'un niveau de MySQL. La limite système contraint celle de mysql (logique). Il faut donc commencer par connaître leurs valeurs. Pour la valeur configurée pour MySQL, il suffit d'afficher la variable open_files_limit :
mysql> show variables like 'open_files_limit'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 1024 | +------------------+-------+ 1 row in set (0.00 sec)
Pour la valeur système :
sebastien@boiboite $ sudo -u mysql -s mysql@boiboite $ ulimit -n 1024
Si le paramètre open_files_limit est inférieur à la limite système, il suffit de l'augmenter en positionnant le paramètre open-file-limit dans un des fichiers de configuration[1] et de retenter l'opération qui échouait précédemment.
Sinon, il faut déjà augmenter la valeur système, pour cela, on édite le fichier /etc/security/limits.conf et on ajoute une ligne du type :
mysql - nofile 4096
Cela autorise l'utilisateur mysql à ouvrir 4096 fichiers en parallèle, contre 1024 par défaut (à vous d'ajuster la valeur selon vos besoins). Vous pouvez ensuite positionner le paramètre open_files_limit dans votre fichier de configuration (cf. ci-dessus).
L'erreur devrait être corrigée.
Notes
[1] Sous Debian, il est conseillé de placer toute la configuration spécifique dans /etc/mysql/conf.d/*.cnf pour faciliter les mises à jour.
Commentaires
Bonjour,
j'ai le même problème actuellement, cependant je n'ai toujours pas trouver le moyen de déterminer la valeur idéal pour le bon fonctionnement de mon serveur mysql. De plus pour un debian, y a t'il des risque a augmetner cette valeur sous debian?
cordialement.
Pour ma part, j'ai des sauvegardes de chaque base toutes les nuits, si la plus grosse base passe, je considère que la valeur est suffisante.
Le nombre total de fichier ouverts à un instant t dépend du nombre de tables verrouillées, du nombre maximum de connexions et du cache de tables. Pour une base de 538 tables, sans connexion ouverte et avec un cache de table par défaut (64) 1024 n'est pas suffisant...