Est-il possible de récupérer des bases de données MongoDB à partir de .ns et .0, .1,. … des dossiers?

14

J'ai une installation de MongoDB 2.0.4 sur Ubuntu 12.10. Récemment, j'ai eu des problèmes de connexion à la base de données de l'extérieur et j'ai compris qu'il y avait quelque chose qui empêchait MongoDB de démarrer correctement. Comme suggéré sur plusieurs sources (voir StackOverflow), j'ai supprimé /var/lib/mongodb/mongodb.locket exécuté mongod --repair. Cela n'a pas résolu le problème, MongoDB ne s'exécutait pas et continuait à créer des fichiers de verrouillage qu'il ne s'occupait pas de supprimer par la suite. En regardant les journaux, j'ai réalisé qu'il n'avait pas accès à un dossier appelé $tmpSomething, donc (puisque le nom suggérait un dossier temporaire) je l'ai supprimé, et ensuite tout a fonctionné ... sauf le fait que je n'en ai qu'un de mes bases de données précédentes en vue, tandis que les autres sont toujours là car mon /var/lib/mongodb/dossier est toujours plein de.ns .0 .1 .ndes fichiers qui pèsent beaucoup. Existe-t-il un moyen de les restaurer dans la base de données? (J'ai essayé avec mongorestore, mais comme je m'y attendais, il ne gère pas ces fichiers).

Merci

tunnuz
la source

Réponses:

19

Les .ns .0 .1fichiers etc. sont les fichiers de données eux-mêmes. Si vous avez démarré une mongodinstance avec un --dbpathargument pointant vers ce dossier, ou si vous avez déplacé le contenu ailleurs et utilisé l'option pour pointer vers ce dossier, mongod tentera de les lire normalement.

Étant donné que vos problèmes suggèrent une corruption et / ou un autre problème de démarrage mongod(vous devriez vraiment publier les fichiers journaux des messages de démarrage, peut-être dans une question distincte pour résoudre ce problème), il existe des alternatives. Pour référence, les problèmes les plus courants sont liés aux autorisations, en particulier lorsque les gens essaient de démarrer mongod manuellement (comme eux-mêmes) ou avec sudo (en tant que root) et de créer des autorisations problématiques dans les différents répertoires.

Vous avez raison, mongorestorevous ne pouvez pas utiliser ces fichiers de données directement, mais vous mongodumppouvez les lire et en transférer les données dans les fichiers BSON mongorestoreattendus.

L'option que vous voulez ici est dbpath . Vous mentionnez que votre chemin est /var/lib/mongo, vous pouvez donc exécuter quelque chose comme ceci:

mongodump --dbpath /var/lib/mongo -d <database name> -o /path/to/put/files

En option, vous pouvez également utiliser --repairici pour corriger la corruption ainsi que les options de requête dans des circonstances extrêmes pour contourner les sections corrompues (rarement, voire jamais, nécessaires). Les différentes options sont décrites sur la mongodumppage:

http://docs.mongodb.org/manual/reference/mongodump/

Une fois les fichiers vidés, vous pouvez les utiliser mongorestorepour les réimporter dans une autre mongodinstance.

Adam C
la source
5
Mongodump 3.0+ n'a plus l'indicateur --dbpath .
doub1ejack
2
Avec Mongo 3.0, une option est de démarrer le serveur mongo avec les fichiers spécifiés: mongod --dbpath ./puis de poursuivre le mongodump sans le--dbpath
Shwaydogg
3
Juste une note, si vous exécutez Mongo 3.0 et mongod --dbpath ./ne vous donne pas la base de données dans les .ns .0fichiers, il se peut que le moteur de stockage utilise par défaut le nouveau moteur WiredTiger au lieu de l'ancien moteur MMapV1. Essayez mongod --storageEngine mmapv1 --dbpath ./plutôt de vous connecter en utilisant l'ancien moteur.
flamebaud
1
Quelqu'un peut-il m'aider à migrer les données des fichiers .ns, .0 et .1 vers mongo 3.0
Mandeep Singh
1
Comme l'a dit @flamebaud, le moteur par défaut a changé. Veuillez vérifier la modification du moteur de stockage par défaut dans la documentation Mongo. Vous pouvez également consulter le début du document sur WiredTiger Storage Engine
Ludovic Kuty