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

rewriteCollection (comando de banco de dados)

rewriteCollection

Recompõe uma collection fragmentada no disco usando a mesma chave de shard.

Use este comando para redistribuir dados ao adicionar ou remover fragmentos ou para recuperar espaço em disco.

Para interromper uma reescrita de coleção em andamento, use o abortRewriteCollection comando.

Novidades na versão 8.3.

Esse comando está disponível em implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem

Observação

Este comando é aceito em todos os clusters do MongoDB Atlas. Para obter informações sobre o suporte do Atlas a todos os comandos, consulte Comandos não suportados.

  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

O comando tem a seguinte sintaxe:

db.adminCommand( {
rewriteCollection: "<database>.<collection>",
numInitialChunks: <int>,
zones: <zones>
} )

O comando utiliza os seguintes campos:

Campo
Tipo
Descrição

rewriteCollection

string

Obrigatório. Nome do banco de dados e da collection a serem reescritas.

numInitialChunks

inteiro

Opcional. Número de chunks iniciais a serem usados para refragmentar a coleção. O padrão é 90.

zones

array

Opcional. Documentos que especificam as zonas para a chave de shard.

Antes de começar a reescrever sua collection, certifique-se de atender aos seguintes requisitos:

  • Seu aplicação pode tolerar um período de dois segundos em que a collection afetada bloqueia as gravações. Durante o período em que as gravações são bloqueadas, seu aplicação experimenta um aumento na latência.

    Se sua carga de trabalho não tolerar esse requisito, considere ajustar sua chave de fragmento.

  • Seu banco de dados atende aos seguintes requisitos de recursos:

    • Certifique-se de que o espaço de armazenamento disponível em cada shard destinatário seja pelo menos duas vezes o tamanho de armazenamento da collection que você deseja reescrever mais seu tamanho de índice total, dividido pelo número de shards:

      ( ( collection_storage_size + index_size ) * 2 ) / shard_count = storage_req

      Por exemplo, considere uma coleção com um tamanho de armazenamento de 2 TB de dados e um índice de 400 GB. Para distribuí-lo em quatro fragmentos, você precisa de:

      ( ( 2 TB collection + 0.4 TB index ) * 2 ) / 4 shards = 1.2 TB storage

      Para reescrever esta coleção, cada fragmento requer 1.2 TB de armazenamento disponível.

      No MongoDB Atlas, talvez seja necessário atualizar para o próximo nível de armazenamento para a operação de reescrita. Você pode fazer o downgrade assim que a operação for concluída.

    • Certifique-se de que sua capacidade de E/S esteja abaixo de 50%.

    • Certifique-se de que a carga da CPU esteja abaixo de 80%.

    Importante

    Esses requisitos não são exigidos pelo banco de dados. Uma falha na alocação de recursos suficientes pode resultar em:

    • o banco de dados ficar sem espaço e desligando

    • redução do desempenho

    • a operação demora mais que o esperado

    Se o seu aplicação tiver períodos com menos tráfego, execute esta operação na coleção durante esse período, se possível.

  • Você não precisa criar um índice na nova chave de fragmento antes de refragmentar. A operação de refragmentação cria os índices necessários automaticamente durante a fase de indexação.

  • Nenhuma construção de índice está em andamento. Para verificar se há construções de índice em execução, use $currentOp:

    db.getSiblingDB("admin").aggregate( [
    { $currentOp : { idleConnections: true } },
    { $match: {
    $or: [
    { "op": "command", "command.createIndexes": { $exists: true } },
    { "op": "none", "msg": /^Index Build/ }
    ]
    }
    }
    ] )

    No documento de resultado, se o valor do campo inprog for uma array vazia, não haverá nenhuma construção de índice em andamento:

    {
    inprog: [],
    ok: 1,
    '$clusterTime': { ... },
    operationTime: <timestamp>
    }

Observação

Uma operação de reescrita é um processo de gravação intensiva que pode gerar taxas maiores de oplog. Talvez você queira:

  • definir um tamanho fixo de oplog para prevenir o crescimento ilimitado do oplog.

  • aumentar o tamanho do oplog para minimizar a chance de um ou mais nós secundários se tornarem obsoletos.

Consulte a documentação Conjunto de réplicas do Oplog para obter mais detalhes.

  • Se a coleção usar Atlas Search, o índice de pesquisa ficará indisponível após a conclusão da operação. Para restaurá-lo, reconstrua manualmente o índice de pesquisa.

  • Coleções que usam queryable encryption não são suportadas.

O rewriteCollection comando requer a rewriteCollection ação de privilégio no cluster ou no banco de dados e na collection que você deseja reescrever.

Esta ação de privilégio também está disponível para usuários com os seguintes roles:

Para reescrever uma collection, execute o seguinte comando:

db.adminCommand( {
rewriteCollection: "sales.orders"
} )

Voltar

reshardCollection

Nesta página