Todos os produtos
Search
Central de documentação

ApsaraDB for MongoDB:Recuperar fragmentos de disco

Última atualização: Jun 26, 2026

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 compact bloqueia 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 comando compact e 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 compact nã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 compact entra 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 compact permanece no estado SECONDARY e não aciona a reconstrução do nó.

  • Comando compact ineficaz:

    O comando compact pode 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 compact depende do volume de dados e da carga do sistema.

    • Outras observações:

      • O espaço recuperado pelo compact pode ser menor que o espaço livre total. Certifique-se de que a operação compact anterior foi concluída antes de iniciar uma nova.

      • O comando compact pode ser executado mesmo quando uma instância está bloqueada devido ao espaço em disco cheio.

    Informações básicas

    Por que ocorrem fragmentos de disco?

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

    Quando recuperar fragmentos de disco

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

      Importante

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

    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:

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

    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.

    Nota

    Esses campos (size, storageSize, freeStorageSize) estão documentados em collStats-Output.

    Estimar espaço recuperável

    1. 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:

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

      Nota

      Execute o comando show dbs para consultar os bancos de dados existentes.

      Exemplo:

      Mude para o banco de dados test_database.

      use test_database
    3. 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.

      Nota

      Execute o comando show tables para consultar as coleções existentes.

      Exemplo:

      db.test_database_collection.stats().wiredTiger["block-manager"]["file bytes available for reuse"]

      O seguinte resultado é retornado:

      207806464

      Essa saída indica que o espaço recuperável estimado é de 207.806.464 bytes.

    Recuperar fragmentos de disco

    Instâncias standalone ou de conjunto de réplicas

    • Uma instância standalone possui um único nó. Conecte-se a ela e execute o comando compact para 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.

      Importante
      • Para 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.

    1. Conecte-se à instância usando o mongo shell. Instruções de conexão:

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

      Nota

      Execute o comando show dbs para consultar os bancos de dados existentes.

      Exemplo:

      Mude para o banco de dados replica_database.

      use replica_database
    3. Visualize o espaço em disco ocupado pelo banco de dados antes de recuperar fragmentos de disco.

      db.stats()
      Nota

      Copie e execute este comando sem modificações.

    4. Recupere fragmentos de disco da coleção.

      Sintaxe:

      db.runCommand({compact:"<collection_name>",force:true})

      Parâmetros:

      • <collection_name>: O nome da coleção.

        Nota

        Execute o comando show tables para consultar as coleções existentes.

      • force: Opcional. O valor deve ser true.

        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 }
    5. Visualize o espaço em disco ocupado pelo banco de dados após recuperar fragmentos de disco.

      db.stats()
      Nota

      Copie e execute este comando sem modificações.

    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.

    Nota

    O comando compact não é suportado em nós somente leitura de uma instância de cluster fragmentado.

    1. Conecte-se à instância de cluster fragmentado usando o mongo shell. Conectar-se a uma instância de cluster fragmentado usando o mongo shell.

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

      Nota

      Execute o comando show dbs para consultar os bancos de dados existentes.

      Exemplo:

      Mude para o banco de dados sharded_database.

      use sharded_database
    3. Visualize o espaço em disco ocupado pelo banco de dados antes de recuperar fragmentos de disco.

      db.stats()
      Nota

      Copie e execute este comando sem modificações.

    4. Recupere fragmentos de disco da coleção.

      Recupere fragmentos tanto dos nós primários quanto dos secundários em cada shard.

      Importante

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

        Nota

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

          Nota

          Faç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.

          Nota

          Execute o comando show tables para 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.

          Nota

          Faç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.

          Nota

          Execute o comando show tables para 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.

          Nota

          Faç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.

          Nota

          Execute o comando show tables para 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.

          Nota

          Faç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.

          Nota

          Execute o comando show tables para consultar as coleções existentes.

        • force: Opcional. O valor deve ser true.

          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}})
    5. Visualize o espaço em disco ocupado pelo banco de dados após recuperar fragmentos de disco.

      db.stats()
      Nota

      Copie e execute este comando sem modificações.

    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.