MongoDB'de alan ıslahı konusunda bazı karışıklıklar olmuştur ve bazı önerilen uygulamaların bazı dağıtım türlerinde yapılması tehlikelidir. Aşağıda daha fazla ayrıntı:
TL; DR repairDatabase , bir disk bozulmasından kurtarmaya çalışan bağımsız bir MongoDB dağıtımlarından veri kurtarmaya çalışır. Alanı kurtarırsa, tamamen bir yan etkidir . Mekanı kurtarmak asla koşmanın öncelikli konusu olmamalıdır repairDatabase.
Bağımsız bir düğümdeki alanı kurtarın
WiredTiger: WiredTiger ile bağımsız bir düğüm için, koşu compactOS'ye tek bir uyarı ile compactyer açacaktır: MongoDB 3.0.x üzerindeki WiredTiger üzerindeki komut şu hatadan etkilenmiştir: MongoDB 3.2.3'te düzeltilen SERVER-21833 . Bu sürümden önce compact, WiredTiger'de sessizce başarısız olabilirdi.
MMAPv1: MMAPv1'in çalışma şekli nedeniyle, MMAPv1 depolama motorunu kullanarak alanı kurtarmak için güvenli ve desteklenen bir yöntem yoktur. compactMMAPv1'de veri dosyaları birleştirilir, bu da yeni belgeler için daha fazla alan sağlar, ancak işletim sistemine geri alan bırakmaz.
Sen olabilir çalıştıramaz repairDatabasetam bu sonuçlarını anlamak durumunda potansiyel olarak tehlikeli , çünkü komuta (aşağıya bakınız) repairDatabaseesasen bozuk belgeleri atarak tüm veritabanını yeniden yazar. Bir yan etki olarak, üzerinde herhangi bir parçalanma olmadan yeni MMAPv1 veri dosyaları oluşturacak ve OS'ye geri alan bırakacaktır.
Daha az maceracı yöntemi için, çalışan mongodumpve mongorestoredağıtımın boyutuna dair bir MMAPv1 dağıtım, konu hem mümkün olabilir.
Çoğaltma kümesinde alan kurtarma
Çoğaltma kümesi yapılandırmaları için, alanı kurtarmanın en iyi ve en güvenli yöntemi , hem WiredTiger hem de MMAPv1 için bir ilk eşitleme yapmaktır.
Kümedeki tüm düğümlerden alan kurtarmanız gerekirse, yuvarlanan bir ilk senkronizasyon gerçekleştirebilirsiniz. Yani, birincil olarak her ikincisinde ilk senkronizasyonu gerçekleştirin ve sonunda birincil senkronizasyonu gerçekleştirin. İlk senkronizasyon yönteminin yuvarlanması, çoğaltma kümesi bakımını gerçekleştirmek için en güvenli yöntemdir ve ayrıca bonus olarak kesinti süresi içermez.
Hareketli bir ilk senkronizasyon gerçekleştirmenin uygulanabilirliğinin dağıtımınızın boyutuna da bağlı olduğunu lütfen unutmayın. Aşırı büyük dağıtımlar için, ilk senkronizasyonu yapmak mümkün olmayabilir ve bu nedenle seçenekleriniz biraz daha sınırlıdır. WiredTiger kullanılırsa, sen olabilir , setin bir ikincil out almak işletilen bağımsız olarak başlatmak mümkün compactüzerinde ve sete bunu yeniden katılmak.
ilişkin repairDatabase
Lütfen repairDatabaseçoğaltma kümesi düğümlerinde çalıştırmayın . Bu, repairDatabase sayfasında belirtildiği ve aşağıda daha ayrıntılı olarak açıklandığı gibi çok tehlikelidir .
repairDatabaseKomut hiçbir şeyi onarmaya çalışmadığından, ad biraz yanıltıcı. Komut, bağımsız bir düğümde bozuk belgelere yol açabilecek disk bozulması olduğunda kullanılmak üzere tasarlanmıştır .
repairDatabaseKomut daha doğru "kurtarma veritabanı" olarak tarif edilebilir. Yani, veritabanını başlatabileceğiniz ve ondan bozulmamış bir belgeyi kurtarabileceğiniz bir duruma getirmek için bozuk belgeleri atarak veritabanlarını yeniden oluşturur.
MMAPv1 dağıtımlarında, veritabanı dosyalarının bu yeniden oluşturulması bir yan etki olarak işletim sistemine alan açar . İşletim sistemine yer bırakmak asla bir amaç değildi.
Sonuçları repairDatabasebir yineleme kümesinin üzerinde
Bir çoğaltma kümesinde, MongoDB kümedeki tüm düğümlerin aynı verileri içermesini bekler. repairDatabaseBir çoğaltma kümesi düğümünde çalışırsanız , düğümün algılanmamış bozulma içermesi repairDatabaseve bozuk belgeleri sizin yerinize kaldırması ihtimali vardır .
Tahmin edilebileceği gibi, bu, düğümün kümenin geri kalanından farklı bir veri kümesi içermesini sağlar. Bir güncelleme bu tek dokümana çarparsa, tüm set çökebilir.
Daha da kötüsü, bu durumun uzun süre uykuda kalabilmesi, sadece belirgin bir neden olmadan aniden saldırılması tamamen mümkündür.