Definición
rewriteCollectionReescribe una colección particionada en disco usando la misma clave de partición.
Utiliza este comando para redistribuir datos al agregar o remover particiones, 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 de la colección para reescribir. |
| entero | opcional. Número de fragmentos iniciales que se utilizarán para redistribuir la colección. De forma por defecto es 90. |
| arreglo | opcional. Documents que especifican las zonas para la clave de partición. |
Considerations
Antes de comenzar a reescribir tu colección, asegúrate 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 partición receptora 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 particiones:
( ( 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 partición requiere 1.2 TB de almacenamiento disponible.
En MongoDB Atlas, puede que necesites actualizar al siguiente nivel de almacenamiento para la operación de reescritura. Puedes revertir la actualización una vez que la operación se haya completado.
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 tasas incrementadas de oplog. Puede que desees:
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 comando rewriteCollection requiere la acción de privilegio rewriteCollection en el clúster o en la base de datos y colección que deseas reescribir.
Esta acción de privilegio también está disponible para los usuarios con los siguientes roles:
Ejemplos
Para reescribir una colección, ejecute el siguiente comando:
db.adminCommand( { rewriteCollection: "sales.orders" } )