Verificar documentos órfãos
-
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.
-
execute o comando a seguir para alternar para o banco de dados de destino.
use <db_name> -
execute o comando a seguir e visualize informações sobre documentos órfãos.
db.<coll_name>.find().explain("executionStats")NotaPara cada shard, verifique a saída
executionStats. Se o campochunkSkipsdo estágioSHARDING_FILTERnão for 0, há documentos órfãos no shard correspondente.O exemplo de retorno a seguir mostra que o estágio
FETCHprecede o estágioSHARDING_FILTERe retornou 102 documentos ("nReturned" : 102). Em seguida, o estágioSHARDING_FILTERfiltrou 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
Se você tiver vários bancos de dados, limpe os documentos órfãos em cada um deles.
ApsaraDB for MongoDB
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
-
Em um servidor que possa se conectar à instância de cluster sharded, crie um script JavaScript (JS) chamado
cleanupOrphaned.js.NotaEste 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
shardNamesedatabasesToProcess: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.
-
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.txtParâ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.txtO arquivo de saída dos resultados da execução.
MongoDB 4.2 and earlier
-
Em um servidor que possa se conectar à instância de cluster sharded, crie um script JS chamado
cleanupOrphaned.js.NotaEste 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
fullCollectionNamee 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
shardNamesefullCollectionName: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 formatodatabase.collection.
-
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.txtParâ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.txtO arquivo de saída dos resultados da execução.
Self-managed MongoDB
-
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" -
modifique o arquivo de script cleanupOrphaned.js. Substitua
testpelo nome do banco de dados do qual você limpará os documentos órfãos.ImportanteSe 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); }); -
Execute o comando a seguir para limpar documentos órfãos de todas as coleções do banco de dados especificado em um shard.
NotaRepita esta etapa para cada shard.
mongo --host <Shardhost> --port <Primaryport> --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.jsNota<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.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
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" } }] )