Comment venir à bout du message « Error SQLSTATE[HY000] [2002] No such file or directory »

Décrit la procédure pour supprimer le message d'erreur « Error SQLSTATE[HY000] [2002] No such file or directory ». Elle s'applique ici à un NAS Synology, mais doit pouvoir fonctionner ailleurs.

Mai 31, 2020 - 18:58
Juin 1, 2020 - 14:55
 2  2K
Comment venir à bout du message « Error SQLSTATE[HY000] [2002] No such file or directory »

Je suis tombé sur cette erreur bloquante lorsque j'ai voulu installer Humhub sur mon NAS Synology.
Mais je suppose que la solution que je propose doit pouvoir servir avec de nombreuses applications où le même message d'arreur apparaît.

Dans mon cas, le problème était dû à une différence entre le nom du fichier des sockets utilisé par PHP et celui utilisé par MySQL.

Voici ce que j'ai fait pour résoudre ce problème.
Mais je ne peux évidemment garantir que ce soit la solution pour tout le monde.

Préalables

Les manips ci-dessous supposent que vous avez installé et configuré :

  • DSM Web Station
  • MySQL (MariaDB 10 pour moi)
  • PHP (7.3 pour moi)
  • ... et que vous avez autorisé l'accès SSH.

Même si vous n'êtes pas sur un NAS Synology, lisez la suite, l'explication de l'erreur est peut-être la même pour vous. 

Opérations

  • Se connecter au NAS avec votre outil SSH  en utilisant votre compte administrateur
  • Rechercher le fichier le fichier de configuration MySQL my.cnf avec une commande du type
sudo find / -name "my.cnf" ! -path "/proc/*" ! -path "/volume1/*" ! -path "/sys/*" ! -path "/run/*"​

Normalement, le mot de passe est le même que celui de votre connexion initiale à SSH
Notez que les options ! -path ne sont pas nécessaires, elles permettent juste d'accélerer la recherche en évitant de parcourir des arborescences où il est certain que le fichier ne sera pas présent

  • Sélectionner et copier le nom complet du fichier trouvé 
  • Retrouver le nom du fichier socket utilisé par MySQL à l'aide de la commande
more /usr/local/mariadb10/etc/mysql/my.cnf | grep socket​

Le chemin du fichier my.cnf que j'ai indiqué dans la commande est le mien. Vous devez bien sûr le remplacer par le vôtre, s'il est différent.
Chez moi, cette commande affiche
socket = /run/mysqld/mysqld10.sock

  • Sélectionner et copier le nom complet du fichier
  • Passer sous l'interface web de DSM
  • Choisir Web Station > Paramètres PHP > puis sélectionner PHP x.x (la version de votre choix)
  • Cliquer sur le bouton « Modifier » puis l'onglet « Coeur »
  • Rechercher le paramètre mysqli.default.socket
  • Remplacer la valeur du nom de fichier en collant celle précédemment copiée
  • Faire la même chose avec le paramètre pdo_mysql.default_socket si vous utilisez la bibliothèque PDO
  • Notez que si ce n'est pas sur un NAS Synology que vous obtenez cette erreur, ce sont ces valeurs dans votre fichier php.ini qu'il faut modifier

Petit complément important, si jamais le frawework Yii est utilisé

  • Dans le fichier protected/config/dynamic.php, ne pas oublier d'ajouter « ;unix_socket=/run/mysqld/mysqld10.sock » à la suite du dsn (en mettant en réalité le chemin vers votre socket à vous)
    Sinon les tâches cron ne marcheront pas (j'ai aussi galéré pour comprendre ce point)

Le problème qui vous a amené ici ne devrait plus se produire.
Mais rien ne dit que vous n'en aurez pas d'autres ensuite... ;-)

Georges Je suis un ingénieur informaticien officiellement à la retraite (mais pas complètement). Mon métier a toujours été une passion. C'est pourquoi je ne me contente pas de me retirer chez moi, à faire pousser des tomates et promener mon chien. Et, soyez sûr que ce n'est pas uniquement parce que je n'ai ni potager, ni chien. Quant à mon chat, heureusement, il est capable de se promener tout seul ! J'ai en fait décidé de garder un pied, voire deux, dans l'informatique. Par conséquent, si jamais vous avez besoin de services de conseil, accompagnement, suivi de projet, formation ou développement, contactez-moi ! Nous discuterons alors de vos besoins ainsi que de mon tarif, puis, peut-être tomberons-nous d'accord afin de collaborer ?