Definição
rewriteCollectionRecompõ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
abortRewriteCollectioncomando.Novidades na versão 8.3.
Compatibilidade
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
Sintaxe
O comando tem a seguinte sintaxe:
db.adminCommand( { rewriteCollection: "<database>.<collection>", numInitialChunks: <int>, zones: <zones> } )
Campos de comando
O comando utiliza os seguintes campos:
Campo | Tipo | Descrição |
|---|---|---|
| string | Obrigatório. Nome do banco de dados e da collection a serem reescritas. |
| inteiro | Opcional. Número de chunks iniciais a serem usados para refragmentar a coleção. O padrão é 90. |
| array | Opcional. Documentos que especificam as zonas para a chave de shard. |
Considerações
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
inprogfor 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.
Limitações de reescrita
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.
Controle de acesso
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:
Exemplos
Para reescrever uma collection, execute o seguinte comando:
db.adminCommand( { rewriteCollection: "sales.orders" } )