Inserções, atualizações e exclusões de dados geram fragmentos de disco ao longo do tempo. Use o comando compact para recuperar esses fragmentos dos nós primários e secundários e melhorar a utilização do disco.
Recomendamos o recurso de análise de armazenamento para recuperar fragmentos de disco. Ele é mais simples e causa menor impacto no serviço. A análise de armazenamento recupera fragmentos apenas de nós ocultos. Para recuperar fragmentos de nós primários e secundários, execute primeiro um failover primário/secundário.
A análise de armazenamento está disponível nas seguintes versões do MongoDB:
MongoDB 8.0: todas as versões menores.
MongoDB 7.0: todas as versões menores.
MongoDB 6.0: todas as versões menores.
MongoDB 5.0: todas as versões menores.
MongoDB 4.4: 5.0.7 ou posterior.
MongoDB 4.2: 4.0.23 ou posterior.
Pré-requisitos
A instância deve usar o mecanismo de armazenamento WiredTiger.
Observações de uso
Backup de dados: Faça backup do banco de dados antes de recuperar fragmentos.
-
Impacto do comando compact :
O comando compact reescreve e desfragmenta todos os dados e índices de uma coleção para recuperar espaço não utilizado.
-
Bloqueio de leitura/gravação e impacto no desempenho
Em versões anteriores ao MongoDB 4.4, o comando
compactbloqueia o banco de dados e impede todas as operações de leitura e gravação. Coleções muito fragmentadas podem prolongar a execução do comandocompacte aumentar a latência de replicação em nós ocultos. Execute essa operação fora do horário de pico, aumente o tamanho do oplog ou atualize a versão principal para o MongoDB 4.4 ou posterior antes de recuperar fragmentos.No MongoDB 4.4 e posteriores, o comando
compactnão bloqueia operações de leitura e gravação, mas ainda pode afetar o desempenho. Execute essa operação fora do horário de pico.
-
Reconstrução de nó
No MongoDB 3.4, 4.0, 4.2 (4.0.22 ou anterior) ou 4.4 (5.0.6 ou anterior), um nó que executa
compactentra no estado RECOVERING. Se a operação demorar demais, a verificação de integridade pode considerar o nó não íntegro e acionar a reconstrução do nó. Consulte as Notas de lançamento de versões menores do MongoDB.Nas versões posteriores do MongoDB, um nó que executa
compactpermanece no estado SECONDARY e não aciona a reconstrução do nó.
-
-
Comando compact ineficaz:
O comando
compactpode ser ineficaz nos seguintes cenários (block_compact):O tamanho de armazenamento físico da coleção é inferior a 1 MB.
A taxa de fragmentação é inferior a 20%.
Há menos de 20% de espaço livre nos primeiros 80% do arquivo de dados ou menos de 10% de espaço livre nos primeiros 90% do arquivo de dados.
Tempo de recuperação: O tempo de execução do
compactdepende do volume de dados e da carga do sistema.-
Outras observações:
O espaço recuperado pelo
compactpode ser menor que o espaço livre total. Certifique-se de que a operaçãocompactanterior foi concluída antes de iniciar uma nova.O comando
compactpode ser executado mesmo quando uma instância está bloqueada devido ao espaço em disco cheio.
Formação: Quando dados são excluídos, o espaço de armazenamento é marcado como livre. Novos dados podem reutilizar esse espaço ou ser anexados ao final do arquivo. Isso cria bolsões de espaço não utilizado conhecidos como fragmentos de disco.
Impacto: Mais fragmentos significam menor utilização efetiva do disco. Por exemplo, em um disco de 100 GB com 20 GB de fragmentos e 60 GB de dados ativos, a utilização relatada é de 80% (80 GB/100 GB), mas a utilização efetiva é de apenas 60% (60 GB/100 GB).
-
Após excluir um grande volume de dados
Ao excluir um grande número de documentos, o espaço liberado não retorna ao sistema operacional, mas fica reservado para gravações futuras. Isso pode deixar um espaço fragmentado significativo no disco.
ImportanteNem a exclusão manual nem a expiração de TTL recuperam automaticamente fragmentos de disco. Recupere o espaço manualmente.
-
Após cargas de trabalho de alta escrita prolongadas
Cargas de trabalho sustentadas de alta escrita (inserções, atualizações e exclusões frequentes) acumulam gradualmente espaço fragmentado no disco.
-
Quando o espaço em disco está baixo e a fragmentação excede 20%
Quando a utilização do disco atinge 85% a 90% ou mais, recuperar fragmentos pode liberar espaço e reduzir a pressão de armazenamento.
size: O tamanho de armazenamento lógico da coleção.storageSize: O tamanho de armazenamento físico da coleção.freeStorageSize: O espaço livre recuperável dentro da coleção. Disponível no MongoDB 4.4 e posteriores.-
Conecte-se à sua instância do ApsaraDB for MongoDB usando o mongo shell. Para instâncias de conjunto de réplicas, conecte-se a um nó secundário para minimizar o impacto no serviço. Instruções de conexão:
-
Mude para o banco de dados que contém a coleção.
Sintaxe:
use <database_name>Descrição do parâmetro:
<database_name>é o nome do banco de dados que contém a coleção.NotaExecute o comando
show dbspara consultar os bancos de dados existentes.Exemplo:
Mude para o banco de dados test_database.
use test_database -
Verifique a quantidade de espaço de fragmento de disco recuperável para a coleção.
Sintaxe:
db.<collection_name>.stats().wiredTiger["block-manager"]["file bytes available for reuse"]Descrição do parâmetro:
<collection_name>é o nome da coleção.NotaExecute o comando
show tablespara consultar as coleções existentes.Exemplo:
db.test_database_collection.stats().wiredTiger["block-manager"]["file bytes available for reuse"]O seguinte resultado é retornado:
207806464Essa saída indica que o espaço recuperável estimado é de 207.806.464 bytes.
Uma instância standalone possui um único nó. Conecte-se a ela e execute o comando
compactpara recuperar fragmentos de disco.-
Uma instância de conjunto de réplicas possui vários nós. Recupere fragmentos tanto dos nós primários quanto dos secundários.
ImportantePara minimizar o impacto no serviço, recupere fragmentos dos nós secundários primeiro. Em seguida, execute um failover primário/secundário e recupere fragmentos do antigo nó primário (agora secundário).
Se a instância de conjunto de réplicas tiver nós somente leitura, recupere também os fragmentos de disco deles. O comando é o mesmo usado para nós primários e secundários.
-
Conecte-se à instância usando o mongo shell. Instruções de conexão:
-
Mude para o banco de dados que contém a coleção.
Sintaxe:
use <database_name>Descrição do parâmetro:
<database_name>é o nome do banco de dados que contém a coleção.NotaExecute o comando
show dbspara consultar os bancos de dados existentes.Exemplo:
Mude para o banco de dados replica_database.
use replica_database -
Visualize o espaço em disco ocupado pelo banco de dados antes de recuperar fragmentos de disco.
db.stats()NotaCopie e execute este comando sem modificações.
-
Recupere fragmentos de disco da coleção.
Sintaxe:
db.runCommand({compact:"<collection_name>",force:true})Parâmetros:
-
<collection_name>: O nome da coleção.NotaExecute o comando
show tablespara consultar as coleções existentes. -
force: Opcional. O valor deve sertrue.Este parâmetro é obrigatório se você executar este comando no nó primário de uma instância do ApsaraDB for MongoDB com versão 4.2 ou anterior.
Exemplo:
db.runCommand({compact:"sharded_collection"})Uma operação bem-sucedida retorna o seguinte resultado:
{ "ok" : 1 } -
-
Visualize o espaço em disco ocupado pelo banco de dados após recuperar fragmentos de disco.
db.stats()NotaCopie e execute este comando sem modificações.
Conecte-se à instância de cluster fragmentado usando o mongo shell. Conectar-se a uma instância de cluster fragmentado usando o mongo shell.
-
Mude para o banco de dados que contém a coleção.
Sintaxe:
use <database_name>Descrição do parâmetro:
<database_name>é o nome do banco de dados que contém a coleção.NotaExecute o comando
show dbspara consultar os bancos de dados existentes.Exemplo:
Mude para o banco de dados sharded_database.
use sharded_database -
Visualize o espaço em disco ocupado pelo banco de dados antes de recuperar fragmentos de disco.
db.stats()NotaCopie e execute este comando sem modificações.
-
Recupere fragmentos de disco da coleção.
Recupere fragmentos tanto dos nós primários quanto dos secundários em cada shard.
ImportantePara minimizar o impacto no serviço, recupere fragmentos dos nós secundários primeiro. Em seguida, execute um failover primário/secundário e recupere fragmentos do antigo nó primário (agora secundário).
-
Recupere fragmentos de disco dos nós secundários no componente de shard.
O comando difere entre mongo shell e mongosh. Selecione a aba correspondente ao seu cliente.
NotaO Mongosh 2.x adiciona um parâmetro para especificar a preferência de leitura, diferentemente do mongosh 1.x.
Mongo shell
Sintaxe:
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"},$queryOptions: {$readPreference: {mode: 'secondary'}}})Parâmetros:
-
<Shard ID>: O ID do componente de shard.NotaFaça login no console do MongoDB. Na página Basic Information da instância de destino, localize o ID do componente de shard na seção Shard List.
-
<collection_name>: O nome da coleção.NotaExecute o comando
show tablespara consultar as coleções existentes.
Exemplo:
db.runCommand({runCommandOnShard:"shard01","command":{compact:"sharded_collection"},$queryOptions: {$readPreference: {mode: 'secondary'}}})Mongosh 1.x
Sintaxe:
db.getMongo().setReadPref('secondary') db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"}})Parâmetros:
-
<Shard ID>: O ID do componente de shard.NotaFaça login no console do MongoDB. Na página Basic Information da instância de destino, localize o ID do componente de shard na seção Shard List.
-
<collection_name>: O nome da coleção.NotaExecute o comando
show tablespara consultar as coleções existentes.
Exemplo:
db.getMongo().setReadPref('secondary') db.runCommand({runCommandOnShard:"d-2ze91ae9d55d6604","command":{compact:"test"}})Mongosh 2.x
Sintaxe:
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"}},{readPreference: "secondary"})Parâmetros:
-
<Shard ID>: O ID do componente de shard.NotaFaça login no console do MongoDB. Na página Basic Information da instância de destino, localize o ID do componente de shard na seção Shard List.
-
<collection_name>: O nome da coleção.NotaExecute o comando
show tablespara consultar as coleções existentes.
Exemplo:
db.runCommand({runCommandOnShard:"d-2ze657bce53fb6d4","command":{compact:"test_collection"}}, { readPreference: "secondary" }) -
-
Recupere fragmentos de disco do nó primário no componente de shard.
Sintaxe:
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>",force:true}})Parâmetros:
-
<Shard ID>: O ID do componente de shard.NotaFaça login no console do MongoDB. Na página Basic Information da instância de destino, localize o ID do componente de shard na seção Shard List.
-
<collection_name>: O nome da coleção.NotaExecute o comando
show tablespara consultar as coleções existentes. -
force: Opcional. O valor deve sertrue.Este parâmetro é obrigatório se sua instância de cluster fragmentado estiver executando a versão 4.2 ou anterior.
Exemplo:
db.runCommand({runCommandOnShard:"shard01","command":{compact:"sharded_collection",force:true}}) -
-
-
Visualize o espaço em disco ocupado pelo banco de dados após recuperar fragmentos de disco.
db.stats()NotaCopie e execute este comando sem modificações.
Informações básicas
Por que ocorrem fragmentos de disco?
Quando recuperar fragmentos de disco
Visualize espaço de armazenamento em disco
Visualize status de armazenamento da coleção
Execute o comando db.runCommand({collStats: <collection_name>}) para visualizar o status de armazenamento. Principais campos de saída:
Após excluir documentos com o comando remove, o size diminui, mas o storageSize pode não diminuir. Uma proporção alta de freeStorageSize para storageSize indica alta fragmentação.
Esses campos (size, storageSize, freeStorageSize) estão documentados em collStats-Output.
Estimar espaço recuperável
Recuperar fragmentos de disco
Instâncias standalone ou de conjunto de réplicas
Instâncias de cluster fragmentado
Para uma instância de cluster fragmentado, recupere fragmentos de disco apenas dos nós de shard. Os componentes mongos e config server não armazenam dados do usuário, portanto, recuperar seus fragmentos é desnecessário.
O comando compact não é suportado em nós somente leitura de uma instância de cluster fragmentado.
Perguntas frequentes
P: O comando falha com "Compaction interrupted on table:xxx due to cache eviction pressure' on server xxx."
R: Instâncias mais antigas e de especificações pequenas podem sair prematuramente durante o compact devido à pressão do cache. Execute essa operação fora do horário de pico.