SQLSTATE[HY000] [1040] Too many connections

Bonsoir à tous,
Ce matin impossible de me connecter à ma Jeedom. J’avais le message SQLSTATE[HY000] [1040] Too many connections
J’ai été obligé de redémarrer mon raspberry Pi3b+ via SSH.

J’ai un disque dur SSD avec une alimentation propre.

Comment pourrais-je savoir ce qu’il s’est passé ?
Quel log regarder ?

J’ai trouvé cela dans le log des scénarios:

PHP Warning:  Invalid argument supplied for foreach() in /var/www/html/plugins/netatmoWeather/core/class/netatmoWeather.class.php on line 171
PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1040] Too many connections in /var/www/html/core/class/DB.class.php:40
Stack trace:
#0 /var/www/html/core/class/DB.class.php(40): PDO->__construct('mysql:host=loca...', 'jeedom', 'XXXXXXXXXXXXX', Array)
#1 /var/www/html/core/class/DB.class.php(50): DB::initConnection()
#2 /var/www/html/core/class/DB.class.php(82): DB::getConnection()
#3 /var/www/html/core/class/config.class.php(187): DB::Prepare('SELECT `key`,`v...', Array, 1)
#4 /var/www/html/core/class/translate.class.php(34): config::byKeys(Array)
#5 /var/www/html/core/class/translate.class.php(151): translate::getConfig('language', 'fr_FR')
#6 /var/www/html/core/class/translate.class.php(75): translate::getLanguage()
#7 /var/www/html/core/class/translate.class.php(54): translate::exec('{{Chauffage}}', '/var/www/html/c...', false)
#8 /var/www/html/core/class/translate.class.php(165): translate::sentence('Chauffage', '/var/www/html/c...', false)
#9 /var/www/html/core/config/jeedom.config.php(23): __('Chauffage', '/v in /var/www/html/core/class/DB.class.php on line 40
PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1040] Too many connections in /var/www/html/core/class/DB.class.php:40
Stack trace:
#0 /var/www/html/core/class/DB.class.php(40): PDO->__construct('mysql:host=loca...', 'jeedom', 'XXXXXXXXXXXXX', Array)
#1 /var/www/html/core/class/DB.class.php(50): DB::initConnection()
#2 /var/www/html/core/class/DB.class.php(82): DB::getConnection()
#3 /var/www/html/core/class/config.class.php(187): DB::Prepare('SELECT `key`,`v...', Array, 1)
#4 /var/www/html/core/class/translate.class.php(34): config::byKeys(Array)
#5 /var/www/html/core/class/translate.class.php(151): translate::getConfig('language', 'fr_FR')
#6 /var/www/html/core/class/translate.class.php(75): translate::getLanguage()
#7 /var/www/html/core/class/translate.class.php(54): translate::exec('{{Chauffage}}', '/var/www/html/c...', false)
#8 /var/www/html/core/class/translate.class.php(165): translate::sentence('Chauffage', '/var/www/html/c...', false)
#9 /var/www/html/core/config/jeedom.config.php(23): __('Chauffage', '/v in /var/www/html/core/class/DB.class.php on line 40
PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1040] Too many connections in /var/www/html/core/class/DB.class.php:40
Stack trace:
#0 /var/www/html/core/class/DB.class.php(40): PDO->__construct('mysql:host=loca...', 'jeedom', 'XXXXXXXXXXXXX', Array)
#1 /var/www/html/core/class/DB.class.php(50): DB::initConnection()
#2 /var/www/html/core/class/DB.class.php(82): DB::getConnection()
#3 /var/www/html/core/class/config.class.php(187): DB::Prepare('SELECT `key`,`v...', Array, 1)
#4 /var/www/html/core/class/translate.class.php(34): config::byKeys(Array)
#5 /var/www/html/core/class/translate.class.php(151): translate::getConfig('language', 'fr_FR')
#6 /var/www/html/core/class/translate.class.php(75): translate::getLanguage()
#7 /var/www/html/core/class/translate.class.php(54): translate::exec('{{Chauffage}}', '/var/www/html/c...', false)
#8 /var/www/html/core/class/translate.class.php(165): translate::sentence('Chauffage', '/var/www/html/c...', false)
#9 /var/www/html/core/config/jeedom.config.php(23): __('Chauffage', '/v in /var/www/html/core/class/DB.class.php on line 40
PHP Notice:  Undefined index: dashboard_data in /var/www/html/plugins/netatmoWeather/core/class/netatmoWeather.class.php on line 171
PHP Warning:  Invalid argument supplied for foreach() in /var/www/html/plugins/netatmoWeather/core/class/netatmoWeather.class.php on line 171

