sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Compactar automáticamente el espacio eliminado en mongodb?

En general, si no necesita reducir sus archivos de datos, no debería reducirlos en absoluto. Esto se debe a que "hacer crecer" sus archivos de datos en el disco es una operación bastante costosa y cuanto más espacio pueda asignar MongoDB en los archivos de datos, menos fragmentación tendrá.

Por lo tanto, debe intentar proporcionar tanto espacio en disco como sea posible para la base de datos.

Sin embargo si debe reducir la base de datos, debe tener en cuenta dos cosas.

  1. MongoDB aumenta sus archivos de datos duplicándolos, por lo que los archivos de datos pueden ser de 64 MB, luego de 128 MB, etc. hasta 2 GB (momento en el que deja de duplicarse para mantener los archivos hasta 2 GB).

  2. Como con la mayoría de las bases de datos... para operaciones como la reducción, necesitará programar un trabajo separado para hacerlo, por lo que no hay "reducción automática" en MongoDB. De hecho, de las principales bases de datos noSQL (odio ese nombre), solo Riak se reducirá automáticamente. Por lo tanto, deberá crear un trabajo utilizando el programador de su sistema operativo para ejecutar una reducción. Puede usar un script bash o hacer que un trabajo ejecute un script php, etc.

Javascript del lado del servidor

Puede usar Javascript del lado del servidor para reducir y ejecutar ese JS a través del shell de mongo de forma regular a través de un trabajo (como cron o el servicio de programación de Windows)...

Asumiendo una colección llamada foo guardaría el javascript a continuación en un archivo llamado bar.js y corre...

$ mongo foo bar.js

El archivo javascript se parecería a...

// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();

print('Storage Size: ' + tojson(storage));

print('TotalSize: ' + tojson(total));

print('-----------------------');
print('Running db.repairDatabase()');
print('-----------------------');

// Run repair
db.repairDatabase()

// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();

print('Storage Size: ' + tojson(storage_a));
print('TotalSize: ' + tojson(total_a));

Esto se ejecutará y devolverá algo como...

MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153

Ejecute esto en un horario (fuera de las horas pico) y estará listo para comenzar.

Colecciones limitadas

Sin embargo, hay otra opción, colecciones limitadas .

Básicamente, puede limitar el tamaño de (o la cantidad de documentos en) una colección para decir ... 20 GB y una vez que se alcance ese límite, MongoDB comenzará a descartar los registros más antiguos y los reemplazará con entradas más nuevas a medida que ingresen.

Esta es una excelente manera de mantener una gran cantidad de datos, descartando los datos más antiguos a medida que pasa el tiempo y manteniendo la misma cantidad de espacio en disco utilizado.