Definición
Compatibilidad
Este comando está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Importante
Este comando no es compatible con los clústeres M0 y Flex. Para obtener más información, consulta Comandos no compatibles.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
El comando tiene la siguiente sintaxis:
db.runCommand( { compact: <string>, dryRun: <boolean>, force: <boolean>, // Optional freeSpaceTargetMB: <int>, // Optional comment: <any>, // Optional } )
Campos de comandos
El comando toma los siguientes campos:
Campo | Tipo | Descripción |
|---|---|---|
| string | El nombre de la colección. |
| booleano | Nuevo en la versión 8.0. Si se activa la opción, el comando Por defecto: False |
| booleano | Opcional. Si está activado, obliga a |
| entero | Opcional. Especifica la cantidad mínima de espacio de almacenamiento, en megabytes, que debe ser recuperable para que la compactación pueda proceder. Por defecto: 20 |
| any | Opcional. Un comentario proporcionado por el usuario para adjuntar a este comando. Una vez configurado, este comentario aparece junto a los registros de este comando en las siguientes ubicaciones:
Un comentario puede ser de cualquier tipo BSON válido (string, objeto, arreglo, etc.). |
Nota
El comando compact no bloquea las operaciones MongoDB CRUD Operations en la base de datos que está compactando.
compact Privilegios requeridos
Para los clústeres que aplican autenticación, debes autenticarte como usuario con el privilegio de acción compact en la colección de destino. Los roles dbAdmin y hostManager proporcionan los privilegios necesarios para ejecutar compact contra colecciones no pertenecientes al sistema.
Para colecciones del sistema, debe hacer lo siguiente:
Cree un rol personalizado que otorgue la acción
compacten la colección del sistema.Conceda ese rol a un usuario nuevo o ya existente.
Autentíquese como ese usuario para ejecutar el comando
compact.
Por ejemplo, las siguientes operaciones crean un rol personalizado que concede la acción compact sobre la base de datos y la colección especificadas:
use admin db.createRole( { role: "myCustomCompactRole", privileges: [ { resource: { "db" : "<database>" , "collection" : "<collection>" }, actions: [ "compact" ] } ], roles: [] } )
Para obtener más información sobre la configuración del documento resource, consulta Documento de recursos en implementaciones autogestionadas.
Para añadir el dbAdmin, hostManager o el rol personalizado a un usuario existente, utiliza db.grantRolesToUser() o db.updateUser(). La siguiente operación concede el rol personalizado compact a myCompactUser en la base de datos admin:
use admin db.grantRolesToUser("myCompactUser", [ "dbAdmin" | "myCustomCompactRole" ] )
Para agregar el dbAdmin o el rol personalizado a un nuevo usuario, especifique el rol en el arreglo roles del método db.createUser() al crear el usuario.
use admin db.createUser( { user: "myCompactUser", pwd: "myCompactUserPassword", roles: [ { role: "dbAdmin", db: "<database>" } | "myCustomCompactRole" ] } )
Comportamiento
Supervisión del progreso
Para comprobar el progreso de la operación compact, supervise la entrada de registro mongod o ejecute db.currentOp() desde otra instancia de shell.
Finalización de la operación
Si finaliza compact con el método o reinicia el servidor antes de que la operación db.killOp() termine, compact finaliza. Es posible que la operación no libere espacio en disco para el sistema operativo.
Espacio en disco
El comando compact reduce el espacio en disco que ocupan los datos y los índices de una colección al liberar bloques obsoletos al sistema operativo. Su eficacia depende de la cantidad de bloques disponibles para liberar y de su ubicación en el archivo de datos.
Para ver cómo cambia el espacio de almacenamiento de la colección, ejecuta el comando collStats antes y después de la compactación. Puedes usar la métrica de salida collStats.freeStorageSize para ver la cantidad de almacenamiento disponible para reutilización.
La operación es iterativa y trabaja con segmentos del archivo de datos en cada pasada. Para estimar cuánto espacio libera compact, utilice el indicador dryRun. Al llamar a compact en una colección, se compactan tanto la colección como sus índices asociados.
compact puede requerir espacio adicional en disco para ejecutarse.
Copias de seguridad
La compactación realiza regularmente puntos de control en la base de datos, lo que puede llevar a unos gastos en general de sincronización. En bases de datos con mucho tráfico, esto puede retrasar o impedir tareas operativas como realizar copias de seguridad. Para evitar interrupciones inesperadas, desactive la compactación antes de realizar una copia de seguridad.
Transacciones de múltiples particiones
Nota
Si tu implementación utiliza lecturas secundarias y transacciones de varias particiones, considera ejecutar una sincronización inicial en lugar de compact.
Cuando se ejecuta compact, WiredTiger ajusta temporalmente su estrategia de administrador de bloques para adaptarse a la carga de trabajo compacta. Este ajuste puede ralentizar las operaciones de punto de control y aumentar el tiempo que tarda un miembro en confirmar una transacción. Las confirmaciones de transacciones retrasadas pueden provocar una latencia de lectura significativa, retrasos en la replicación y colas operativas.
Sets de réplicas
Puedes usar compact en colecciones e índices en un conjunto de réplicas. Considera lo siguiente:
El nodo primario no replica el comando
compacta los nodos secundarios.Ejecuta
compacten los nodos secundarios siempre que sea posible. Si no puedes ejecutarcompacten los nodos secundarios, consulta la opción de forzar.A partir de MongoDB 6.1.0 (y 6.0.2):
Un nodo secundario puede replicarse mientras
compactse está ejecutando.Se permiten las operaciones de lectura.
Para ejecutar compact en un clúster:
Reasigne el nodo primario.
Para bajar el nodo primario actual y activar una elección, utilice el método rs.stepDown(). Para nominar un nodo secundario en particular, ajuste la prioridad del nodo.
Consideraciones específicas de la versión para nodos secundarios
Un nodo secundario puede replicarse mientras
compactse está ejecutando.Se permiten las operaciones de lectura.
Mientras se ejecuta el comando compact, el set de réplicas permanece en un estado de SECONDARY.
Para obtener más información sobre los estados miembros del conjunto de réplicas,consulte Estados miembros del conjunto de réplicas.
Para el mantenimiento y la disponibilidad de los Sets de réplicas, consulta Realizar mantenimiento de los miembros del Set de réplicas autogestionados.
Clústeres fragmentados
compact solo se aplica a instancias de mongod. En un entorno particionado, ejecute compact en cada partición por separado como operación de mantenimiento.
No puede emitir compact contra una instancia de mongos.
Comandos compactos concurrentes no permitidos
Si intentas ejecutar múltiples comandos compact concurrentes en la misma colección, MongoDB devuelve un error.
Ejemplo
Nota
Los siguientes ejemplos incluyen force: true, que se requiere al ejecutar compact contra un primario de set de réplicas activo. Para ejecutar compact sin force: true, bajar primero el primario. Para obtener más información, consulta Sets de réplicas.
Compactar una colección
La siguiente operación ejecuta el comando compact en la colección movies:
db.runCommand( { compact: "movies", force: true } )
{ bytesFreed: "...", ok: 1 }
Estimación de la compactación
La siguiente Operación realiza una simulación del comando compact en la colección movies:
db.runCommand( { compact: "movies", dryRun: true, force: true } )
{ estimatedBytesFreed: "...", ok: 1 }