Todos os produtos
Search
Central de documentação

Data Transmission Service:Como limpar documentos órfãos em um cluster sharded do MongoDB

Última atualização: Sep 23, 2026

Verificar documentos órfãos

  1. Conecte-se à instância de cluster sharded do ApsaraDB for MongoDB usando o Mongo Shell.

    Para saber como se conectar ao ApsaraDB for MongoDB, consulte Connect to a sharded cluster instance by using the mongo shell.

  2. execute o comando a seguir para alternar para o banco de dados de destino.

    use <db_name>
  3. execute o comando a seguir e visualize informações sobre documentos órfãos.

    db.<coll_name>.find().explain("executionStats")
    Nota

    Para cada shard, verifique a saída executionStats. Se o campo chunkSkips do estágio SHARDING_FILTER não for 0, há documentos órfãos no shard correspondente.

    O exemplo de retorno a seguir mostra que o estágio FETCH precede o estágio SHARDING_FILTER e retornou 102 documentos ("nReturned" : 102). Em seguida, o estágio SHARDING_FILTER filtrou 2 documentos órfãos ("chunkSkips" : 2) e retornou 100 documentos no final ("nReturned" : 100).

    "stage" : "SHARDING_FILTER",
    "nReturned" : 100,
    ......
    "chunkSkips" : 2,
    "inputStage" : {
        "stage" : "FETCH",
        "nReturned" : 102,

    Para mais informações sobre o estágio SHARDING_FILTER, consulte o Manual do MongoDB.

Limpar documentos órfãos

Importante

Se você tiver vários bancos de dados, limpe os documentos órfãos em cada um deles.

ApsaraDB for MongoDB

Nota

execute o script de limpeza em uma instância com versão principal anterior ao MongoDB 4.2 ou versão secundária anterior a 4.0.6 gera um erro. visualize a versão atual da instância, consulte MongoDB minor versions. Para atualizar a versão principal ou a secundária, consulte Upgrade the major version of a database e Upgrade the minor version of a database.

Use o comando cleanupOrphaned para limpar documentos órfãos. O procedimento difere ligeiramente entre o MongoDB 4.4 e versões posteriores e o MongoDB 4.2 e versões anteriores.

MongoDB 4.4 and later

  1. Em um servidor que possa se conectar à instância de cluster sharded, crie um script JavaScript (JS) chamado cleanupOrphaned.js.

    Nota

    Este script limpa documentos órfãos de todas as coleções em vários bancos de dados e em múltiplos shards. Para limpar documentos órfãos de uma coleção específica, modifique o script JS.

    // List of shard names
    var shardNames = ["shardName1", "shardName2"];
    // List of databases
    var databasesToProcess = ["database1", "database2", "database3"];
    shardNames.forEach(function(shardName) {
        // Iterate over the specified list of databases
        databasesToProcess.forEach(function(dbName) {
            var dbInstance = db.getSiblingDB(dbName);
            // Get the names of all collections in the database instance
            var collectionNames = dbInstance.getCollectionNames();
            // Iterate over each collection
            collectionNames.forEach(function(collectionName) {
                // The full collection name
                var fullCollectionName = dbName + "." + collectionName;
                // Build the cleanupOrphaned command
                var command = {
                    runCommandOnShard: shardName,
                    command: { cleanupOrphaned: fullCollectionName }
                };
                // Execute the command
                var result = db.adminCommand(command); 
                if (result.ok) {
                    print("Cleaned up orphaned documents for collection " + fullCollectionName + " on shard " + shardName);
                    printjson(result);
                } else {
                    print("Failed to clean up orphaned documents for collection " + fullCollectionName + " on shard " + shardName);
                }
            });
        });
    });

    No script, modifique os valores dos parâmetros shardNames e databasesToProcess:

    • shardNames: uma matriz de IDs dos shards de onde você limpará documentos órfãos. Obtenha os IDs dos shards na Shard List, na página Basic Information da instância. Exemplo: d-bp15a3796d3a****.

    • databasesToProcess: uma matriz de nomes dos bancos de dados de onde você limpará documentos órfãos.

  2. No diretório do script cleanupOrphaned.js, execute o comando a seguir para limpar os documentos órfãos.

    mongo --host <Mongoshost> --port <Primaryport>  --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.js > output.txt

    Parâmetro

    Descrição

    <Mongoshost>

    O endereço de conexão do nó mongos da instância do cluster sharded. Exemplo: s-bp14423a2a51****.mongodb.rds.aliyuncs.com.

    <Primaryport>

    O número da porta do nó mongos da instância do cluster sharded. O valor padrão é 3717.

    <database>

    O nome do banco de dados de autenticação, ou seja, o banco de dados ao qual a conta pertence.

    <username>

    A conta do banco de dados.

    <password>

    A senha da conta.

    output.txt

    O arquivo de saída dos resultados da execução.

MongoDB 4.2 and earlier

  1. Em um servidor que possa se conectar à instância de cluster sharded, crie um script JS chamado cleanupOrphaned.js.

    Nota

    Este script limpa documentos órfãos de uma coleção específica em um banco de dados específico em múltiplos shards. Para limpar documentos órfãos de várias coleções, modifique o parâmetro fullCollectionName e execute o script várias vezes, ou altere o script para iterar pelas coleções.

    function cleanupOrphanedOnShard(shardName, fullCollectionName) {
        var nextKey = { };
        var result;
        while ( nextKey != null ) {
            var command = {
                runCommandOnShard: shardName,
                command: { cleanupOrphaned: fullCollectionName, startingFromKey: nextKey }
            };
            result = db.adminCommand(command);
            printjson(result);
            if (result.ok != 1 || !(result.results.hasOwnProperty(shardName)) || result.results[shardName].ok != 1 ) {
                print("Unable to complete at this time: failure or timeout.")
                break
            }
            nextKey = result.results[shardName].stoppedAtKey;
        }
        print("cleanupOrphaned done for coll: " + fullCollectionName + " on shard: " + shardName)
    }
    var shardNames = ["shardName1", "shardName2", "shardName3"]
    var fullCollectionName = "database.collection"
    shardNames.forEach(function(shardName) {
        cleanupOrphanedOnShard(shardName, fullCollectionName);
    });

    No script, modifique os valores dos parâmetros shardNames e fullCollectionName:

    • shardNames: uma matriz de IDs dos shards de onde você limpará documentos órfãos. Obtenha os IDs dos shards na Shard List, na página Basic Information da instância. Exemplo: d-bp15a3796d3a****.

    • fullCollectionName: o nome da coleção de onde você limpará documentos órfãos, no formato database.collection.

  2. No diretório do script cleanupOrphaned.js, execute o comando a seguir para limpar os documentos órfãos.

    mongo --host <Mongoshost> --port <Primaryport>  --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.js > output.txt

    Parâmetro

    Descrição

    <Mongoshost>

    O endereço de conexão do nó mongos da instância do cluster sharded. Exemplo: s-bp14423a2a51****.mongodb.rds.aliyuncs.com.

    <Primaryport>

    O número da porta do nó mongos da instância do cluster sharded. O valor padrão é 3717.

    <database>

    O nome do banco de dados de autenticação, ou seja, o banco de dados ao qual a conta pertence.

    <username>

    A conta do banco de dados.

    <password>

    A senha da conta.

    output.txt

    O arquivo de saída dos resultados da execução.

Self-managed MongoDB

  1. Em um servidor que possa se conectar ao banco de dados MongoDB auto-gerenciado, baixe o arquivo de script cleanupOrphaned.js.

    wget "https://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/120562/cn_zh/1564451237979/cleanupOrphaned.js"
  2. modifique o arquivo de script cleanupOrphaned.js. Substitua test pelo nome do banco de dados do qual você limpará os documentos órfãos.

    Importante

    Se houver vários bancos de dados, repita a Etapa 2 e a Etapa 3 para cada um.

    function cleanupOrphaned(coll) {
      var nextKey = { };
      var result;
      while ( nextKey != null ) {
        result = db.adminCommand( { cleanupOrphaned: coll, startingFromKey: nextKey } );
        if (result.ok != 1)
           print("Unable to complete at this time: failure or timeout.")
        printjson(result);
        nextKey = result.stoppedAtKey;
      }
    }
    var dbName = "test"
    db = db.getSiblingDB(dbName)
    db.getCollectionNames().forEach(function(collName) {
            cleanupOrphaned(dbName + "." + collName);
    });
  3. Execute o comando a seguir para limpar documentos órfãos de todas as coleções do banco de dados especificado em um shard.

    Nota

    Repita esta etapa para cada shard.

    mongo --host <Shardhost> --port <Primaryport>  --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.js
    Nota
    • <Shardhost>: o endereço IP do shard.

    • <Primaryport>: a porta de service do nó primário no shard.

    • <database>: o nome do banco de dados de autenticação, ou seja, o banco de dados ao qual a conta pertence.

    • <username>: a conta do banco de dados.

    • <password>: a senha da conta.

    Exemplo:

    Neste exemplo, o banco de dados MongoDB auto-gerenciado tem três shards. execute o comando para cada shard para limpar os documentos órfãos.

    mongo --host 172.16.1.10 --port 27018  --authenticationDatabase admin -u dtstest -p 'Test123456' cleanupOrphaned.js
    mongo --host 172.16.1.11 --port 27021 --authenticationDatabase admin -u dtstest -p 'Test123456' cleanupOrphaned.js
    mongo --host 172.16.1.12 --port 27024  --authenticationDatabase admin -u dtstest -p 'Test123456' cleanupOrphaned.js

Solução de problemas

Se houver idleCursors no namespace dos documentos órfãos, o processo de limpeza poderá não ser concluído. Nesse caso, o log do mongod para os documentos órfãos conterá as seguintes informações:

Deletion of DATABASE.COLLECTION range [{ KEY: VALUE1 }, { KEY: VALUE2 }) will be scheduled after all possibly dependent queries finish

Conecte-se ao mongod por meio do Mongo Shell e execute o comando a seguir para verificar se há idleCursors no shard atual. Se houver idleCursors, use o comando restart mongod ou killCursors para limpar todos os idleCursors e, em seguida, limpe os documentos órfãos novamente. Para mais informações, consulte o ticket no JIRA.

db.getSiblingDB("admin").aggregate( [{ $currentOp : { allUsers: true, idleCursors: true } },{ $match : { type: "idleCursor" } }] )