Tous les produits
Search
Centre de documentation

Data Transmission Service:Comment nettoyer les documents orphelins dans un cluster MongoDB fragmenté

Dernière mise à jour :Sep 23, 2026

Vérifier la présence de documents orphelins

  1. Connectez-vous à l'instance de cluster fragmenté ApsaraDB for MongoDB à l'aide de Mongo Shell.

    Pour plus d'informations sur la connexion à ApsaraDB for MongoDB, consultez la rubrique Connexion à une instance de cluster fragmenté avec mongo shell.

  2. Exécutez la commande suivante pour basculer vers la base de données cible.

    use <db_name>
  3. Exécutez la commande suivante pour afficher les informations relatives aux documents orphelins.

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

    Pour chaque shard, vérifiez la sortie executionStats. Si le champ chunkSkips de l'étape SHARDING_FILTER n'est pas égal à 0, des documents orphelins existent sur le shard correspondant.

    L'exemple de retour ci-dessous montre que l'étape SHARDING_FILTER est précédée par l'étape FETCH, qui a renvoyé 102 documents (« nReturned » : 102). Ensuite, lors de l'étape SHARDING_FILTER, 2 documents orphelins ont été filtrés (« chunkSkips » : 2), et 100 documents ont finalement été renvoyés (« nReturned » : 100).

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

    Pour plus d'informations sur l'étape SHARDING_FILTER, consultez le manuel MongoDB.

Nettoyer les documents orphelins

Important

Si vous disposez de plusieurs bases de données, nettoyez les documents orphelins dans chacune d'elles.

ApsaraDB for MongoDB

Remarque

L'exécution du script de nettoyage sur une instance dont la version majeure est antérieure à MongoDB 4.2 ou dont la version mineure est antérieure à 4.0.6 génère une erreur. Pour consulter la version actuelle de votre instance, reportez-vous à la rubrique Versions mineures de MongoDB. Pour mettre à niveau la version majeure ou mineure, consultez les rubriques Mise à niveau de la version majeure d'une base de données et Mise à niveau de la version mineure d'une base de données.

Utilisez la commande cleanupOrphaned pour nettoyer les documents orphelins. La procédure diffère légèrement entre les versions MongoDB 4.4 et ultérieures, et les versions MongoDB 4.2 et antérieures.

MongoDB 4.4 et versions ultérieures

  1. Sur un serveur capable de se connecter à votre instance de cluster fragmenté, créez un script JavaScript (JS) nommé cleanupOrphaned.js.

    Remarque

    Ce script permet de nettoyer les documents orphelins de toutes les collections de plusieurs bases de données réparties sur plusieurs shards. Si vous devez nettoyer les documents orphelins d'une collection spécifique, vous pouvez modifier le script JS en conséquence.

    // 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);
                }
            });
        });
    });

    Dans le script, modifiez les valeurs des paramètres shardNames et databasesToProcess :

    • shardNames : tableau d'identifiants des shards dont vous souhaitez nettoyer les documents orphelins. Vous pouvez obtenir les identifiants des shards depuis la liste des shards sur la page Informations de base de l'instance. Par exemple : d-bp15a3796d3a****.

    • databasesToProcess : tableau des noms des bases de données dont vous souhaitez nettoyer les documents orphelins.

  2. Dans le répertoire contenant le script cleanupOrphaned.js, exécutez la commande suivante pour nettoyer les documents orphelins.

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

    Paramètre

    Description

    <Mongoshost>

    Adresse de connexion du nœud mongos de l'instance de cluster fragmenté. Exemple : s-bp14423a2a51****.mongodb.rds.aliyuncs.com.

    <Primaryport>

    Numéro de port du nœud mongos de l'instance de cluster fragmenté. La valeur par défaut est 3717.

    <database>

    Nom de la base de données d'authentification. Il s'agit de la base de données à laquelle appartient le compte de base de données.

    <username>

    Compte de base de données.

    <password>

    Mot de passe du compte de base de données.

    output.txt

    Fichier de sortie contenant les résultats de l'exécution.

