Docs Menu
Docs Home
/ /

compact (comando de base de datos)

compact

Reescribe y desfragmenta todos los datos e índices de una colección. En WiredTiger bases de datos, este comando libera el espacio en disco innecesario al sistema operativo.

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.

El comando tiene la siguiente sintaxis:

db.runCommand(
{
compact: <collection name>
}
)

El comando toma los siguientes campos:

Campo
Tipo
Descripción

compact

string

El nombre de la colección.

force

flag

opcional. Si se especifica, obliga a que compact se ejecute en el primario de un set de réplicas. compact no bloquea las Operaciones CRUD de MongoDB en la base de datos que está compactando.

comment

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.).

Para los clústeres que imponen la autenticación, debes autenticarte como un usuario con la Acción de privilegio compact en la colección de destino. El rol dbAdmin proporciona los privilegios necesarios para ejecutar compact en colecciones que no son del sistema.

Para colecciones del sistema, debe hacer lo siguiente:

  1. Cree un rol personalizado que otorgue la acción compact en la colección del sistema.

  2. Conceda ese rol a un usuario nuevo o ya existente.

  3. 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 agregar el dbAdmin o el rol personalizado a un usuario existente, use db.grantRolesToUser() o db.updateUser(). La siguiente operación concede el rol personalizado compact al 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"
]
}
)

Para comprobar el progreso de la operación compact, supervise la entrada de registro mongod o ejecute db.currentOp() desde otra instancia de shell.

Si reinicia el servidor antes de que compact termine, la operación finaliza y puede fallar en su intento de liberar espacio en disco al sistema operativo.

El comando compact intenta reducir el espacio en disco para los datos y los índices de una colección liberando bloques obsoletos en el sistema operativo. La eficacia depende de cuántos bloques estén disponibles para liberarse 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 opera sobre segmentos del archivo de datos en cada pasada. Usar compact en una colección compacta tanto la colección como sus índices asociados.

compact puede requerir espacio adicional en disco para ejecutarse.

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.

Nota

Si tu implementación utiliza lecturas secundarias y transacciones de varias particiones, considera ejecutar una sincronización inicial en lugar de compact.

Cuando compact se ejecuta, WiredTiger ajusta temporalmente su estrategia de administrador de bloques para adaptarse a la carga de trabajo compacta. Este ajuste puede ralentizar las operaciones de los puntos de control y aumentar el tiempo que tarda un nodo en confirmar una transacción. Las confirmaciones de transacciones retrasadas pueden provocar una latencia de lectura significativa, atraso de la replicación y colas operativas.

Puede usar compact en colecciones e índices en un set de réplicas; sin embargo, considere lo siguiente:

  • El nodo primario no replica el comando compact a los nodos secundarios.

  • Deberías ejecutar compact en nodos secundarios siempre que sea posible. Si no puedes ejecutar compact en los nodos secundarios, consulta la opción forzar.

  • A partir de MongoDB 6.1.0 (y 6.0.2):

    • Un nodo secundario puede replicarse mientras compact se está ejecutando.

    • Se permiten las operaciones de lectura.

Para ejecutar compact en un clúster

1

Ejecute compact en uno de los nodos secundarios. Cuando compact termine, repita la operación en cada uno de los secundarios restantes, uno por uno.

2

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.

3

Después de retirar el nodo primario antiguo, este se convierte en un nodo secundario. Ejecute compact en el nodo primario antiguo.

  • Un nodo secundario puede replicarse mientras compact se 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 del set de réplicas, consulte Estados del nodo del set 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.

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.

mongod reconstruye todos los índices en paralelo tras la operación compact.

La siguiente operación ejecuta el comando compact en la colección movies:

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

Ejecutar compact devuelve una salida similar a la siguiente:

{ bytesFreed: 27859, ok: 1 }

Volver

collMod

En esta página