Tengo una base de datos MongoDB que una vez fue grande (>3 GB). Desde entonces, los documentos han sido eliminados y yo estaba esperando el tamaño de los archivos de base de datos para disminuir en consecuencia.

Pero desde MongoDB guarda espacio asignado, los archivos son todavía importantes.

Que he leído aquí y allí que el comando administrador de mongod --repair se utiliza para liberar el espacio, pero no tengo suficiente espacio en el disco para ejecutar este comando.

¿Sabes alguna manera de liberar el espacio no utilizado?

  • Es esta pregunta considera que la respuesta? ¿Necesitamos más datos?
  • comenzando con la versión 2.8, usted puede comprimir los datos, lo que ahorra una gran cantidad de espacio.
  • yo tenía exactamente el mismo desafío, la forma más fácil de resolver para hacer una copia de la base de datos con la copyDatabase() función, luego a la db.dropDatabase() el original de la base de datos y, a continuación, copiar la base de datos de nuevo en su lugar. mi base de datos estaba casi vacía, y cuando hice la copia, sólo el real utilizable datos se copian. dejar caer el original de la base de datos elimina los archivos de gran tamaño. el uso de db.repairDatabase() no era una opción ya que mi servidor ya estaba bajo en el espacio de disco y esta operación habría requerido una gran cantidad de espacio libre, mucho más de lo necesario para esta operación.
InformationsquelleAutor Meuble | 2010-06-03

