Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Mover una colección

A partir de MongoDB 8.0, puedes mover una colección no particionada a una partición diferente usando el moveCollection dominio.

  • moveCollection Sólo se puede ejecutar en clústeres fragmentados.

  • moveCollection solo puede mover colecciones que no estén fragmentadas.

  • moveCollection solo puede mover una colección a la vez.

  • moveCollection tiene una duración mínima de 5 minutos.

  • Si la colección que se está moviendo utiliza MongoDB Search, sus índices de búsqueda dejan de estar disponibles una vez que moveCollection finaliza. Debe reconstruir manualmente los índices de búsqueda.

  • No se pueden realizar cambios en la topología, como agregar o eliminar fragmentos o realizar transiciones entre servidores de configuración integrados y dedicados, hasta que se complete moveCollection.

  • No puedes ejecutar las siguientes operaciones en la colección que se está moviendo mientras moveCollection esté en curso:

  • No se pueden ejecutar las siguientes operaciones contra el clúster mientras moveCollection esté en progreso:

  • Las creaciones de índices que ocurran mientras moveCollection esté en curso podrían fallar silenciosamente.

    • No cree índices mientras moveCollection esté en progreso.

    • No llame a moveCollection si hay creaciones de índices en curso.

Si tu implementación tiene control de acceso habilitado, el rol enableSharding te otorga acceso para ejecutar el comando moveCollection.

Antes de trasladar tu colección, asegúrate de cumplir 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 con estos requisitos de recursos:

    • Asegúrate de que la partición a la que mueves la colección tenga suficiente espacio de almacenamiento para la colección y sus índices. La partición de destino requiere al menos ( Collection storage size + Index Size ) * 2 bytes disponibles.

    • 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

La base de datos no exige estos requisitos. Si no se asignan suficientes recursos, pueden producirse las siguientes consecuencias:

  • la base de datos se queda sin espacio y se apaga

  • rendimiento reducido

  • la operación tarda más de lo esperado

Si su aplicación tiene períodos de tiempo con menos tráfico, realice esta operación en la colección durante ese tiempo si es posible.

1

Para mover una colección no particionada llamada inventory en la base de datos app a la partición shard02, ejecuta moveCollection:

db.adminCommand(
{
moveCollection: "app.inventory",
toShard: "shard02"
}
)

Para obtener una lista de los ID de fragmentos disponibles,sh.status() ejecute. Para más detalles, consulte la salida de sh.status().

2
  1. Supervisa el tiempo restante.

    Para monitorear el tiempo restante para la moveCollection operación, utilice la $currentOp etapa de canalización.

    Este ejemplo muestra cómo comprobar el progreso de moveCollection en la colección app.inventory:

    db.getSiblingDB("admin").aggregate( [
    { $currentOp: { allUsers: true, localOps: false } },
    {
    $match: {
    type: "op",
    "originatingCommand.reshardCollection": "app.inventory"
    }
    }
    ] )

    Nota

    Para ver los valores actualizados, es necesario ejecutar continuamente la pipeline anterior.

    La $currentOp salida de la pipeline:

    • totalOperationTimeElapsedSecs: elapsed operation time en segundos

    • remainingOperationTimeEstimatedSecs: tiempo restante estimado en segundos para la operación moveCollection actual. Se devuelve como -1 al iniciar una nueva operación moveCollection.

    Nota

    remainingOperationTimeEstimatedSecs se establece en una estimación de tiempo pesimista:

    • La estimación del tiempo de la fase de recuperación se establece en el tiempo de la fase de clonación, que
      es un tiempo relativamente largo.
    • En la práctica, si solo hay unas pocas operaciones de escritura pendientes, el
      el tiempo real de la fase de actualización es relativamente corto.

    Esta etapa del pipeline tiene una salida similar a la siguiente:

    [
    {
    shard: '<shard>',
    type: 'op',
    desc: 'ReshardingRecipientService | ReshardingDonorService | ReshardingCoordinatorService <reshardingUUID>',
    op: 'command',
    ns: '<database>.<collection>',
    originatingCommand: {
    reshardCollection: '<database>.<collection>',
    key: <shardkey>,
    unique: <boolean>,
    collation: { locale: 'simple' }
    },
    totalOperationTimeElapsedSecs: <number>,
    remainingOperationTimeEstimatedSecs: <number>,
    ...
    },
    ...
    ]
  2. Supervise el número de bytes transferidos.

    Para supervisar la cantidad de bytes transferidos, utiliza shardingStatistics.resharding.active.bytesCopied y compara con la cantidad de bytes en la colección.

3

Para confirmar que la colección se ha movido a la partición esperada, utilize la etapa de $collStats pipeline.

Este ejemplo muestra cómo confirmar que la colección app.inventory existe en la partición esperada:

db.inventory.aggregate( [
{ $collStats: {} },
{ $project: { "shard": 1 } }
] )

Esta etapa del pipeline tiene una salida similar a la siguiente:

[ { shard: 'shard02' } ]

Volver

Colecciones móviles

En esta página