sql >> Database >  >> NoSQL >> MongoDB

Automatisch de verwijderde ruimte in mongodb comprimeren?

Als u uw gegevensbestanden niet hoeft te verkleinen, moet u ze in het algemeen helemaal niet verkleinen. Dit komt omdat het "groeien" van uw databestanden op schijf een vrij dure operatie is en hoe meer ruimte MongoDB kan toewijzen in databestanden, hoe minder fragmentatie u zult hebben.

Probeer dus zoveel mogelijk schijfruimte te voorzien voor de database.

Echter als je de database moet verkleinen, moet je twee dingen in gedachten houden.

  1. MongoDB vergroot zijn gegevensbestanden door te verdubbelen, dus de gegevensbestanden kunnen 64 MB zijn, dan 128 MB, enz. tot 2 GB (op dat moment stopt het met verdubbelen om bestanden tot 2 GB te bewaren.)

  2. Zoals bij de meeste databases ... om bewerkingen zoals verkleinen te doen, moet u een aparte taak plannen om dit te doen, er is geen "autoshrink" in MongoDB. In feite zal alleen Riak van de belangrijkste noSQL-databases (haat die naam) automatisch verkleinen. U moet dus een taak maken met behulp van de planner van uw besturingssysteem om een ​​psychiater uit te voeren. Je zou een bash-script kunnen gebruiken, of een taak een php-script laten uitvoeren, enz.

Serverside Javascript

U kunt Javascript aan de serverzijde gebruiken om de krimp uit te voeren en die JS regelmatig via mongo's shell uit te voeren via een taak (zoals cron of de Windows-planningsservice) ...

Uitgaande van een verzameling genaamd foo u zou het onderstaande javascript opslaan in een bestand met de naam bar.js en ren ...

$ mongo foo bar.js

Het javascript-bestand zou er ongeveer zo uitzien ...

// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();

print('Storage Size: ' + tojson(storage));

print('TotalSize: ' + tojson(total));

print('-----------------------');
print('Running db.repairDatabase()');
print('-----------------------');

// Run repair
db.repairDatabase()

// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();

print('Storage Size: ' + tojson(storage_a));
print('TotalSize: ' + tojson(total_a));

Dit wordt uitgevoerd en geeft iets terug als ...

MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153

Voer dit volgens een schema uit (tijdens geen piekuren) en je bent klaar om te gaan.

Afgetopte collecties

Er is echter nog een andere optie, afgetopte collecties .

In principe kunt u de grootte van (of het aantal documenten in) een verzameling beperken tot bijvoorbeeld 20 GB en zodra die limiet is bereikt, begint MongoDB de oudste records weg te gooien en ze te vervangen door nieuwere vermeldingen zodra ze binnenkomen.

Dit is een geweldige manier om een ​​grote hoeveelheid gegevens te bewaren, waarbij de oudere gegevens na verloop van tijd worden weggegooid en dezelfde hoeveelheid schijfruimte behouden blijft.



  1. MongoDB-projectieparameter werkt niet in findOne()

  2. Ingesloten of gerefereerde relaties

  3. Willekeurige documenten van MongoDB met spring-data

  4. MongoDB Aggregate en GroupBy begrijpen