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 comando compact não bloqueia 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 o compact com o método db.killOp() ou reiniciar o servidor antes que a operação termine, o compact será encerrado. A operação pode não liberar espaço em disco de volta para o sistema operacional.
Espaço em disco
O comando compact reduz 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, trabalhando em segmentos do arquivo de dados em cada passagem. Para estimar quanto espaço compact libera, use o sinalizador 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.
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. Considere o seguinte:
O nó primário não replica o comando
compactpara os secundários.Execute
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 de índice entre membros
Cada nó aplica gravações em seus índices de forma independente. O tamanho do armazenamento do índice pode diferir entre os membros de um conjunto de réplicas, mesmo quando os membros contêm dados idênticos. Um nó primary aplica gravações diretamente de operações do cliente . Um nó secundário aplica as mesmas gravações do oplog, geralmente em lotes e ordem diferentes. Essas diferenças no padrão de gravação alteram a forma como o mecanismo de armazenamento empacota e comprime páginas de índice. Como resultado, um índice em um membro pode ficar maior no disco do que o mesmo índice em outro membro.
Para alinhar um índice afetado de volta com o mesmo índice em outros membros, use uma das seguintes opções de correção:
Execute
compactno nó afetado.Execute uma sincronização inicial do nó afetado.
Descarte e recrie 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 membros.
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
Observação
Os exemplos a seguir incluem force: true, que é necessário ao executar compact em um primário de conjunto de réplicas ativo. Para executar compact sem force: true, diminua o primário primeiro. Para obter mais informações, consulte Conjunto de réplicas.
Compactar uma coleção
A seguinte operação executa o comando compact na collection movies:
db.runCommand( { compact: "movies", force: true } )
{ bytesFreed: "...", 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, force: true } )
{ estimatedBytesFreed: "...", ok: 1 }