Merci

Bonsoir,

Une petite recherche pour trouver des amis :

1 « J'aime »

Bonsoir @Bison,
Merci pour ta réponse.
J’ai effectivement mal cherché… C’est pas faute pourtant.
Comment se connecter à la BD en root pour vérifier le nombre de connexion ?

Merci

Se connecter en ssh sur Jeedom puis « mysql -u root -p »
Saisie ensuite le mot de passe qui a été crée lors de l’installation pour la bdd.

Sinon il y a un outil dans Jeedom V4
Roue crantée / Système / Configuration
Dernier icône à droite puis Ouvrir au niveau Administration Base de données

Merci @Bison,
C’est bien par là que j’ai commencé à regarder, mais malheureusement, j’ai une erreur.

Ce sont des guillemets qu’il faut utiliser show... like "...";

Oups, merci.
Je suis passé via SSH et j’ai pu voir que j’étais déjà à 151 connexions max.

C’est la valeur maximale autorisée avant que le moteur MySQL refuse de nouvelles connections. On est tous à 151 sauf pour ceux qui ont bidouillé la conf.

Bonjour,
Puisque tu es en ssh, tu peux tenter de redémarrer le serverur sql ça fermera toutes les connexions:

systemctl restart mysql
1 « J'aime »

Hello,
@Bison, ok :slight_smile:

@pifou, j’ai redémarré Jeedom, du coup c’est mort pour cette commande, mais je la note pour la prochaine fois, si jamais cela m’arrive…

Quelle peut-être l’origine de ses multiples connexions ? Le nombre de scénario ? Le nombre de plugin ? Pourquoi l’outil ne les tue pas les plus vieilles connexions ?

Comment faire pour que cela ne se reproduise pas ?

Mathieu

Oui, nombreux scénarios + plugins + démons + nombre d’utilisateurs aussi ça génère autant de connexions… Jeedom crée des connexions persistantes, donc qui ne sont jamais fermées, c’est sans doute justifié pour des démons qui tournent en permanence, mais pour une interface graphique il serait préférable de fermer la connexion en même temps que la session. Sinon on se retrouve avec plein de connexions ouvertes, mais en veille (sleep ou idle) et impossible d’en ouvrir de nouvelles.

1 « J'aime »

Merci @pifou, je comprends je vais être attentif aux connexions qui effectivement des fois sont nombreuses pour un seul et même utilisateur.

Mathieu

Bonjour

Je suis toujours étonné de voir des setups de BDD avec autant de connexions…
Il y a longtemps que mon mysql/mariaDB tourne avec un réglage de max_connections a 50 !!!
253 equipements, 3107 commandes, 33 plugins,114 scenarios, et de nombreux scripts en bash et SQL
je ne veux pas donner ici un tuto sur le tuning de BDD/mysql mais je pense qu’a un moment il serait intéressant de vraiment regarder l’impact d’une BDD non tuné sur la charge… mais evidement cela dépend aussi de la carte (pi/NUC/PC/Odroid), du CPU et de la mémoire embarquée…
Ma charge moyenne avec un Pi3 1Gb Ram est de 0.4