MongoDB 4.2 et versions antérieures

  1. Sur un serveur capable de se connecter à votre instance de cluster fragmenté, créez un script JS nommé cleanupOrphaned.js.

    Remarque

    Ce script permet de nettoyer les documents orphelins d'une collection spécifiée dans une base de données donnée sur plusieurs shards. Pour nettoyer les documents orphelins de plusieurs collections, vous pouvez modifier le paramètre fullCollectionName et exécuter le script plusieurs fois, ou bien adapter le script pour qu'il itère automatiquement sur les collections.

    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);
    });

    Dans le script, modifiez les valeurs des paramètres shardNames et fullCollectionName :

    • shardNames : tableau d'identifiants des shards dont vous souhaitez nettoyer les documents orphelins. Vous pouvez obtenir les identifiants des shards depuis la liste des shards sur la page Informations de base de l'instance. Par exemple : d-bp15a3796d3a****.

    • fullCollectionName : nom de la collection dont vous souhaitez nettoyer les documents orphelins, au format database.collection.

  2. Dans le répertoire contenant le script cleanupOrphaned.js, exécutez la commande suivante pour nettoyer les documents orphelins.

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

    Paramètre

    Description

    <Mongoshost>

    Adresse de connexion du nœud mongos de l'instance de cluster fragmenté. Exemple : s-bp14423a2a51****.mongodb.rds.aliyuncs.com.

    <Primaryport>

    Numéro de port du nœud mongos de l'instance de cluster fragmenté. La valeur par défaut est 3717.

    <database>

    Nom de la base de données d'authentification. Il s'agit de la base de données à laquelle appartient le compte de base de données.

    <username>

    Compte de base de données.

    <password>

    Mot de passe du compte de base de données.

    output.txt

    Fichier de sortie contenant les résultats de l'exécution.

MongoDB auto-géré

  1. Sur un serveur capable de se connecter à votre base de données MongoDB auto-gérée, téléchargez le fichier de script cleanupOrphaned.js.

    wget "https://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/120562/cn_zh/1564451237979/cleanupOrphaned.js"
  2. Modifiez le fichier de script cleanupOrphaned.js. Remplacez test par le nom de la base de données dont vous souhaitez nettoyer les documents orphelins.

    Important

    Si vous disposez de plusieurs bases de données, vous devez répéter les étapes 2 et 3 pour chacune d'elles.

    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. Exécutez la commande suivante pour nettoyer les documents orphelins de toutes les collections de la base de données spécifiée sur un shard.

    Remarque

    Vous devez répéter cette étape pour chaque shard.

    mongo --host <Shardhost> --port <Primaryport>  --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.js
    Remarque
    • <Shardhost> : adresse IP du shard.

    • <Primaryport> : port de service du nœud primaire du shard.

    • <database> : nom de la base de données d'authentification. Il s'agit de la base de données à laquelle appartient le compte de base de données.

    • <username> : compte de base de données.

    • <password> : mot de passe du compte.

    Exemple :

    Dans cet exemple, la base de données MongoDB auto-gérée comporte trois shards. Vous devez exécuter la commande pour chacun des trois shards afin de nettoyer les documents orphelins.

    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

Dépannage

Si des curseurs inactifs (idleCursors) existent dans l'espace de noms des documents orphelins, le processus de nettoyage risque de ne pas aboutir. Dans ce cas, le journal mongod relatif aux documents orphelins contient les informations suivantes :

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

Connectez-vous à mongod via Mongo Shell et exécutez la commande suivante pour vérifier la présence de curseurs inactifs sur le shard actuel. Si des curseurs inactifs sont détectés, utilisez la commande restart mongod ou killCursors pour les supprimer tous, puis relancez le nettoyage des documents orphelins. Pour plus d'informations, consultez le ticket JIRA.

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