Memeriksa dokumen tanpa induk
Hubungkan ke instans kluster sharded ApsaraDB for MongoDB menggunakan Mongo Shell.
Untuk informasi tentang cara menghubungkan ke ApsaraDB for MongoDB, lihat Hubungkan ke instans kluster sharded menggunakan mongo shell.
Jalankan perintah berikut untuk beralih ke database tujuan.
use <db_name>Jalankan perintah berikut untuk melihat informasi tentang dokumen orphaned.
db.<coll_name>.find().explain("executionStats")CatatanUntuk setiap shard, periksa output
executionStats. Jika bidangchunkSkipspada tahapSHARDING_FILTERtidak bernilai 0, berarti terdapat dokumen orphaned pada shard tersebut.Contoh hasil berikut menunjukkan bahwa tahap
SHARDING_FILTERdidahului oleh tahapFETCH, yang mengembalikan 102 dokumen ("nReturned" : 102). Kemudian, pada tahapSHARDING_FILTER, 2 dokumen orphaned difilter ("chunkSkips" : 2), dan akhirnya hanya 100 dokumen yang dikembalikan ("nReturned" : 100)."stage" : "SHARDING_FILTER", "nReturned" : 100, ...... "chunkSkips" : 2, "inputStage" : { "stage" : "FETCH", "nReturned" : 102,Untuk informasi lebih lanjut tentang tahap
SHARDING_FILTER, lihat MongoDB Manual.
Membersihkan dokumen tak bertuan
Jika Anda memiliki beberapa database, bersihkan dokumen orphaned di setiap database.
ApsaraDB for MongoDB
Menjalankan skrip pembersihan pada instans dengan versi utama sebelum MongoDB 4.2 atau versi minor sebelum 4.0.6 akan menyebabkan error. Untuk melihat versi saat ini dari instans Anda, lihat Versi minor MongoDB. Untuk melakukan upgrade versi utama atau minor, lihat Upgrade versi utama database dan Upgrade versi minor database.
Gunakan perintah cleanupOrphaned untuk membersihkan dokumen orphaned. Prosedurnya sedikit berbeda untuk MongoDB 4.4 dan versi lebih baru dibandingkan MongoDB 4.2 dan versi sebelumnya.
MongoDB 4.4 dan versi lebih baru
-
Pada server yang dapat terhubung ke instans kluster sharded Anda, buat skrip JavaScript (JS) bernama
cleanupOrphaned.js.CatatanSkrip ini membersihkan dokumen orphaned dari semua koleksi di beberapa database di berbagai shard. Jika Anda hanya perlu membersihkan dokumen orphaned dari koleksi tertentu, Anda dapat memodifikasi skrip JS tersebut.
// Daftar nama shard var shardNames = ["shardName1", "shardName2"]; // Daftar database var databasesToProcess = ["database1", "database2", "database3"]; shardNames.forEach(function(shardName) { // Iterasi daftar database yang ditentukan databasesToProcess.forEach(function(dbName) { var dbInstance = db.getSiblingDB(dbName); // Dapatkan nama semua koleksi dalam instans database var collectionNames = dbInstance.getCollectionNames(); // Iterasi setiap koleksi collectionNames.forEach(function(collectionName) { // Nama lengkap koleksi var fullCollectionName = dbName + "." + collectionName; // Bangun perintah cleanupOrphaned var command = { runCommandOnShard: shardName, command: { cleanupOrphaned: fullCollectionName } }; // Jalankan perintah var result = db.adminCommand(command); if (result.ok) { print("Dokumen orphaned telah dibersihkan untuk koleksi " + fullCollectionName + " pada shard " + shardName); printjson(result); } else { print("Gagal membersihkan dokumen orphaned untuk koleksi " + fullCollectionName + " pada shard " + shardName); } }); }); });Dalam skrip tersebut, ubah nilai parameter
shardNamesdandatabasesToProcess:-
shardNames: Array ID shard tempat dokumen orphaned akan dibersihkan. Anda dapat memperoleh ID shard dari Daftar Shard pada halaman Informasi Dasar instans. Contohnya:d-bp15a3796d3a****. -
databasesToProcess: Array nama database tempat dokumen orphaned akan dibersihkan.
-
-
Di direktori tempat skrip
cleanupOrphaned.jsberada, jalankan perintah berikut untuk membersihkan dokumen orphaned.mongo --host <Mongoshost> --port <Primaryport> --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.js > output.txtParameter
Deskripsi
<Mongoshost>Alamat koneksi node mongos dari instans kluster sharded. Contoh:
s-bp14423a2a51****.mongodb.rds.aliyuncs.com.<Primaryport>Nomor port node mongos dari instans kluster sharded. Nilai default-nya adalah 3717.
<database>Nama database otentikasi. Ini adalah database tempat akun database tersebut berada.
<username>Akun database.
<password>Kata sandi untuk akun database.
output.txtFile output untuk hasil eksekusi.
MongoDB 4.2 dan versi sebelumnya
-
Pada server yang dapat terhubung ke instans kluster sharded Anda, buat skrip JS bernama
cleanupOrphaned.js.CatatanSkrip ini membersihkan dokumen orphaned dari koleksi tertentu dalam database tertentu di berbagai shard. Untuk membersihkan dokumen orphaned dari beberapa koleksi, Anda dapat memodifikasi parameter
fullCollectionNamedan menjalankan skrip beberapa kali, atau modifikasi skrip agar melakukan iterasi melalui koleksi-koleksi tersebut.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("Tidak dapat menyelesaikan saat ini: gagal atau timeout.") break } nextKey = result.results[shardName].stoppedAtKey; } print("Pembersihan orphaned selesai untuk koleksi: " + fullCollectionName + " pada shard: " + shardName) } var shardNames = ["shardName1", "shardName2", "shardName3"] var fullCollectionName = "database.collection" shardNames.forEach(function(shardName) { cleanupOrphanedOnShard(shardName, fullCollectionName); });Dalam skrip tersebut, ubah nilai parameter
shardNamesdanfullCollectionName:-
shardNames: Array ID shard tempat dokumen orphaned akan dibersihkan. Anda dapat memperoleh ID shard dari Daftar Shard pada halaman Informasi Dasar instans. Contohnya:d-bp15a3796d3a****. -
fullCollectionName: Nama koleksi tempat dokumen orphaned akan dibersihkan, dalam formatdatabase.collection.
-
-
Di direktori tempat skrip
cleanupOrphaned.jsberada, jalankan perintah berikut untuk membersihkan dokumen orphaned.mongo --host <Mongoshost> --port <Primaryport> --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.js > output.txtParameter
Deskripsi
<Mongoshost>Alamat koneksi node mongos dari instans kluster sharded. Contoh:
s-bp14423a2a51****.mongodb.rds.aliyuncs.com.<Primaryport>Nomor port node mongos dari instans kluster sharded. Nilai default-nya adalah 3717.
<database>Nama database otentikasi. Ini adalah database tempat akun database tersebut berada.
<username>Akun database.
<password>Kata sandi untuk akun database.
output.txtFile output untuk hasil eksekusi.
Database MongoDB yang dikelola sendiri
-
Pada server yang dapat terhubung ke database MongoDB yang dikelola sendiri, unduh file skrip cleanupOrphaned.js.
wget "https://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/120562/cn_zh/1564451237979/cleanupOrphaned.js" -
Modifikasi file skrip cleanupOrphaned.js. Ganti
testdengan nama database tempat Anda ingin membersihkan dokumen orphaned.PentingJika Anda memiliki beberapa database, Anda harus mengulangi Langkah 2 dan Langkah 3 untuk setiap database.
function cleanupOrphaned(coll) { var nextKey = { }; var result; while ( nextKey != null ) { result = db.adminCommand( { cleanupOrphaned: coll, startingFromKey: nextKey } ); if (result.ok != 1) print("Tidak dapat menyelesaikan saat ini: gagal atau timeout.") printjson(result); nextKey = result.stoppedAtKey; } } var dbName = "test" db = db.getSiblingDB(dbName) db.getCollectionNames().forEach(function(collName) { cleanupOrphaned(dbName + "." + collName); }); -
Jalankan perintah berikut untuk membersihkan dokumen orphaned dari semua koleksi dalam database yang ditentukan pada sebuah shard.
CatatanAnda harus mengulangi langkah ini untuk setiap shard.
mongo --host <Shardhost> --port <Primaryport> --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.jsCatatan-
<Shardhost>: Alamat IP shard.
-
<Primaryport>: Port layanan node primary dalam shard.
-
<database>: Nama database otentikasi. Ini adalah database tempat akun database tersebut berada.
-
<username>: Akun database.
-
<password>: Kata sandi untuk akun tersebut.
Contoh:
Pada contoh ini, database MongoDB yang dikelola sendiri memiliki tiga shard. Anda harus menjalankan perintah untuk setiap shard guna membersihkan dokumen orphaned.
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 -
Pemecahan Masalah
Jika idleCursors ada pada namespace dokumen orphaned, proses pembersihan mungkin gagal diselesaikan. Dalam kasus ini, log mongod untuk dokumen orphaned berisi informasi berikut:
Deletion of DATABASE.COLLECTION range [{ KEY: VALUE1 }, { KEY: VALUE2 }) will be scheduled after all possibly dependent queries finishAnda dapat menghubungkan ke mongod menggunakan Mongo Shell dan menjalankan perintah berikut untuk memeriksa apakah idleCursors ada pada shard saat ini. Jika idleCursors ada, gunakan perintah restart mongod atau killCursors untuk membersihkan semua idleCursors, lalu bersihkan kembali dokumen orphaned tersebut. Untuk informasi lebih lanjut, lihat Tiket JIRA.
db.getSiblingDB("admin").aggregate( [{ $currentOp : { allUsers: true, idleCursors: true } },{ $match : { type: "idleCursor" } }] )