Pour ceux que ça intéresse il y a cet outil de controle (Bien sûr… toute modification du setup de la BDD et a faire en pleine connaissance de cause… et a vos risques et périls… et apres backup évidemment)

2 « J'aime »

Hello @cybertech,
Je ne souhaite pas m’aventurer là dedans.
Voici ma page santé :

Mathieu

Bonjour,

J’ai eu le même problème ce matin: interface injoignable avec l’erreur « SQLSTATE[HY000] [1040] Too many connections » et donc pas mal de scénarios qui ne se sont pas exécutés cette nuit, mais sans message d’erreur, comme si tout Jeedom était bloqué.

En redémarrant le service mysql, tout est rentré dans l’ordre. J’ai ensuite redémarré mon raspberry pi (vieux reflex d’utilisateur de Windows :wink: ), au cas où.

Je viens de regarder un peu tous mes logs, je ne vois pas ce qui aurait pu causer cela, sachant que je n’ai rien modifié dernièrement dans mes scénarios ou autre. J’ai juste appliqué la dernière mise à jour 4.1.25 du core.

En revanche, je me suis souvenu d’un truc que j’ai voulu faire hier (avant tous mes problèmes de la nuit): j’ai voulu afficher la Timeline…qui moulinait et ne s’est jamais affichée. J’ai donc fermé l’onglet de mon navigateur sans avoir pu la visualiser. Est-ce la Timeline aurait pu partir en vrille et prendre toutes les ressources de mon système dans la soirée et ouvrir trop de connexions sur mysql (sachant que mon max est à 151)?

Hello @PhMJeedom,
En y réfléchissant, je crois que j’ai opéré de la même manière que toi.
J’ai ouvert la Timeline puis refermée.

Mathieu

Bonjour @cybertech,
Je viens de faire un restart de mysql pour voir si ça améliore les choses.
J’ai aussi les mêmes problèmes de connexions, après cela fait plus de 100 jours que mon RPI 3 est branché (sans rien redémarrer).
199 équipements, 1978 commandes, 42 plugins ,130 scénarios.
Je constate que j’ai beaucoup plus de charge par rapport à toi et j’aimerai savoir comment tu fais pour réduire la charge d’utilisation. Est-ce lié à un setup custom de ta BDD ? (J’ai essayé de limité au maximum les crons toutes les minutes pour mettre des events, j’ai gagné un peu). Maintenant je ne sais pas si l’on peut dans un scénario dire à Jeedom de faire un clean des connexions pas utilisé depuis plus de n jours.

Je vais regarder ce soir combien de connexions maxi est autorisé sur ma base (je me souviens plus de ce que j’ai paramétré)

J’envisageais de faire un upgrade matériel du serveur pour baisser la charge et avoir un peu plus de réactivité (ne voyant pas comment optimiser), mais je me dis finalement que j’ai peut être d’autre piste.

Merci pour ton lien (mysql-tuner), je vais regarder cet outil.

Je peux t’envoyer mon fichier de config mysql. Tu pourra tester…

Je veux bien, je pourrais comparer pour voir ce qui change.

Hier soir j’ai vérifié j’ai bien 151 connexions maxi à la base. Comme j’avais redémarré le service le matin, j’étais à 15 connexions actives. Lorsque je recharge la page ça montait à 17 puis ça redescendait à 15.
J’ai du mal à comprendre comment ça peut monter à plus de 150 (une fois de temps en temps [~100 jours]).
Je pense que ça va être très compliqué à identifier.
Dès que j’ai un peu de temps, je vais regarder pour faire un script de contrôle pour identifier les jours /heures ou ça augmente.

Hello,
Ce matin 8h33, erreur « [SQLSTATE[HY000] [1040] Too many connections] », j’ai donc utilisé la commande de @pifou et j’ai pu retrouver l’accès à mon Jeedom.

Hier, j’ai beaucoup manipulé la Timeline, est-ce la raison du problème, je ne sais pas.

Mathieu