Mysql Link to database cannot be established

si vous avez cette erreur alors que vous pensiez que tout allait bien, c’est vraisemblablement parce que Mysql a ouvert trop de fichier et n’est pas en mesure de traiter avec tout ça.

Mysql est limité à 1024 fichiers ouverts.

J’ai eu cette erreur que l’on ne voit pas très souvent, puisqu’il survient quand on a un grand nombre de sites web sur un même serveur dédié.

C’est ce qui m’est arrivé récemment lorsque j’ai combiné 3 serveur en un. J’avais 3 serveurs avec disque dur classiques, jusqu’au jour ou je me suis décidé à passer sur un serveur avec disque SSD, et plus de RAM. Pour être plus précis c’est le modèle XC SSD que j’ai pris, un octocoeur à 16 Go de Ram. Pour un prix de 15.99€ HT, soit un peu plus de 19 euros TTC (+ 20 € de frais d’installation). Au passage en résiliant deux serveur à 29 et 10 € j’économise 500 euros sur un an, une belle somme. A une époque j’avais pour presque 100 euros mensuel de serveurs, tous sous exploités, aujourd’hui comme je suis monté en compétence en gestion de serveur Linux, j’ai pris le parti de réduire mes coûts au strict minimum.

En configurant bien son serveur, on peut faire des merveilles. Cependant le chemin est semé d’embûches, la preuve pour que la base Mysql est tombée en rade avec une erreur du type :

ERROR 1018 (HY000): Can’t read dir of ‘.’ (errno: 24)

Vous pouvez voir ce que veut dire l’erreur 24 sous Linux avec la commande :

$ perror 24
OS error code  24:  Too many open files

Avec une trentaine de sites et donc de base de données, les 1024 n’allaient pas suffire !

En moins d’une heure, en cherchant sur le net, je suis arrivé à la solution suivante :

il faut affecter à mysql un plus grand nombre de fichiers ouvert. J’ai fixé pour ma part la valeur à 10240, ce qui est dix fois plus, mais vous pouvez aller jusqu’à 1024000, ce qui est souvent le cas si vous avez beaucoup de mutualisés.

Comment hausser la limite de fichiers ouvrable pour mysql

tout d’abord regardons les limites actuelle de votre système :

$ ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 64127
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 64127
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

 

Si vous voulez connaitre les limites pour un utilisateur particulier :

$ su mysql ulimit -a

Si ça déclenche un erreur du genre argument -a inconnu, vous devez d'abord faire un changement utilisateur
$ su mysql
$ ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 64127
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 64127
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Il faut éditer deux fichiers pour lever les limites.

$ vi /etc/security/limits.conf

mysql hard nofile 1024000
mysql soft nofile 1024000

$ vi /etc/security/limits.d/90-nproc.conf

* soft nofile 1024000
* hard nofile 1024000
* soft nproc 10240
* hard nproc 10240
root soft nproc unlimited


$ vi /etc/my.cnf

[mysqld]
open_files_limit = 1024000

ou

[mysqld_safe]
open_files_limit = 1024000


$ service mysqld restart

Pour vérifier :

$ show global variables like 'open%';

+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| open_files_limit | 102400 |
+------------------+--------+
1 row in set (0.00 sec)

Voilà j’espère que cela aura pu vous aider.

Voici le lien dont je me suis inspiré pour ce tuto :

Plus d’information sur le site officiel de Mysql.

https://duntuk.com/how-raise-ulimit-open-files-and-mysql-openfileslimithttp://i-learnings.blogspot.fr/2012/11/error-1018-hy000-cant-read-dir-of-errno.html

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *