Erreurs MySQL courantes et comment les corriger rapidement
Résolvez rapidement les problèmes MySQL courants : requêtes lentes, interblocages, retard de réplication, avertissements de corruption et diagnostic basé sur les logs.
Erreurs MySQL courantes et comment les corriger rapidement
Les erreurs MySQL nécessitent généralement une première lecture rapide : vérifiez le journal des erreurs, identifiez la requête ou le thread défaillant, et évitez de deviner à partir du seul symptôme de l'application. Comprendre comment diagnostiquer et résoudre rapidement les erreurs courantes—allant des goulots d'étranglement de performance aux pannes de service critiques—est essentiel pour maintenir une haute disponibilité.
Ce guide couvre les défaillances MySQL courantes que vous pouvez trier rapidement : requêtes lentes, interblocages, retard de réplication et avertissements de corruption.
Identification et diagnostic des erreurs MySQL
Avant d'appliquer des correctifs, une identification précise est essentielle. Les principales sources d'informations de diagnostic MySQL sont le journal des erreurs MySQL et le journal des requêtes lentes. Les vérifier en premier est le moyen le plus efficace de localiser la cause racine d'un problème.
Vérification du journal des erreurs MySQL
Le journal des erreurs enregistre les événements critiques du serveur, les informations de démarrage/arrêt et les erreurs graves. Son emplacement varie selon le système d'exploitation et la configuration, mais on le trouve souvent dans le répertoire de données.
Astuce : Utilisez des commandes comme SHOW VARIABLES LIKE 'log_error'; pour trouver le chemin exact si vous n'êtes pas sûr.
Utilisation du journal des requêtes lentes
Si les performances se dégradent sans messages d'erreur explicites, le journal des requêtes lentes est votre prochaine étape. Il capture les requêtes qui dépassent un temps d'exécution prédéfini.
Pour l'activer (s'il n'est pas déjà actif), vous devez définir ces variables dans votre fichier de configuration (my.cnf ou my.ini) et redémarrer le serveur :
[mysqld]
slow_query_log = 1
long_query_time = 2 # Enregistrer les requêtes prenant plus de 2 secondes
slow_query_log_file = /var/log/mysql/mysql-slow.log
Scénarios d'erreur courants et correctifs immédiats
Voici quatre des défis opérationnels les plus fréquents rencontrés dans les environnements MySQL et des mesures concrètes pour les résoudre.
1. Performance des requêtes lentes
Les requêtes lentes sont la cause la plus courante de perte de performance. Elles proviennent souvent d'index manquants, de structures de requêtes inefficaces ou d'une mauvaise conception de base de données.
Diagnostic
Analysez le journal des requêtes lentes. Pour une requête lente spécifique, utilisez la commande EXPLAIN pour voir comment MySQL l'exécute :
EXPLAIN SELECT * FROM large_table WHERE column_a = 'value';
Recherchez type: ALL (scan complet de table) ou un nombre excessif de lignes examinées.
Correctifs rapides
- Ajouter des index manquants : Si
EXPLAINmontre un scan complet sur une colonne fréquemment filtrée, créez un index sur cette colonne :CREATE INDEX idx_column_a ON large_table (column_a); - Réécrire les requêtes : Évitez
SELECT *dans le code de production. Utilisez lesJOINavec parcimonie et assurez-vous que les clausesWHEREutilisent des colonnes indexées. - Analyser les statistiques de table : Parfois, des statistiques obsolètes perturbent l'optimiseur. Exécutez
ANALYZE TABLE table_name;.
2. Interblocages de transactions
Un interblocage se produit lorsque deux transactions ou plus attendent des verrous détenus par l'autre, entraînant une impasse. MySQL (utilisant InnoDB) détecte et résout généralement cela automatiquement en annulant une transaction.
Diagnostic
Vérifiez le journal des erreurs pour les messages faisant référence à LATEST DETECTED DEADLOCK. Vous pouvez également vérifier le statut InnoDB :
SHOW ENGINE INNODB STATUS;
Regardez sous la section TRANSACTIONS pour le graphique détaillé de l'interblocage, qui montre quelles transactions étaient impliquées et quelles instructions ont causé l'attente.
Correctifs rapides
- Raccourcir les transactions : Gardez les transactions aussi brèves que possible. Validez ou annulez rapidement.
- Ordre d'accès cohérent : Assurez-vous que tout le code d'application accède aux tables et aux lignes dans le même ordre défini. Si la transaction A verrouille la table X puis la table Y, la transaction B doit également verrouiller X puis Y.
- Utiliser le verrouillage au niveau des lignes : Assurez-vous d'utiliser des clauses
WHEREappropriées dans les instructionsUPDATEetDELETEafin qu'InnoDB puisse verrouiller uniquement les lignes nécessaires, et non des tables entières (bien qu'InnoDB utilise par défaut le verrouillage au niveau des lignes pour les tables transactionnelles).
3. Retard ou échec de réplication
Dans les configurations source-réplica, le retard de réplication se produit lorsque le réplica prend du retard sur la source, entraînant des lectures obsolètes. Les anciennes commandes et champs MySQL utilisent encore la terminologie master et slave, vous pouvez donc voir les deux noms en production.
Diagnostic
Vérifiez le statut du réplica en utilisant les threads IO et SQL :
SHOW REPLICA STATUS\G
-- Sur les anciennes versions de MySQL : SHOW SLAVE STATUS\G
Champs clés à examiner :
Replica_IO_RunningouSlave_IO_Running: Doit êtreYes.Replica_SQL_RunningouSlave_SQL_Running: Doit êtreYes.Seconds_Behind_SourceouSeconds_Behind_Master: Indique le retard en secondes. Si cette valeur augmente, le réplica prend du retard.
Correctifs rapides
- Résoudre les erreurs du thread SQL : Si l'applicateur SQL est arrêté, examinez la dernière erreur SQL. Sauter un événement avec
sql_slave_skip_counterou des commandes de réplication plus récentes peut provoquer une dérive des données, donc utilisez-le uniquement après avoir compris la transaction échouée et avoir un plan pour réconcilier les données. - Augmenter les ressources du réplica : Si le retard est constant sous une charge d'écriture élevée, le réplica peut avoir besoin de plus de CPU ou d'un débit d'E/S disque plus rapide pour traiter les événements du journal binaire assez rapidement.
- Resynchroniser : Si le retard est sévère ou si le réplica est cassé, arrêtez la réplication, assurez-vous que le réplica pointe vers la bonne position du journal binaire de la source, et redémarrez.
4. Erreurs de corruption de données
La corruption de données, bien que rare avec les configurations InnoDB modernes, peut se manifester par l'incapacité de démarrer le serveur, des erreurs de somme de contrôle ou des résultats de requête étranges. La corruption indique souvent une défaillance matérielle (disque/mémoire) ou des arrêts inappropriés.
Diagnostic
La corruption est généralement immédiatement apparente via des messages d'échec de démarrage dans le journal des erreurs, faisant souvent référence à des tablespaces ou des pages spécifiques échouant à un test de somme de contrôle.
Correctifs rapides
Exécuter la vérification/réparation de table (MyISAM) : Pour les tables MyISAM, utilisez
CHECK TABLE table_name;suivi deREPAIR TABLE table_name;.Mode de récupération InnoDB : Si InnoDB ne parvient pas à démarrer, vous pouvez le lancer temporairement en mode de récupération pour vider les données :
[mysqld] innodb_force_recovery = 1Démarrez le serveur, videz immédiatement toutes les données critiques en utilisant
mysqldump, arrêtez, supprimez les fichiers de données corrompus, et redémarrez sans le drapeau de récupération.Avertissement :
innodb_force_recoveryne doit jamais être utilisé de manière permanente. Il contourne les vérifications critiques et peut entraîner une dégradation supplémentaire des données si des écritures sont tentées.Restaurer à partir d'une sauvegarde : La solution la plus sûre pour une corruption sévère est de restaurer l'intégralité de la base de données à partir de la dernière sauvegarde connue.
À retenir
Résolvez les problèmes MySQL à partir de preuves, pas de suppositions. Le journal des erreurs, le journal des requêtes lentes, EXPLAIN, le statut InnoDB et le statut de réplication montrent généralement la prochaine étape. Gardez les sauvegardes testées avant de toucher à la récupération de corruption ou aux commandes de saut de réplication.
Bonne pratique : Surveillance proactive
Le correctif le plus rapide est souvent la prévention. Mettez en œuvre des outils de surveillance complets (comme Prometheus/Grafana, Percona Monitoring and Management (PMM), ou les outils du fournisseur cloud) pour surveiller les métriques clés :
- Nombre de connexions et taux de succès du cache de threads.
- Utilisation et taux de succès du pool de tampons InnoDB.
- Retard de réplication (Seconds_Behind_Master).
- Utilisation des E/S disque.
Les alertes basées sur ces métriques vous permettent de traiter les requêtes lentes ou les problèmes de réplication avant qu'ils ne dégénèrent en pannes critiques.