Halo, kalau kamu merasa tulisan saya ngebantu kamu, kamu bisa ucapkan terima kasih lewat saweria .
If you feel this website help you, you can donate at saweria .
What I Used in This Tutorial
-
Ubuntu Server 22.04 LTS
-
Standalone MongoDB v5.0.19
How To
Compact ini merupakan command bawaan mongo yang berfungsi mirip dengan defrag disk.
Compact ini akan rewrites and defrag semua data dan index di collection. Tentu saja dengan menjalankan compact ini akan membuat free space di hard drive.
Berikut cara menggunakan compact
- Login ke MongoDB, dengan menggunakan mongo shell
mongosh --quiet --host localhost:27017 --username administrator --password Password --authenticationDatabase admin
- Cek collection yang ingin di
compact,
#show all collection
show collections
#show collection using regex, in this case i search collection that contain "wall"
db.getCollectionNames().filter(function (collection) { return /wall/.test(collection) })
compactcollection dengan
db.runCommand( { compact : 'wallet' } )

Proses compact Collection
Run compact di MongoDB Replica Set Production
Pengalaman saya menjalankan compact di production
- Menjalankan
compactdi primary

Ada Pesan compact Bakal Bikin Slow Operation
Karena ada warning itu compact di primary ga jadi saya jalankan
- Menjalankan
compactdi secondary

Running compact di Secondary Ga Ada Warning
Saya jalankan compact di secondary di production ini ga ada masalah, tapi hanya bisa bikin free space sekitar 300 MB
Tambahan
- cara
compactsemua collection (anda bisa cek full script di sini Github Gist - Compact all collections inside of a MongoDB database )
use testDbName;
db.getCollectionNames().forEach(function (collectionName) {
print('Compacting: ' + collectionName);
db.runCommand({ compact: collectionName });
});

Disk Size Before Run compact

Disk Size After Run compact, it free 12GB!
- Jika ada error “Not authorized on config to execute command { compact: ..} “, itu berarti user yang gunakan untuk menjalankan
compacttidak punya akses write ke database. Untuk cara memperbaikinya, buat user yang punya akses write ke database
#add root user
use admin;
db.createUser(
{
user: "user",
pwd: "pass",
roles: [ "root" ]
}
);
#create new user with read write access
use database;
db.createUser(
{
user: "user",
pwd: "pass",
roles: [ { role: "readWrite", db: "database" } ]
}
);
#grant/update access root to admin
use admin;
db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])
Referensi: