Ada beberapa kebingungan yang cukup besar tentang reklamasi ruang di MongoDB, dan beberapa praktik yang disarankan benar-benar berbahaya untuk dilakukan dalam jenis penyebaran tertentu. Lebih detail di bawah ini:
TL; DR repairDatabase berupaya untuk menyelamatkan data dari penyebaran MongoDB mandiri yang mencoba untuk pulih dari kerusakan disk. Jika ruang pulih, itu murni efek samping . Memulihkan ruang seharusnya tidak menjadi pertimbangan utama untuk berlari repairDatabase.
Memulihkan ruang dalam node mandiri
WiredTiger: Untuk node mandiri dengan WiredTiger, menjalankan compactakan melepaskan ruang ke OS, dengan satu peringatan: compactPerintah pada WiredTiger di MongoDB 3.0.x dipengaruhi oleh bug ini: SERVER-21833 yang diperbaiki di MongoDB 3.2.3. Sebelum versi ini, compactpada WiredTiger bisa gagal secara diam-diam.
MMAPv1: Karena cara kerja MMAPv1, tidak ada metode yang aman dan didukung untuk memulihkan ruang menggunakan mesin penyimpanan MMAPv1. compactdi MMAPv1 akan mendefrag file data, berpotensi membuat lebih banyak ruang tersedia untuk dokumen baru, tetapi tidak akan melepaskan ruang kembali ke OS.
Anda mungkin dapat menjalankannya repairDatabasejika Anda sepenuhnya memahami konsekuensi dari perintah yang berpotensi berbahaya ini (lihat di bawah), karena repairDatabasepada dasarnya menulis ulang seluruh database dengan membuang dokumen yang rusak. Sebagai efek samping, ini akan membuat file data MMAPv1 baru tanpa ada fragmentasi dan melepaskan ruang kembali ke OS.
Untuk metode yang tidak terlalu berani, menjalankan mongodumpdan mongorestoredimungkinkan juga dalam penerapan MMAPv1, tergantung pada ukuran penerapan Anda.
Memulihkan ruang dalam set replika
Untuk konfigurasi set replika, metode terbaik dan teraman untuk memulihkan ruang adalah dengan melakukan sinkronisasi awal , untuk WiredTiger dan MMAPv1.
Jika Anda perlu memulihkan ruang dari semua node di set, Anda dapat melakukan sinkronisasi awal bergulir. Yaitu, lakukan sinkronisasi awal pada masing-masing sekunder, sebelum akhirnya mundur primer dan lakukan sinkronisasi awal di atasnya. Menggulir metode sinkronisasi awal adalah metode paling aman untuk melakukan pemeliharaan set replika, dan juga tidak melibatkan downtime sebagai bonus.
Harap dicatat bahwa kelayakan melakukan sinkronisasi awal bergulir juga tergantung pada ukuran penempatan Anda. Untuk penyebaran yang sangat besar, mungkin tidak layak untuk melakukan sinkronisasi awal, dan karenanya opsi Anda agak lebih terbatas. Jika WiredTiger digunakan, Anda mungkin dapat mengambil satu sekunder dari set, mulai sebagai standalone, jalankan compactdi atasnya, dan bergabung kembali ke set.
Mengenai repairDatabase
Tolong jangan dijalankan repairDatabasepada set node replika . Ini sangat berbahaya, seperti yang disebutkan dalam halaman database Repair dan dijelaskan lebih detail di bawah ini.
Namanya repairDatabaseagak menyesatkan, karena perintah tidak berusaha memperbaiki apa pun. Perintah itu dimaksudkan untuk digunakan ketika ada kerusakan disk pada node mandiri , yang dapat menyebabkan dokumen rusak.
The repairDatabaseperintah bisa lebih tepat disebut sebagai "basis data penyelamatan". Yaitu, ini membuat ulang basis data dengan membuang dokumen yang rusak dalam upaya untuk membuat basis data ke dalam keadaan di mana Anda dapat memulainya dan menyelamatkan dokumen yang utuh darinya.
Dalam penyebaran MMAPv1, pembangunan kembali file database melepaskan ruang ke OS sebagai efek samping . Melepaskan ruang ke OS tidak pernah tujuannya.
Konsekuensi repairDatabasepada set replika
Dalam set replika, MongoDB mengharapkan semua node di set untuk berisi data yang identik. Jika Anda menjalankan repairDatabasesimpul set replika, ada kemungkinan simpul tersebut berisi korupsi yang tidak terdeteksi, dan dengan repairDatabasepatuh akan menghapus dokumen yang rusak untuk Anda.
Bisa ditebak, ini membuat simpul yang berisi dataset berbeda dari sisa set. Jika pembaruan terjadi untuk mencapai satu dokumen itu, seluruh rangkaian dapat macet.
Untuk memperburuk keadaan, sangat mungkin bahwa situasi ini bisa tetap tidak aktif untuk waktu yang lama, hanya untuk menyerang tiba-tiba tanpa alasan yang jelas.