Puedes desfragmentar una colección fragmentada con el
unshardCollectionComando. Al desfragmentar una colección, esta no se puede particionar en varios fragmentos y se elimina la clave del fragmento.
De forma predeterminada, al desfragmentar una colección, MongoDB mueve los datos de la colección al fragmento con la menor cantidad de datos. También puede especificar en qué fragmento colocar los datos.
Acerca de esta tarea
Compatibilidad
Puede realizar esta tarea en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Esta tarea no está disponible en los niveles gratuito o flexible de MongoDB Atlas.
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.
Restricciones
unshardCollectionSólo se puede ejecutar en clústeres fragmentados.unshardCollectionSólo puede operar en colecciones fragmentadas.unshardCollectionSólo puede operar en una única colección a la vez.unshardCollectiontiene una duración mínima de 5 minutos.Debes reconstruir los índices de búsqueda de MongoDB después de que se ejecute
unshardCollection.No puede realizar cambios de topología, como añadir o remover particiones o pasar de servidores de configuración dedicados a embebidos, hasta que
unshardCollectionse complete.No se pueden ejecutar las siguientes operaciones en la colección que se está desfragmentando mientras
unshardCollectionestá en progreso:No se pueden ejecutar las siguientes operaciones en el clúster mientras
unshardCollectionesté en progreso:Las compilaciones de índices que ocurren mientras
unshardCollectionestá en progreso pueden fallar silenciosamente.No cree índices mientras
unshardCollectionesté en progreso.No llame a
unshardCollectionsi hay compilaciones de índices en curso.
Para evitar errores, MongoDB elimina automáticamente las zonas de su colección cuando ejecuta
unshardCollection.
Control de acceso
Si su implementación tiene habilitado el control de acceso, el rol le otorga acceso para ejecutar enableSharding el unshardCollection comando.
Antes de comenzar
Antes de desfragmentar su colección, asegúrese de cumplir con los siguientes requisitos:
Su aplicación puede tolerar un periodo de dos segundos en el que la colección afectada bloquea las escrituras. Durante este periodo, la aplicación experimenta un aumento de latencia.
Su base de datos cumple estos requisitos de recursos:
Asegúrese de que el fragmento al que va a mover la colección tenga suficiente espacio de almacenamiento para la colección y sus índices. El fragmento de destino requiere al menos
( Collection storage size + Index Size ) * 2bytes disponibles.Asegúrese de que su capacidad de E/S esté por debajo del 50%.
Asegúrese de que la carga de su CPU esté por debajo del 80%.
Pasos
(Opcional) Lista de nombres de fragmentos
Si desea colocar los datos de su colección fragmentada en un fragmento específico, necesita el nombre del fragmento de destino.
Para ver la lista de nombres de fragmentos en su clúster, use el listShards comando:
db.adminCommand( { listShards: 1 } )
El campo shards._id enumera el nombre de cada fragmento.
Desfragmentar la colección
Para desfragmentar una colección, ejecute el unshardCollection comando. El siguiente ejemplo desfragmenta una colección llamada us_accounts en la sales base de datos:
db.adminCommand( { unshardCollection: "sales.us_accounts", toShard: "shard1" } )
Una vez completada la operación de desfragmentación, los datos de la colección us_accounts se ubican en shard1. Si se omite el campo toShard, los datos se colocan en el fragmento con la menor cantidad de datos.
Confirmar que la colección no está fragmentada
Para confirmar que la colección no está fragmentada, utilice la etapa e intente hacer coincidir en el espacio de nombres no $shardedDataDistribution fragmentado:
db.aggregate( [ { $shardedDataDistribution: { } }, { $match: { "ns": "sales.us_accounts" } } ] )
Si la agregación no devuelve ningún dato, la colección no está fragmentada.