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.
Le service MySQL/Postgres est éteint ou écoute sur la mauvaise interface réseau.
Mot de passe incorrect ou utilisateur non autorisé pour l'hôte source (ex: 'user'@'localhost').
Le pool de connexions est saturé par des fuites de requêtes non fermées.
Journalisation automatique des requêtes dépassant 1 seconde pour optimiser les index.
# 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 ! 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 !
/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
INDEX !| Erreur MySQL / Node | Cause Technique Réelle | Action Corrective |
|---|---|---|
| ECONNREFUSED 127.0.0.1:3306 | MySQL est arrêté ou n'écoute pas sur ce port | sudo systemctl start mysql |
| ER_ACCESS_DENIED_ERROR | Mauvais mot de passe ou base inexistante | Vérifier le fichier .env et la commande GRANT ALL PRIVILEGES |
| ER_CON_COUNT_ERROR (1040) | Toutes les connexions du serveur sont consommées | Passer à un Pool de connexions et augmenter max_connections dans my.cnf |
| ETIMEDOUT / Lock wait timeout | Une transaction SQL concurrente bloque la ligne ou table | Inspecter SHOW FULL PROCESSLIST et tuer la requête bloquante avec KILL PID |