16 Comentarios

  1. 144

    ACTUALIZACIÓN: con el compact comando y WiredTiger parece que el espacio extra en el disco realmente será lanzado para el sistema operativo.


    ACTUALIZACIÓN: como de v1.9+ hay un compacto comando.

    Este comando va a realizar una compactación de la «en-línea». Todavía tendrá algo más de espacio, pero no tanto.


    MongoDB comprime los archivos por:

    • copiar los archivos a una nueva ubicación
    • bucle a través de los documentos y re-ordenar /re-solución de ellos
    • reemplazando los archivos originales con los nuevos archivos

    Usted puede hacer esto «compresión», mediante la ejecución de mongod --repair o conectando directamente y ejecución de db.repairDatabase().

    En cualquier caso, es necesario el espacio en algún lugar de copiar los archivos. Ahora, no sé por qué usted no tiene suficiente espacio para realizar una compresa, sin embargo, usted tiene algunas opciones si tiene otro equipo con más espacio.

    1. De exportación de la base de datos a otro equipo con Mongo instalado (utilizando mongoexport) y, a continuación, puede Importar que la misma base de datos (usando mongoimport). Esto resultará en una nueva base de datos que está más comprimido. Ahora usted puede detener el original mongod reemplazar con los nuevos archivos de base de datos y ya está bueno para ir.
    2. Detener la actual mongod y copiar los archivos de base de datos a un equipo grande y ejecutar la reparación de dicho equipo. A continuación, puede mover la nueva base de datos de archivos en el equipo original.

    Actualmente no existe una buena manera de compactar «en lugar de» uso de Mongo. Y Mongo sin duda puede chupar un montón de espacio.

    La mejor estrategia ahora para la compactación es ejecutar un Maestro-Esclavo de instalación. Usted puede entonces compacto de los Esclavos, se deja coger y el interruptor de ellos. Sé todavía un poco peludo. Tal vez el Mongo equipo vendrá con mejoras en el lugar de la compactación, pero yo no creo que sea alta en su lista. Espacio en disco es actualmente supone ser barato (y generalmente lo es).

    • Gracias Puertas de VP por tu respuesta. Yo estaba pensando en una de las dos opciones que usted menciona. Pero antes de hacer tales cosas, quería saber si un compacto en lugar de la solución estaba disponible. Gracias de nuevo.
    • A partir de hoy (2010-11-18) Dwight (hablando en el MongoDC evento en Washington, DC) se recomienda replicar / –reparar / cambiar el enfoque si desea compactar sin tomar su base de datos sin conexión.
    • Sólo un heads up ‘no hacer como yo’ y ejecutar –reparación como root. chowns la base de datos de archivos raíz. el departamento de salud.
    • La documentación para ‘compacto’ dice: «Esta operación no va a reducir la cantidad de espacio de disco utilizado en el sistema de archivos.» No entiendo cómo esta es una solución a la pregunta original.
    • Si usted mira la pregunta original, parte del problema de tener demasiado de datos para realizar una reparación. Si usted llena 2/3 de su unidad con una DB, no se podía realizar una reparación. Recién asignado archivos chupan hasta el espacio restante antes de que el nuevo DB fue completamente «copiar & reparar» y «el interruptor» nunca iba a ocurrir. Con compact, se puede al menos mantener los archivos existentes en el lugar. Estoy de acuerdo, no es una solución completa, pero es una mejora incremental.
    • A partir de la documentación para el v3.2.10 y superior: «vuelve a escribir y desfragmenta todos los datos e índices en una colección. En WiredTiger bases de datos, este comando de liberación innecesaria de espacio en disco para el sistema operativo.»
    • En mi base de datos mongodb no es innecesario copiar ficheros de base de datos.. Como si tengo abc db.. no es el archivo, como abc.01 abc.02 y así sucesivamente.. tengo espacio.. ¿cómo puedo eliminar estos archivos

  2. 37

    Tuve el mismo problema, y soluciona simplemente haciendo esto en la línea de comandos:

    mongodump -d databasename
    echo 'db.dropDatabase()' | mongo databasename
    mongorestore dump/databasename
    • afirmación: 15936 la Creación de la colección de db.colección error. Error: excepción: especificar tamaño:<n> cuando capuchón es cierto
    • :Se parece a la de ubuntu regresión… el archivo de volcado de metadatos ha tapado:»no definido» en ella… la eliminación de estos corrige el problema de la importación.
    • Mi base de datos ha anotado casi todo el disco. era de 120 GB (disco de 160 GB) El compact no reducir el tamaño del archivo y repairDatabase no es posible debido a la falta de espacio . Después de mongodump & dropDatabase & mongorestore de db tengo 40 GB de tamaño de base de datos.
    • Pequeña corrección a la orden de restauración mongorestore --db databasename dump/databasename
  3. 31

    Parece Mongo v1.9+ tiene soporte para el pacto en el lugar!

    > db.runCommand( { compact : 'mycollectionname' } )

    Consulte la documentación aquí: http://docs.mongodb.org/manual/reference/command/compact/

    «A diferencia de repairDatabase, el comando compact no requiere el doble de espacio en disco para realizar su trabajo. Se requiere una pequeña cantidad de espacio adicional en el trabajo. Además, el compacto es más rápido.»

    • -1: no reducir el tamaño del archivo
    • repairDatabase comando pactos de todas las colecciones en la base de datos. Es idéntico al ejecutar el comando compact en cada colección de forma individual». docs.mongodb.org/manual/reference/command/repairDatabase/…. Así que si el repairDatabase reduce el tamaño tan compacto. He sido la compactación de mis colecciones con un montón de eliminar y actualizar cada semana. Me gusta compacto más de repariDatabase porque primero está dirigido a las colecciones que quiera no toda la base de datos. Segundo sólo necesita 2 gb de espacio libre en lugar de x2 de tu db tamaño de archivo (en mi caso 500 GB).
    • Por cierto, mira esto:» MongoDB ofrece 2 diferentes maneras para compactar los datos y restaurar el rendimiento óptimo: repairDatabase y compacto. RepairDatabase es adecuado si sus bases de datos son relativamente pequeñas, o usted puede permitirse el lujo de tomar un nodo de rotación para un tiempo bastante largo. Para nuestros tamaños de base de datos y la carga de trabajo de consulta, tenía más sentido para ejecutar continua de la compactación sobre todas nuestras colecciones.» blog.parse.com/2013/03/26/always-be-compacting github.com/ParsePlatform/Ops/blob/master/tools/mongo_compact.rb
    • href=»http://docs.mongodb.org/manual/reference/command/compact/#disk-space» >docs.mongodb.org/manual/reference/command/compact/#disk-space – «a Diferencia de repairDatabase, compacto no espacio libre en el sistema de archivos».
    • Exactamente. Sólo se libera el espacio de modo que se pueda asignar a los nuevos documentos en lugar de obtener más espacio de su sistema. Si su base de datos MongoDB (colecciones) están creciendo el pacto es una buena manera de hacer más espacio para los nuevos documentos.
    • OP quiere liberar espacio no utilizado, que se logra a través de repairDatabase, no compact. compact no liberar espacio, sólo desfragmenta el utilizado hasta el espacio, que no se reduzca.
    • Como de mongo 3.0, compact se recuperar espacio si el uso de la WiredTiger motor de almacenamiento.

  4. 15

    Compacto en todas las colecciones en la base de datos actual

    db.getCollectionNames().forEach(function (collectionName) {
        print('Compacting: ' + collectionName);
        db.runCommand({ compact: collectionName });
    });
  5. 13

    Si usted necesita para ejecutar una reparación completa, utilice el repairpath opción. Punto en un disco con más espacio disponible.

    Por ejemplo, en mi Mac, he utilizado:

    mongod --config /usr/local/etc/mongod.conf --repair --repairpath /Volumes/X/mongo_repair

    Actualización: Por MongoDB Servidor Principal Billete De 4266, usted puede necesitar agregar --nojournal para evitar un error:

    mongod --config /usr/local/etc/mongod.conf --repair --repairpath /Volumes/X/mongo_repair --nojournal
    • Este gran trabajo. Me faltaba el 2x espacio necesario para su reparación en el lugar, así que he montado un servidor NAS. Único problema, tardó 18 horas para completar, pero se hizo el trabajo. Asegúrese de agregar la opción –nojoural bandera.
  6. 7

    Necesitamos resolver de 2 formas, con base en StorageEngine.

    1. MMAP() motor:

    comando: db.repairDatabase()

    NOTA: repairDatabase requiere espacio libre en disco igual al tamaño de su actual conjunto de datos de más de 2 gigabytes. Si el volumen que contiene dbpath carece de espacio suficiente, se puede montar un volumen independiente y el uso que de la reparación. Cuando se monta un volumen independiente para repairDatabase debe ejecutar repairDatabase desde la línea de comandos y el uso de la –repairpath modificador para especificar la carpeta en la que almacenar temporal de reparación de archivos.
    por ejemplo: Imagina DB tamaño es de 120 GB significa, (120*2)+2 = 242 GB de espacio en Disco Duro requerido.

    otra forma de hacer la colección de sabios,
    comando: db.runCommand({compacto: ‘collectionName’})

    2. WiredTiger:
    Su resuelve automáticamente propia.

    • db.repairDatabase() no funciona.
  7. 4

    Ha habido una confusión considerable sobre reclamación de espacio en MongoDB, y algunas recomendaciones de práctica son francamente peligroso en ciertos tipos de implementación. Más detalles a continuación:

    TL;DR repairDatabase intentos para salvar los datos de un MongoDB independiente de las implementaciones que está tratando de recuperarse de un disco de la corrupción. Si se recupera el espacio, es simplemente un efecto secundario. La recuperación de espacio nunca debe ser la principal consideración de la ejecución de repairDatabase.

    Recuperar espacio en un nodo independiente

    WiredTiger: Para un nodo independiente con WiredTiger, la ejecución de compact de la liberación de espacio para el sistema operativo, con una salvedad: El compact comando en WiredTiger en MongoDB 3.0.x se ven afectados por este error: SERVIDOR-21833 que se fija en MongoDB 3.2.3. Antes de esta versión, compact en WiredTiger podría fallar en silencio.

    MMAPv1: Debido a la forma en que MMAPv1 funciona, no hay seguro y apoyado método para recuperar el espacio utilizando el MMAPv1 motor de almacenamiento. compact en MMAPv1 se desfragmenta los archivos de datos, lo que puede hacer más espacio para los nuevos documentos, pero no se libera el espacio para el sistema operativo.

    Que puede ser capaz de ejecutar repairDatabase si usted comprender plenamente las consecuencias de este potencialmente peligrosos de comandos (ver abajo), ya que repairDatabase esencialmente reescribe toda la base de datos descartando documentos dañados. Como efecto secundario, esto va a crear nuevos MMAPv1 archivos de datos sin ningún tipo de fragmentación en ella y la liberación de espacio para el sistema operativo.

    Para los menos aventureros método, la ejecución de mongodump y mongorestore puede ser posible en un MMAPv1 de implementación, sujeto a que el tamaño de su implementación.

    Recuperar espacio en un conjunto de réplicas

    Para el conjunto de réplicas de configuraciones, el mejor y más seguro método para recuperar espacio es para realizar una sincronización inicial, por tanto WiredTiger y MMAPv1.

    Si usted necesita para recuperar el espacio de todos los nodos en el conjunto, puede realizar un balanceo de la sincronización inicial. Es decir, realiza la sincronización inicial en cada uno de los secundarios, antes de que finalmente bajar la primaria y realiza la sincronización inicial sobre ella. Balanceo de la sincronización inicial método es el método más seguro para realizar el conjunto de réplicas de mantenimiento, y también implica ningún tiempo de inactividad como un bono.

    Por favor, tenga en cuenta que la viabilidad de hacer un balanceo de la sincronización inicial depende también del tamaño de su implementación. Por muy grandes despliegues, puede que no sea factible realizar una sincronización inicial, y por lo tanto sus opciones son más limitadas. Si WiredTiger es utilizado, puede ser capaz de tomar uno de los secundarios de la serie, inicio como un independiente, ejecutar compact en ella, y volver a unirse al conjunto.

    Respecto repairDatabase

    Por favor, no corras repairDatabase en la réplica de conjunto de nodos. Esto es muy peligroso, como se mencionó en el repairDatabase página y se describe en más detalle a continuación.

    El nombre repairDatabase es un poco engañosa, ya que el comando no intente reparar cualquier cosa. El comando estaba destinado a ser utilizado cuando hay daños en el disco en un independiente nodo, lo que podría conducir a documentos dañados.

    La repairDatabase comando podría ser más precisa descrito como «rescate de la base de datos». Es decir, se recrea en las bases de datos descartando documentos dañados en un intento de obtener la base de datos en un estado donde usted puede iniciar y salvamento intacta documento de ella.

    En MMAPv1 implementaciones, esta reconstrucción de la base de datos de archivos libera espacio para el sistema operativo como un efecto secundario. La liberación de espacio para el sistema operativo nunca fue el propósito.

    Consecuencias de repairDatabase en un conjunto de réplicas

    En un conjunto de réplicas, MongoDB espera que todos los nodos en el conjunto idéntico de datos. Si ejecuta repairDatabase en un conjunto de réplicas nodo, hay una posibilidad de que el nodo contiene desapercibida la corrupción, y repairDatabase diligentemente quitar a los corruptos de los documentos para usted.

    Como era de esperar, esto hace que el nodo contiene un conjunto de datos diferente de la del resto del conjunto. Si se produce una actualización para golpear ese único documento, el conjunto podría accidente.

    Para empeorar las cosas, es totalmente posible que esta situación podría permanecer inactivo durante un largo tiempo, sólo a la huelga de repente, sin razón aparente.

  8. 4

    En el caso de que una gran parte de los datos se eliminan de una colección y la colección que nunca utiliza el borrado de espacio para los nuevos documentos, este espacio debe ser devuelto al sistema operativo para que pueda ser utilizado por otras bases de datos o colecciones. Usted tendrá que ejecutar un compacto o de la operación de reparación para desfragmentar el espacio en disco y recuperar el espacio utilizable.

    Comportamiento del proceso de compactación depende de MongoDB motor de la siguiente manera

    db.runCommand({compact: collection-name })

    MMAPv1

    Compactación de la operación desfragmenta los archivos de datos y aplicaciones; los índices. Sin embargo, no libera espacio para el sistema operativo. La operación es útil para desfragmentar y crear más espacio contiguo para la reutilización de MongoDB. Sin embargo, no es de ningún uso, sin embargo, cuando el espacio libre en disco es muy baja.

    Un espacio adicional en disco de hasta 2 gb es requerida durante la operación de compactación.

    Una base de datos de nivel de bloqueo se lleva a cabo durante la compactación de la operación.

    WiredTiger

    La WiredTiger motor de compresión por defecto, que consume menos espacio en disco que MMAPv1.

    El pacto proceso libera el espacio libre para el sistema operativo.
    Mínimo espacio de disco es necesario para ejecutar la operación de compactación.
    WiredTiger también bloquea todas las operaciones en la base de datos ya que las necesidades de nivel de base de datos de bloqueo.

    Para MMAPv1 motor, compacto haces no devolver el espacio para el sistema operativo. Se requieren para ejecutar la operación de reparación para liberar el espacio no utilizado.

    db.runCommand({repairDatabase: 1})
  9. 3

    Mongodb 3.0 y superior, tiene un nuevo motor de almacenamiento WiredTiger.
    En mi caso la conmutación de motor de reducción de uso de disco de 100 Gb a 25 gb.

  10. 1

    Archivos de base de datos no puede ser de tamaño reducido. Mientras que la «reparación» de la base de datos, sólo es posible para mongo servidor para eliminar algunos de sus archivos. Si la gran cantidad de datos ha sido eliminado, mongo servidor «liberación» (eliminar), durante la reparación, algunos de sus archivos existentes.

  11. 1

    En general compact es preferible repairDatabase. Pero una de las ventajas de la reparación de más compacto se puede emitir de reparación para todo el clúster. compacto tienes que iniciar sesión en cada fragmento, que es una especie de molesto.

  12. 1

    Cuando yo tenía el mismo problema, me detuve mi mongo servidor y comenzó de nuevo con el comando

    mongod --repair

    Antes de ejecutar la operación de reparación que usted debe comprobar ¿tiene suficiente espacio libre en su disco duro (min – es el tamaño de su base de datos)

  13. 0

    mongoDB -no se recomienda la reparación en caso de sharded clúster.

    Si el uso conjunto de réplicas sharded clúster, utilice el comando compact, que se reescribe y desfragmenta todos los datos y archivos de índice de todas las colecciones.
    sintaxis:

    db.runCommand( { compact : "collection_name" } )

    cuando se utiliza con vigor:true, compacto ejecuta en primaria del conjunto de réplicas.
    por ejemplo, db.runCommand ( { command : "collection_name", force : true } )

    Otros puntos a considerar:
    -Bloquea las operaciones. así que se recomienda ejecutar en la ventana de mantenimiento.
    -Si los conjuntos de réplica se ejecutan en servidores diferentes, se debe ejecutar en cada uno de los miembros por separado
    – En caso de sharded clúster, compacto necesita ejecutar en cada fragmento de miembro por separado. No se puede ejecutar en contra de mongos instancia.

  14. 0

    De modo independiente podría utilizar compacto o reparación,

    Para sharded grupo o conjunto de réplicas, en mi experiencia, después de correr compacto en el principal, seguido por el compacto de la secundaria, el tamaño de la base de datos primaria reducido, pero no la secundaria.
    Es posible que desee hacer resync miembro para reducir el tamaño de la base de datos secundaria. y haciendo esto, usted podría encontrar que el tamaño de la base de datos secundaria es aún más reducido que el de la primaria, supongo que el comando compact no es realmente la compactación de la colección.
    Así, terminé la conmutación de la primaria y secundaria del conjunto de réplicas y haciendo resync miembro de nuevo.

    mi conclusión es que la mejor manera de reducir el tamaño de sharded/conjunto de réplicas es haciendo resync miembro, interruptor principal de la secundaria, y la resincronización de nuevo.

  15. -5

    Sólo una forma en la que yo era capaz de hacerlo. No se garantiza la seguridad de los datos existentes. Tratar con su propio riesgo.

    Eliminar los archivos de datos directamente y reiniciar mongod.

    Por ejemplo, con ubuntu (ruta de acceso predeterminada de datos: /var/lib/mongodb), tenía par de archivos con un nombre parecido: la colección.#. Sigo la colección.0 y eliminar todos los demás.

    Parece una manera más fácil si usted no tiene graves de datos en la base de datos.

    • los archivos se almacenan como <database_name>.<number> por ejemplo, mydb.3 – no puedes decirle a la colección.

Dejar respuesta

Please enter your comment!
Please enter your name here