All Products
Search
Document Center

Data Transmission Service:Cara membersihkan dokumen orphaned di kluster MongoDB yang di-shard

Last Updated:Sep 24, 2026

Memeriksa dokumen tanpa induk

  1. 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.

  2. Jalankan perintah berikut untuk beralih ke database tujuan.

    use <db_name>
  3. Jalankan perintah berikut untuk melihat informasi tentang dokumen orphaned.

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

    Untuk setiap shard, periksa output executionStats. Jika bidang chunkSkips pada tahap SHARDING_FILTER tidak bernilai 0, berarti terdapat dokumen orphaned pada shard tersebut.

    Contoh hasil berikut menunjukkan bahwa tahap SHARDING_FILTER didahului oleh tahap FETCH, yang mengembalikan 102 dokumen ("nReturned" : 102). Kemudian, pada tahap SHARDING_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

Penting

Jika Anda memiliki beberapa database, bersihkan dokumen orphaned di setiap database.

ApsaraDB for MongoDB

Catatan

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

  1. Pada server yang dapat terhubung ke instans kluster sharded Anda, buat skrip JavaScript (JS) bernama cleanupOrphaned.js.

    Catatan

    Skrip 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 shardNames dan databasesToProcess:

    • 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.

  2. Di direktori tempat skrip cleanupOrphaned.js berada, jalankan perintah berikut untuk membersihkan dokumen orphaned.

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

    Parameter

    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.txt

    File output untuk hasil eksekusi.

MongoDB 4.2 dan versi sebelumnya

  1. Pada server yang dapat terhubung ke instans kluster sharded Anda, buat skrip JS bernama cleanupOrphaned.js.

    Catatan

    Skrip ini membersihkan dokumen orphaned dari koleksi tertentu dalam database tertentu di berbagai shard. Untuk membersihkan dokumen orphaned dari beberapa koleksi, Anda dapat memodifikasi parameter fullCollectionName dan 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 shardNames dan fullCollectionName:

    • 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 format database.collection.

  2. Di direktori tempat skrip cleanupOrphaned.js berada, jalankan perintah berikut untuk membersihkan dokumen orphaned.

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

    Parameter

    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.txt

    File output untuk hasil eksekusi.

Database MongoDB yang dikelola sendiri

  1. 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"
  2. Modifikasi file skrip cleanupOrphaned.js. Ganti test dengan nama database tempat Anda ingin membersihkan dokumen orphaned.

    Penting

    Jika 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);
    });
  3. Jalankan perintah berikut untuk membersihkan dokumen orphaned dari semua koleksi dalam database yang ditentukan pada sebuah shard.

    Catatan

    Anda harus mengulangi langkah ini untuk setiap shard.

    mongo --host <Shardhost> --port <Primaryport>  --authenticationDatabase <database> -u <username> -p <password> cleanupOrphaned.js
    Catatan
    • <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.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

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 finish

Anda 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" } }] )