compactar
Definição
compact
Rewrites and defragments all data and indexes in a collection. On WiredTiger databases, this command will release unneeded disk space to the operating system.
Sintaxe
O comando tem a seguinte sintaxe:
db.runCommand( { compact: <collection name> } )
Campos de comando
O comando utiliza os seguintes campos:
Observação
Começando no MongoDB 4.2
O MongoDB remove o mecanismo de armazenamento MMAPv1 e as opções específicas de MMAPv1 paddingFactor
, paddingBytes
, preservePadding
para compact
.
Campo | Tipo | Descrição |
---|---|---|
compact | string | O nome da collection. |
force | bandeira | Opcional. Começando em v4.4, se especificado, força Começando em v4.4, |
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
.
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 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" ] } )
Comportamento
Bloqueio
compact
bloqueia estas operações:Todas as outras operações são permitidas.
A ordem de bloqueio muda.
Para executar compact
em um conjunto de réplicas, consulte Conjuntos de réplicas para obter considerações adicionais.
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 a operação com o método db.killOp()
ou reiniciar o servidor antes da conclusão da operação compact
, 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
oucompact
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.
Espaço em disco
Para ver como o espaço de armazenamento muda na collection, execute o comando collStats
antes e depois da compactação.
No WiredTiger, compact
tenta reduzir o espaço de armazenamento necessário 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.
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
compact
para os secundários.Você deve executar
compact
em nós secundários sempre que possível. Se você não puder executarcompact
nos secundários, consulte a opção force.A partir do MongoDB 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
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
O comportamento de bloqueio em nós secundários é específico da versão.
Versão | Comportamento de bloqueio |
4.4 |
|
Postar 4.4.17, 5.0.12 e 6.0.2 |
|
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.
Clusters fragmentados
compact
só se aplica a instâncias mongod
. Em um ambiente fragmentado, execute 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
.