## Introduction

MongoDB est une base de données documentaire puissante, mais ses messages d'erreur peuvent parfois être cryptiques et vous ralentir. Que vous soyez développeur, administrateur de bases de données (DBA) ou ingénieur DevOps, vous avez besoin d'une méthode systématique pour résoudre ces erreurs rapidement et en toute sécurité. Cet article couvre les erreurs MongoDB les plus courantes, explique pourquoi elles surviennent et fournit des correctifs étape par étape avec des exemples pratiques. Vous apprendrez à diagnostiquer les problèmes à l'aide de commandes concrètes, à vérifier vos correctifs et à récupérer si quelque chose tourne mal. À la fin, vous disposerez d'un processus récurrent qui minimise les temps d'arrêt et prévient les problèmes récurrents.

## Inventaire de version et d'environnement

Avant de faire des modifications, vous devez comprendre votre environnement MongoDB. De nombreuses erreurs sont spécifiques à une version ou dépendent de votre topologie. Commencez par enregistrer ces détails clés :

<div class="my-stack-md overflow-x-auto">
<table class="min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Élément</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Commande / Source</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Ce qu&#39;il faut noter</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Version du serveur</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">db.version()</code> dans mongosh</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">par ex., 6.0.12</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Version du pilote</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Consultez la documentation de votre pilote</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">par ex., pilote Node.js 6.3.0</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Topologie</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">rs.status()</code> (replica set) ou <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">sh.status()</code> (cluster shardé)</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Autonome, Jeu de réplicas, Shardé</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Système d&#39;exploitation</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">uname -a</code> (Linux/macOS) ou <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">ver</code> (Windows)</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">par ex., Ubuntu 22.04 LTS</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Emplacement du fichier de configuration</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Cherchez <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">mongod.conf</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Chemin et contenu</td></tr></tbody>
</table>
</div>
Par exemple, si vous rencontrez une connexion refusée (connection refused) , vous devez d'abord vérifier si mongod est en cours d'exécution. Mais connaître votre version et votre topologie aide à éliminer les bogues spécifiques à une version et vous oriente vers la bonne documentation. Enregistrez toujours ces informations avant de dépanner.

## Approche de configuration sécurisée

Lors de la correction d'erreurs, modifiez la configuration par petites étapes réversibles. Sauvegardez votre fichier de configuration actuel et votre base de données avant toute modification. Utilisez des modifications ciblées qui n'affectent que la partie concernée du système. Par exemple, si vous voyez un délai d'attente de connexion, ajustez uniquement le paramètre de délai d'attente, pas toute la pile réseau. Testez d'abord dans un environnement de staging si possible.

Étapes de sauvegarde :

- Copiez le fichier de configuration :

cp /etc/mongod.conf /etc/mongod.conf.bak 

- Sauvegardez la base de données : utilisez mongodump pour la base de données concernée.

 Exemple de modification ciblée :

Si vous voyez Failed to connect to 127.0.0.1:27017 - connect ECONNREFUSED , vérifiez d'abord si mongod est en cours d'exécution. S'il l'est, le port pourrait être bloqué. Vous pourriez modifier net.port dans le fichier de configuration, mais seulement après avoir confirmé que le nouveau port est libre (par ex., avec netstat -tulpn | grep <nouveauport> ). Ainsi, vous évitez les effets secondaires involontaires.

## Vérification et diagnostics

Après avoir appliqué un correctif, vérifiez qu'il a réellement résolu le problème. Utilisez des outils comme mongostat , mongotop ou db.serverStatus() pour surveiller la santé et les performances. Pour les erreurs spécifiques, exécutez la requête ou la commande qui a échoué et confirmez qu'elle réussit maintenant. Surveillez les journaux pour détecter de nouvelles erreurs. Documentez les résultats attendus afin de pouvoir les comparer aux résultats réels.

