¿Es posible recuperar bases de datos MongoDB de .ns y .0, .1,. ... archivos?

14

Tengo una instalación de MongoDB 2.0.4 en Ubuntu 12.10. Recientemente tuve algunos problemas para conectarme a la base de datos desde afuera, y descubrí que había algo que impedía que MongoDB comenzara correctamente. Como se sugiere en varias fuentes (ver StackOverflow), eliminé /var/lib/mongodb/mongodb.locky ejecuté mongod --repair. Esto no resolvió el problema, MongoDB no se ejecutó y siguió creando archivos de bloqueo que no se ocupó de eliminar después. Al mirar los registros, me di cuenta de que no tenía acceso a alguna carpeta llamada $tmpSomething, así que (dado que el nombre sugería una carpeta temporal) la eliminé, y luego todo funcionó ... excepto el hecho de que solo tengo una de mis bases de datos anteriores a la vista, mientras que las otras todavía están allí porque mi /var/lib/mongodb/carpeta todavía está llena de.ns .0 .1 .narchivos que pesan mucho. ¿Hay alguna manera de restaurarlos en la base de datos? (He intentado con mongorestore, pero como esperaba, no maneja esos archivos).

Gracias

Tunnuz
fuente

Respuestas:

19

Los .ns .0 .1archivos etc. son los propios archivos de datos. Si comenzó una mongodinstancia con un --dbpathargumento apuntando a esa carpeta, o si movió el contenido a otro lugar y usó la opción para apuntar allí, mongod intentará leerlos de manera normal.

Dado que sus problemas sugieren corrupción y / o algún otro problema al comenzar mongod(realmente debería publicar los archivos de registro de mensajes de inicio, tal vez en una pregunta separada para abordar ese problema), entonces hay alternativas. Como referencia, los problemas más comunes están relacionados con los permisos, especialmente cuando las personas intentan iniciar mongod manualmente (como ellos mismos) o con sudo (como root) y crear permisos problemáticos en los distintos directorios.

Tiene razón mongorestore, no puede usar estos archivos de datos directamente, pero mongodumppuede leerlos y volcar datos de ellos en los archivos BSON que mongorestoreespera.

La opción que desea aquí es dbpath . Mencionas que tu camino es /var/lib/mongo, así que puedes ejecutar algo como esto:

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

Opcionalmente, puede usar --repairaquí también para corregir la corrupción junto con las opciones de consulta en circunstancias extremas para evitar secciones corruptas (rara vez, si es que alguna vez es necesario). Las diversas opciones se describen en la mongodumppágina:

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

Una vez que descargue los archivos, puede usarlos mongorestorepara volver a importarlos en otra mongodinstancia.

Adam C
fuente
55
Mongodump 3.0+ ya no tiene la bandera --dbpath .
doub1ejack
2
Con Mongo 3.0, una opción es iniciar el servidor mongo con archivos específicos: mongod --dbpath ./y luego continuar con el mongodump sin el--dbpath
Shwaydogg
3
Solo una nota, si está ejecutando Mongo 3.0 y mongod --dbpath ./no le da la base de datos en los .ns .0archivos, podría ser que el motor de almacenamiento esté predeterminado en el nuevo motor WiredTiger en lugar del viejo motor MMapV1. Intente mongod --storageEngine mmapv1 --dbpath ./conectarse utilizando el viejo motor.
flamebaud
1
¿Alguien puede ayudarme a migrar los datos de .ns, .0 y .1 archivos a mongo 3.0
Mandeep Singh
1
Como dijo @flamebaud, el motor predeterminado ha cambiado. Verifique el Cambio predeterminado del motor de almacenamiento en la documentación de Mongo. También es posible que desee echar un vistazo al comienzo del documento en WiredTiger Storage Engine
Ludovic Kuty el