Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

compactar

Nesta página

  • Definição
  • Sintaxe
  • Campos de comando
  • compact Privilégios necessários
  • Comportamento
  • Exemplo
compact

Recompõ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.

O comando tem a seguinte sintaxe:

db.runCommand(
{
compact: <collection name>
}
)

O comando utiliza os seguintes campos:

Campo
Tipo
Descrição
compact
string
O nome da collection.
force
bandeira

Opcional. Se especificado, força compact a ser executado no primário em um conjunto de réplicas. compact não bloqueia operações CRUD do MongoDB no banco de dados que está compactando.

comment
qualquer

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).

Aviso

Tenha sempre uma cópia de segurança atualizada antes de executar a manutenção do servidor como a operação compact.

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:

  1. Crie uma custom role que concede a ação compact na collection do sistema.

  2. Conceda essa função a um usuário novo ou existente.

  3. 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 recurso.

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"
]
}
)

Para executar compact em um conjunto de réplicas, consulte Conjuntos de réplicas para obter considerações adicionais.

Para verificar o progresso da operação compact, monitore o arquivo de registro mongod ou execute db.currentOp() em outra instância do shell.

Se você encerrar a operação com o método do db.killOp() ou reiniciar o servidor antes que a operação do compact tenha finalizado, esteja ciente do seguinte:

  • Se você tiver o registro no diário ativado, os dados permanecerão válidos e utilizáveis, independentemente do estado da operação compact. Talvez seja necessário reconstruir manualmente os índices.

  • Se você não tiver diário habilitado e o mongod ou compact terminar durante a operação, é impossível garantir que os dados estejam em um estado válido.

  • Em ambos os casos, grande parte do espaço livre existente na collection pode se tornar inutilizável. Nesse cenário, você deve reexecutar a compactação para concluir para restaurar o uso deste espaço livre.

Para ver como o espaço de armazenamento muda na collection, execute o comando collStats antes e depois da compactação.

No WiredTiger, o compact tenta reduzir o espaço de armazenamento exigido para dados e índices em uma collection, liberando espaço em disco desnecessário para o sistema operacional. A eficácia desta operação depende da carga de trabalho e nenhum espaço em disco pode ser recuperado. Esse comando é útil se você tiver removido uma grande quantidade de dados da collection e não planeja substituí-los.

compact pode exigir espaço em disco adicional para ser executado em bancos de dados WiredTiger.

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 compact para os secundários.

  • Você deve executar compact em nós secundários sempre que possível. Se você não puder executar compact nos secundários, consulte a opção force .

  • A partir do MongoDB 6.1.0 (e 6.0.2 e 5.0.12):

    • Um nó secundário pode replicar enquanto compact estiver em execução.

    • Leituras permitidas.

Para executar compact em um cluster

1

Execute compact em um dos nós secundários. Quando compact terminar, repita a operação em cada um dos secundários restantes.

2

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.

3

Após descer, o antigo nó primário se torna um nó secundário. Execute compact no nó primário antigo.

  • Um nó secundário pode replicar enquanto compact estiver 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 obter informações sobre manutenção e disponibilidade do conjunto de réplicas, consulte Executar manutenção em membros do conjunto de réplicas.

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.

mongod reconstrói todos os índices em paralelo após a operação compact.

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 }
← CollMod