Vérifier la présence de documents orphelins
-
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.
-
Exécutez la commande suivante pour basculer vers la base de données cible.
use <db_name> -
Exécutez la commande suivante pour afficher les informations relatives aux documents orphelins.
db.<coll_name>.find().explain("executionStats")RemarquePour chaque shard, vérifiez la sortie
executionStats. Si le champchunkSkipsde l'étapeSHARDING_FILTERn'est pas égal à 0, des documents orphelins existent sur le shard correspondant.L'exemple de retour ci-dessous montre que l'étape
SHARDING_FILTERest précédée par l'étapeFETCH, qui a renvoyé 102 documents (« nReturned » : 102). Ensuite, lors de l'étapeSHARDING_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
Si vous disposez de plusieurs bases de données, nettoyez les documents orphelins dans chacune d'elles.
ApsaraDB for MongoDB
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
-
Sur un serveur capable de se connecter à votre instance de cluster fragmenté, créez un script JavaScript (JS) nommé
cleanupOrphaned.js.RemarqueCe 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
shardNamesetdatabasesToProcess: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.
-
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.txtParamè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.txtFichier de sortie contenant les résultats de l'exécution.
MongoDB 4.2 et versions antérieures
-
Sur un serveur capable de se connecter à votre instance de cluster fragmenté, créez un script JS nommé
cleanupOrphaned.js.RemarqueCe 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
fullCollectionNameet 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
shardNamesetfullCollectionName: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 formatdatabase.collection.
-
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.txtParamè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.txtFichier de sortie contenant les résultats de l'exécution.
MongoDB auto-géré
-
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" -
Modifiez le fichier de script cleanupOrphaned.js. Remplacez
testpar le nom de la base de données dont vous souhaitez nettoyer les documents orphelins.ImportantSi 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); }); -
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.
RemarqueVous devez répéter cette étape pour chaque shard.
mongo --host <Shardhost> --port <Primaryport> --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.jsRemarque<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.jsmongo --host 172.16.1.11 --port 27021 --authenticationDatabase admin -u dtstest -p 'Test123456' cleanupOrphaned.jsmongo --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" } }] )