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.