Déploiement
Déploiement • Chapitre 13 : Maintenance et dépannage en production

Diagnostic des erreurs de connexion à la base de données

Quand la base de données ne répond plus, toute l'entreprise s'arrête. Apprenez à diagnostiquer avec sang-froid les pannes de processus MySQL/PostgreSQL, les saturations de connexions simultanées et les blocages de requêtes lentes.

🛑
ECONNREFUSED

Le service MySQL/Postgres est éteint ou écoute sur la mauvaise interface réseau.

🔑
Access Denied (1045)

Mot de passe incorrect ou utilisateur non autorisé pour l'hôte source (ex: 'user'@'localhost').

🌊
Too Many Connections (1040)

Le pool de connexions est saturé par des fuites de requêtes non fermées.

🐢
Slow Query Log

Journalisation automatique des requêtes dépassant 1 seconde pour optimiser les index.

mysql-production-troubleshoot.sh
# 1. Vérifier si le service MySQL est actif et en bonne santé
$ sudo systemctl status mysql
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled)
     Active: active (running) since Sat 2026-10-11 10:14:02 UTC

# 2. Si le service est arrêté (inactive/dead) : le redémarrer immédiatement
$ sudo systemctl restart mysql

# 3. Tester la connexion en ligne de commande avec les identifiants de l'API
$ mysql -u learnweb_user -p -h 127.0.0.1 learnweb_prod -e "SELECT 1;"
+---+
| 1 |
+---+
| 1 |
+---+ # ✅ La connexion fonctionne parfaitement !

# 4. Examiner les requêtes actuellement en cours d'exécution dans MySQL
$ mysql -u root -p -e "SHOW FULL PROCESSLIST;"
# Détecte immédiatement une requête bloquée en train de monopoliser 100% du CPU !

Guide Approfondi & Architecture Système

1. Pourquoi l'Erreur « Too many connections » Survient-elle ?

C'est la panne classique du vendredi soir :

Par défaut, MySQL autorise 151 connexions simultanées (max_connections = 151).

Si votre code Node.js crée une nouvelle connexion à chaque requête HTTP (mysql.createConnection()) sans la fermer au lieu d'utiliser un Pool réutilisable (mysql.createPool()), dès la 152e visite, la base rejette tout le monde avec le code ER_CON_COUNT_ERROR !

2. Activer le Journal des Requêtes Lentes (Slow Query Log)

Pour détecter les requêtes destructrices :
  1. Dans /etc/mysql/mysql.conf.d/mysqld.cnf, activez :
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/mysql-slow.log
    long_query_time = 1
  2. MySQL enregistrera toute requête prenant plus de 1 seconde à s'exécuter. Vous découvrirez immédiatement les tables nécessitant l'ajout d'un INDEX !

Tableau de Diagnostic des Pannes de Base de Données

Erreur MySQL / NodeCause Technique RéelleAction Corrective
ECONNREFUSED 127.0.0.1:3306MySQL est arrêté ou n'écoute pas sur ce portsudo systemctl start mysql
ER_ACCESS_DENIED_ERRORMauvais mot de passe ou base inexistanteVérifier le fichier .env et la commande GRANT ALL PRIVILEGES
ER_CON_COUNT_ERROR (1040)Toutes les connexions du serveur sont consomméesPasser à un Pool de connexions et augmenter max_connections dans my.cnf
ETIMEDOUT / Lock wait timeoutUne transaction SQL concurrente bloque la ligne ou tableInspecter SHOW FULL PROCESSLIST et tuer la requête bloquante avec KILL PID