<div class="my-stack-md overflow-x-auto">
<table class="min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Commande</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Objectif</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Résultat attendu</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">mongostat --port 27017</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Surveiller les statistiques du serveur</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Aucune entrée dans la colonne <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">error</code></td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">db.serverStatus()</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Vérifier le temps de fonctionnement et les connexions</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">connections.current</code> sous la limite</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">db.collection.find().explain(&quot;executionStats&quot;)</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Vérifier les performances des requêtes</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Pas de <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">COLLSCAN</code> si un index existe</td></tr></tbody>
</table>
</div>
Exemple : Si vous avez corrigé une erreur de clé dupliquée E11000 , exécutez une insertion qui échouait auparavant. Elle devrait réussir. Ensuite, vérifiez les index de la collection avec db.collection.getIndexes() pour confirmer que l'index unique est présent et correct.

## Modes de défaillance et récupération

Chaque correctif comporte un certain risque. Si un changement introduit de nouvelles erreurs, vous devez pouvoir revenir en arrière. Conservez des sauvegardes et sachez comment les restaurer. Par exemple, si vous augmentez maxIncomingConnections et que le serveur manque de mémoire, revenez à l'ancienne valeur et redémarrez. Testez votre procédure de restauration à l'avance pour être prêt.

Modes de défaillance courants :

- Un changement de configuration empêche le démarrage : Vous pourriez obtenir Option non reconnue (Unrecognized option) si la clé de configuration est incorrecte. Restaurez la configuration de sauvegarde et redémarrez.

- La création d'index échoue : Si vous essayez de créer un index unique mais que des doublons existent, cela échoue. Supprimez les doublons ou abandonnez l'index.

- Les changements réseau entraînent des délais d'attente : Si une règle de pare-feu bloque le port MongoDB, annulez le changement de pare-feu.

Étapes de restauration pour un fichier de configuration :

- Arrêtez mongod : sudo systemctl stop mongod

- Restaurez la sauvegarde : cp /etc/mongod.conf.bak /etc/mongod.conf

- Démarrez mongod : sudo systemctl start mongod

Testez toujours les étapes de restauration dans un environnement de staging pour vous assurer qu'elles fonctionnent avant d'en avoir besoin en production.

## Liste de contrôle des opérations

Créez une liste de contrôle pour les problèmes récurrents. Incluez les étapes pour reproduire le problème, les commandes à exécuter, les correctifs courants et les procédures de restauration. Examinez et mettez à jour régulièrement cette liste à mesure que votre environnement évolue. Cela aide les nouveaux membres de l'équipe à apprendre plus rapidement et prévient les erreurs répétées.

<div class="my-stack-md overflow-x-auto">
<table class="min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Étape</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Action</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Notes</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">1</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Vérifier l&#39;état de MongoDB</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">systemctl status mongod</code> ou <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">mongosh --eval &quot;db.runCommand({ping:1})&quot;</code></td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">2</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Consulter les journaux</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">/var/log/mongodb/mongod.log</code></td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">3</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Identifier l&#39;erreur</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Reproduire le problème</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">4</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Appliquer le correctif</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Modifier une chose à la fois</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">5</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Vérifier</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Exécuter à nouveau la commande d&#39;origine</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">6</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Restaurer si nécessaire</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Utiliser les sauvegardes</td></tr></tbody>
</table>
</div>
Exemple de liste de contrôle pour une connexion refusée :

- Ping mongod : db.runCommand({ping:1})

- Vérifier le port : netstat -tulpn | grep 27017

- Corriger la liaison du port : modifier net.bindIp en 0.0.0.0 si nécessaire.

- Redémarrer et vérifier.

## Conclusion

Les erreurs MongoDB sont gérables avec une approche structurée. Enregistrez votre environnement, effectuez des modifications ciblées, vérifiez-les et préparez toujours une procédure de restauration. Avec ce guide pratique, vous pouvez transformer les erreurs courantes en correctifs de routine. Commencez par un type d'erreur, documentez votre processus et développez-le. Vous réduirez les temps d'arrêt, améliorerez la fiabilité et deviendrez plus confiant dans la gestion des problèmes MongoDB.