Definición
rewriteCollectionReescribe una colección fragmentada en el disco utilizando la misma clave de fragmentación.
Utilice este comando para redistribuir datos al agregar o eliminar fragmentos, o para recuperar espacio en disco.
Para detener una reescritura de colección en curso, utilice el
abortRewriteCollection.Nuevo en la versión 8.3.
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
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte 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.adminCommand( { rewriteCollection: "<database>.<collection>", numInitialChunks: <int>, zones: <zones> } )
Campos de comandos
El comando toma los siguientes campos:
Campo | Tipo | Descripción |
|---|---|---|
| string | Obligatorio. Nombre de la base de datos y colección que se va a sobrescribir. |
| entero | Opcional. Número de fragmentos iniciales que se utilizarán para redistribuir la colección. Por defecto es 90. |
| arreglo | Opcional. Documentos que especifican las zonas para la clave de fragmentación. |
Considerations
Antes de comenzar a reescribir su colección, asegúrese de cumplir con los siguientes requisitos:
Su aplicación puede tolerar un período de dos segundos en el que la colección afectada bloquea los guardados. Durante el periodo en el que las écritas están bloqueadas, tu aplicación experimenta un aumento en la latencia.
Si tu carga de trabajo no puede tolerar este requerimiento, considera refinar la clave de partición en su lugar.
Su base de datos cumple con estos requisitos de recursos:
Asegúrese de que el espacio de almacenamiento disponible en cada fragmento receptor sea al menos el doble del tamaño de almacenamiento de la colección que desea reescribir más el tamaño total de su índice, dividido por el número de fragmentos:
( ( collection_storage_size + index_size ) * 2 ) / shard_count = storage_req Por ejemplo, considera una colección con un tamaño de almacenamiento de 2 TB de datos y un índice de 400 GB. Para distribuirlo en cuatro particiones necesitarías:
( ( 2 TB collection + 0.4 TB index ) * 2 ) / 4 shards = 1.2 TB storage Para reescribir esta colección, cada fragmento requiere 1.2 TB de almacenamiento disponible.
En MongoDB Atlas, es posible que necesite actualizar al siguiente nivel de almacenamiento para la operación de reescritura. Puede volver a la versión anterior una vez que la operación haya finalizado.
Asegúrate de que tu capacidad de E/S esté por debajo de 50%.
Asegúrate de que la carga de tu CPU esté por debajo del 80%.
Importante
Estos requisitos no son exigidos por la base de datos. Una falta de asignación de suficientes recursos puede provocar:
la base de datos se queda sin espacio y se apaga
rendimiento reducido
la operación tarda más de lo esperado
Si tu aplicación tiene periodos de menor tráfico, realiza esta operación en la colección durante ese tiempo si es posible.
No es necesario crear un índice en la nueva clave de partición antes de volver a particionar. La operación de redistribución compila automáticamente los índices requeridos durante la fase de índices.
No hay creaciones de índices en proceso. Para comprobar si hay creaciones de índices en ejecución, utiliza
$currentOp:db.getSiblingDB("admin").aggregate( [ { $currentOp : { idleConnections: true } }, { $match: { $or: [ { "op": "command", "command.createIndexes": { $exists: true } }, { "op": "none", "msg": /^Index Build/ } ] } } ] ) En el documento de resultados, si el valor en el campo
inproges un arreglo vacío, no hay creaciones de índices en curso:{ inprog: [], ok: 1, '$clusterTime': { ... }, operationTime: <timestamp> }
Nota
Una operación de reescritura es un proceso intensivo en escritura que puede generar mayores tasas de oplog. Es posible que desee:
defina un tamaño fijo para el oplog para prevenir el crecimiento sin límites del oplog.
aumente el tamaño de Oplog para minimizar la posibilidad de que uno o más nodos secundarios queden obsoletos.
Consulta la documentación de Oplog del set de réplicas para obtener más información.
Limitaciones de reescritura
Si la colección usa Atlas Search, el índice de búsqueda dejará de estar disponible una vez que se complete la operación. Para restaurar, reconstruye manualmente el índice de búsqueda.
Las colecciones que utilizan Queryable Encryption no son compatibles.
Control de acceso
El rewriteCollection comando requiere la rewriteCollection acción de privilegio en el clúster o en la base de datos y colección que desea reescribir.
Esta acción privilegiada también está disponible para usuarios con los siguientes roles:
Ejemplos
Para reescribir una colección, ejecute el siguiente comando:
db.adminCommand( { rewriteCollection: "sales.orders" } )