Definição
compactRecompõe e desfragmenta todos os dados e índices em uma collection. Em bancos de dados WiredTiger, este comando libera espaço em disco desnecessário para o sistema operacional.
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
Importante
Esse comando não é suportado em clusters M0 e Flex. Para obter mais informações, 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.runCommand( { compact: <collection name> } )
Campos de comando
O comando utiliza os seguintes campos:
Campo | Tipo | Descrição |
|---|---|---|
| string | O nome da collection. |
| flag | Opcional. Se especificado, força |
| any | Opcional. Um comentário fornecido pelo usuário para anexar a este comando. Depois de definido, esse comentário aparece junto com os registros desse comando nos seguintes locais:
Um comentário pode ser qualquer tipo BSON válido (string, inteiro, objeto, array etc). |
compact Privilégios necessários
Para clusters que impõem autenticação, você deve se autenticar como usuário com a ação de privilégio compact na collection de destino. A função dbAdmin fornece os privilégios necessários para executar compact em collection que não são do sistema.
Para collections do sistema, você deve:
Crie uma custom role que concede a ação
compactna collection do sistema.Conceda essa função a um usuário novo ou existente.
Autentique como este usuário para executar o comando
compact.
Por exemplo, as operações a seguir criam uma função personalizada que concede a ação compact em relação ao banco de dados e à collection especificados:
use admin db.createRole( { role: "myCustomCompactRole", privileges: [ { resource: { "db" : "<database>" , "collection" : "<collection>" }, actions: [ "compact" ] } ], roles: [] } )
Para obter mais informações sobre como configurar o documento resource , consulte Documento de recursos sobre implantações autogerenciadas.
Para adicionar o dbAdmin ou o custom role para um usuário existente, utilize db.grantRolesToUser() ou db.updateUser(). A seguinte operação concede o custom compact role para o myCompactUser no banco de dados do admin:
use admin db.grantRolesToUser("myCompactUser", [ "dbAdmin" | "myCustomCompactRole" ] )
Para adicionar o dbAdmin ou o papel personalizado para um novo usuário, especifique o papel para a array roles do método db.createUser() ao criar o usuário.
use admin db.createUser( { user: "myCompactUser", pwd: "myCompactUserPassword", roles: [ { role: "dbAdmin", db: "<database>" } | "myCustomCompactRole" ] } )
Comportamento
Monitoramento do progresso
Para verificar o progresso da operação compact, monitore o arquivo de registro mongod ou execute db.currentOp() em outra instância do shell.
Encerramento da operação
Se você reiniciar o servidor antes da conclusão de compact, a operação será encerrada e poderá falhar na tentativa de liberar espaço em disco de volta para o sistema operacional.
Espaço em disco
O comando compact tenta reduzir o espaço em disco para dados e índices em uma coleção, liberando blocos obsoletos para o sistema operacional. A eficácia depende de quantos blocos estão disponíveis para liberação e sua localização no arquivo de dados.
Para ver como o espaço de armazenamento muda na collection, execute o collStats comando antes e depois da compactação. Você pode usar a métrica collStats.freeStorageSize de saída para visualizar a quantidade de armazenamento disponível para reutilização.
A operação é iterativa e opera em segmentos do arquivo de dados em cada passagem. Chamar compact em uma coleção compacta a coleção e seus índices associados.
compact podem exigir espaço em disco adicional para serem executados.
Backups
A compactação verifica regularmente o banco de dados, o que pode levar à sobrecarga de sincronização. Em bancos de dados de alto tráfego, isso pode atrasar ou impedir tarefas operacionais, como fazer backups. Para evitar interrupções inesperadas, desative a compactação antes de fazer um backup.
Transações multi-shard
Observação
Se a sua implementação utiliza leituras secundárias e transações multi-shard, considere executar uma sincronização inicial em vez de compact.
Quando compact é executado, o WiredTiger ajusta temporariamente a estratégia do gerenciador de blocos para acomodar a carga de trabalho compacta. Esse ajuste pode deixar as operações de checkpoint mais lentas e aumentar o tempo que um nó leva para confirmar uma transação. As confirmações atrasadas de transações podem causar latência de leitura significativa, atraso de replicação e filas operacionais.
Conjuntos de réplicas
Você pode usar compact em coleções e índices em um conjunto de réplicas; no entanto, considere o seguinte:
O nó primário não replica o comando
compactpara os secundários.Você deve executar
compactem nós secundários sempre que possível. Se você não puder executarcompactnos secundários, consulte a opção force.Começando no MongoDB 6.1.0 (e 6.0.2):
Um nó secundário pode replicar enquanto
compactestiver em execução.Leituras permitidas.
Para executar compact em um cluster
Reatribuir o nó primário.
Para descer o primário atual e acionar uma eleição, utilize o método rs.stepDown(). Para indicar um nó secundário específico, ajuste a prioridade do membro.
Considerações Específicas de Versão para Nós Secundários
Um nó secundário pode replicar enquanto
compactestiver em execução.Leituras permitidas.
Enquanto o comando compact estiver em execução, o conjunto de réplicas permanecerá em um status SECONDARY.
Para obter mais informações sobre os estados membros do conjunto de réplicas, consulte Estados membros do conjunto de réplicas.
Para manutenção e disponibilidade do conjunto de réplicas, consulte Executar manutenção em membros do conjunto de réplicas autogerenciadas.
Diferenças de tamanho do índice entre os nós
Cada nó aplica gravações aos seus índices de forma independente. O tamanho do armazenamento do índice pode diferir entre os nós de um conjunto de réplicas, mesmo quando os nós contêm dados idênticos. Um nó primário aplica gravações diretamente das operações do cliente. Um nó secundário aplica as mesmas gravações do oplog, geralmente em diferentes lotes e ordem. Essas diferenças de padrão de gravação alteram a forma como o mecanismo de armazenamento empacota e compacta as páginas de índice. Como resultado, um índice em um nó pode crescer mais no disco do que o mesmo índice em outro nó.
Para alinhar um índice afetado com o mesmo índice em outros nós, use uma das seguintes opções de remediação:
Execute
compactno nó afetado.Execute uma sincronização inicial do nó afetado.
Descartar e recriar o índice afetado.
Ao planejar a capacidade de armazenamento para um conjunto de réplicas, considere essa variação no tamanho do índice entre os nós.
Clusters fragmentados
compact aplica-se apenas a mongod instâncias. Em um ambiente fragmentado, execute o compact em cada shard separadamente como uma operação de manutenção.
Você não pode emitir compact em relação a uma instância mongos.
Construção de Índices
mongod reconstrói todos os índices em paralelo após a operação compact.
Exemplo
A seguinte operação executa o comando compact na collection movies:
db.runCommand( { compact: "movies" } )
A execução de compact retorna uma saída semelhante a esta:
{ bytesFreed: 27859, ok: 1 }