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). |
Observação
O compact comando não bloqueia operações de operações CRUD do MongoDB no banco de dados que está compactando.
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 coleção compacta a coleção 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 }