การลดพื้นที่จัดเก็บ MongoDB หลังลบข้อมูลจำนวนมาก
เมื่อลบข้อมูลจำนวนมากใน MongoDB พื้นที่ดิสก์ไม่ได้ถูกคืนให้ระบบปฏิบัติการทันที ต้องใช้คำสั่ง repairDatabase() เพื่อทำการ compact และ reclaim พื้นที่
ขั้นตอนการทำงาน
- ตรวจสอบฐานข้อมูลปัจจุบัน
- ลบข้อมูลที่ไม่ต้องการ
- รัน
repairDatabase()
ตัวอย่างคำสั่ง
> db;
// Test
> db.repairDatabase()
{ "ok" : 1 }
คำอธิบาย repairDatabase()
- ฟังก์ชัน: สร้างไฟล์ข้อมูลใหม่โดยคัดลอกเฉพาะข้อมูลที่ยังคงอยู่ (exclude deleted documents) และสร้าง Index ใหม่ทั้งหมด
- ผลลัพธ์: ลดขนาดไฟล์ข้อมูล (data files) และไฟล์ Index ให้เล็กลงตามข้อมูลที่เหลืออยู่จริง
- ต้องการพื้นที่: ต้องมีพื้นที่ดิสก์ว่างเพียงพอสำหรับเก็บข้อมูลชั่วคราวระหว่างการ repair (ประมาณขนาดฐานข้อมูลปัจจุบัน)
⚠️ ข้อควรระวังสำคัญ
⚠️ ไม่แนะนำให้ใช้ใน Production Environment
- Lock database: บล็อคการเขียนข้อมูลตลอดกระบวนการ
- Downtime: ฐานข้อมูลจะไม่สามารถให้บริการได้ระหว่าง repair
- เวลานาน: ใช้เวลานานสำหรับฐานข้อมูลขนาดใหญ่
- Replica Set: ไม่ควรใช้กับ Primary node โดยตรง
ทางเลือกที่ดีกว่าสำหรับ Production
1. ใช้ compact command (MongoDB 4.4+)
> db.runCommand({ compact: "collectionName", force: true })
- ทำงานได้ระดับ Collection (ไม่ใช่ทั้ง Database)
- ยังต้องการ Lock แต่เฉพาะ Collection นั้นๆ
2. ใช้ Initial Sync (Replica Set)
- Resync Secondary node ใหม่ - จะสร้างไฟล์ข้อมูลใหม่แบบ Compact อัตโนมัติ
- ไม่มี Downtime สำหรับ Primary
- วิธีที่ปลอดภัยและแนะนำที่สุดสำหรับ Production
3. ใช้ WiredTiger Storage Engine (Default ตั้งแต่ MongoDB 3.2)
- WiredTiger มีการ compress และ reclaim space อัตโนมัติในบางสถานการณ์
- ตั้งค่า
storage.wiredTiger.engineConfig.cacheSizeGBให้เหมาะสม
ภาพประกอบผลลัพธ์

สรุป
สำหรับ Development/Testing: ใช้ repairDatabase() ได้เลย
สำหรับ Production: ใช้ Initial Sync ของ Replica Set หรือ compact command แทน