Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

วิธีลดพื้นที่จัดเก็บ MongoDB หลังลบข้อมูลจำนวนมาก

การลดพื้นที่จัดเก็บ MongoDB หลังลบข้อมูลจำนวนมาก

เมื่อลบข้อมูลจำนวนมากใน MongoDB พื้นที่ดิสก์ไม่ได้ถูกคืนให้ระบบปฏิบัติการทันที ต้องใช้คำสั่ง repairDatabase() เพื่อทำการ compact และ reclaim พื้นที่

ขั้นตอนการทำงาน

  1. ตรวจสอบฐานข้อมูลปัจจุบัน
  2. ลบข้อมูลที่ไม่ต้องการ
  3. รัน 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 ให้เหมาะสม

ภาพประกอบผลลัพธ์

วิธีลดพื้นที่จัดเก็บ MongoDB หลังลบข้อมูลจำนวนมาก

สรุป

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