
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) })
compact
collection dengan
db.runCommand( { compact : 'wallet' } )

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

Ada Pesan compact
Bakal Bikin Slow Operation
Karena ada warning itu compact
di primary ga jadi saya jalankan
- Menjalankan
compact
di 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
compact
semua 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
compact
tidak 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: