Menghapus dokumen dari instans ApsaraDB for MongoDB tidak serta-merta membebaskan disk space. Topik ini menjelaskan tiga metode untuk mereklaim disk space yang tidak terpakai. Anda dapat menggunakan metode-metode ini secara terpisah atau dalam kombinasi.
Background
ApsaraDB for MongoDB menggunakan WiredTiger sebagai mesin penyimpanan default mulai dari MongoDB 3.2. Parameter storage.directoryPerDB:true diaktifkan, sehingga setiap database disimpan sebagai folder terpisah pada disk dan setiap koleksi disimpan sebagai file terpisah di dalam folder tersebut. Untuk informasi lebih lanjut, lihat storage.directoryPerDB.
Saat Anda menjalankan perintah delete, WiredTiger menandai ruang penyimpanan sebagai bebas untuk digunakan kembali, bukan mengembalikannya ke sistem operasi. Perilaku ini mirip dengan cara MySQL menangani baris yang dihapus. Penggunaan disk tidak berkurang setelah penghapusan dokumen.
Untuk mereklaim disk space, gunakan salah satu metode berikut.
Metode 1: Drop indeks, koleksi, atau database yang tidak digunakan
Drop indeks, koleksi, atau database akan segera menghapus file yang mendasarinya dan langsung membebaskan disk space.
Identifikasi indeks, koleksi, atau database yang tidak digunakan.
Jalankan perintah yang sesuai:
dropIndexesuntuk menghapus indeks yang tidak digunakandropuntuk menghapus koleksi yang tidak digunakandropDatabaseuntuk menghapus database yang tidak digunakan
Disk space akan dilepas segera setelah perintah selesai dijalankan.
Metode 2: Compact koleksi untuk mereklaim ruang bebas
Setelah menghapus sejumlah besar dokumen, jalankan perintah compact untuk mereklaim ruang yang telah dibebaskan dalam suatu koleksi. Pertama, periksa berapa banyak ruang bebas yang tersedia.
Periksa ruang bebas
Jalankan perintah collStats dan bandingkan bidang StorageSize dan freeStorageSize. Nilai freeStorageSize yang besar relatif terhadap StorageSize menunjukkan adanya ruang signifikan yang dapat direklaim.
Jalankan perintah compact
Jalankan perintah compact pada setiap koleksi yang memiliki ruang bebas signifikan. Untuk instruksi lengkap, lihat Defragment a disk to improve disk usage.
Jalankan perintah compact pada setiap node secara terpisah. Dalam replica set, compact satu node dalam satu waktu. Pada node primary, tambahkan force: true ke dalam perintah, contohnya: db.runCommand({compact: "collectionName", force: true}).
Pada versi MongoDB sebelum 4.4, perintah compact memblokir semua operasi lainnya. Lakukan dengan hati-hati.
Metode 3: Copy dokumen ke koleksi baru (hanya offline)
Alih-alih menjalankan compact, salin semua dokumen ke koleksi baru lalu ubah namanya. Pendekatan ini hanya berlaku dalam skenario offline karena memerlukan akses eksklusif ke data.
Gunakan metode
cursor.forEachuntuk melakukan iterasi melalui koleksi sumber dan memasukkan setiap dokumen ke dalam koleksi baru.Drop koleksi asli untuk membebaskan disk space.
Ubah nama koleksi baru agar sesuai dengan nama koleksi aslinya.
Metode ini memerlukan downtime aplikasi. Gunakan Metode 2 (compact) untuk skenario online.
Lihat juga