Definição
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: <string>, dryRun: <boolean>, force: <boolean>, // Optional freeSpaceTargetMB: <int>, // Optional comment: <any>, // Optional } )
Campos de comando
O comando utiliza os seguintes campos:
Campo | Tipo | Descrição |
|---|---|---|
| string | O nome da collection. |
| booleano | Novidades na versão 8.0. Se ativado, o comando Padrão: falso |
| booleano | Opcional. Se ativado, força |
| Inteiro | Opcional. Especifica a quantidade mínima de espaço de armazenamento, em megabytes, que deve ser recuperável para que a compactação continue. Padrão: 20 |
| 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 coleção de destino. As funções dbAdmin e hostManager fornecem os privilégios necessários para executar compact em coleções 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 dbAdmin, hostManager ou a função personalizada a um usuário existente, use db.grantRolesToUser() ou db.updateUser(). A seguinte operação concede a função personalizada compact 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ê encerrar compact com o método db.killOp() ou reiniciar o servidor antes do término da operação, compact será encerrado 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 consumido para dados e índices em uma collection liberando blocos obsoletos de volta para o sistema operacional. A eficácia do compact é relativa a quantos blocos estão disponíveis para serem liberados e onde estão os blocos 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. Para visualizar uma estimativa de quanto espaço o compact liberará, use a bandeira dryRun. Chamar compact em uma collection compactará a collection e seus índices associados.
compact podem exigir espaço em disco adicional para serem executados.
Considerações de desempenho
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.
Conjuntos de réplicas
Você pode usar compact em collections e índices armazenados em um replica set, mas há algumas considerações importantes:
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.
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.
Comandos compactos simultâneos não permitidos
Se você tentar executar vários comandos compact simultâneos na mesma coleção, o MongoDB retornará um erro.
Exemplo
Compactar uma coleção
A seguinte operação executa o comando compact na collection movies:
db.runCommand( { compact: "movies" } )
{ bytesFreed: 27859, ok: 1 }
Estimativa de compactação
A operação a seguir executa uma simulação do comando compact na coleção movies :
db.runCommand( { compact: "movies", dryRun: true } )
{ estimatedBytesFreed: 27859, ok: 1 }