ใช้ Mongodump และ Mongorestore ในการ migrate data ข้าม Database

Supanut Laddayam
4 min readFeb 12, 2025

--

ในบทความนี้เราจะมาใช้ MongoDB DBA tool 2 ตัว คือ mongodump และ mongorestore ทำ hands-on lab: “การ migrate data ข้าม Database (จาก MongoDB Atlas ลงมาที่ MongoDB Community Edition (CE) ที่ self-hosted บน vm)

เกริ่นนำ

  • mongodump เป็น cli tool ที่สามารถนำข้อมูลออกมาจาก source database โดย output ของ mongodump จะได้ไฟล์เป็น BSON, Archive หรือ Zip
  • mongorestore เป็น cli tool ที่นำข้อมูลจากการ dump เพิ่มเข้าไปยัง target database

💡ข้อมูลใน hands-on lab นี้ จะใช้ข้อมูลของ sample ที่ mongo atlas ให้มา หน้าตาก็จะประมาณนี้ db: sample_mflix, collection: movies

มาลุยกันนน… 💪🏻

step 0: เตรียมเครื่อง VM + ลง MongoDB-CE

สามารถ follow ตามบทความนี้ได้เลย

* ด้วยที่เราลง MongoDB-CE จะมี Mongo DBA tool ติดมาให้ด้วย

เข้า database ด้วย mongo shell

mongosh localhost --quit

** ที่ใช้ localhost แทน mongo_connection_string ได้เพราะ เราลง mongo ไว้ใน vm มันจึงมองว่าอยู่ที่เดียวกันเลยใช้ localhost ได้

*** ตัว flag quit หมายถึงไม่ต้องพ่น info ออกมา

ตรวจดู database และ collection


show dbs

โอเคร ตอนนี้เรามีแค่ built-in database ที่ Mongo เตรียมไว้ให้

📌 Checkpoint 1: เราจะได้เครื่อง VM ที่มีการลง Mongo-CE v8 และสามารถ access database ด้วย mongo shell ได้

step 1: Mongodump

ใช้ Mongodump ในการ dump ข้อมูลจาก Mongo Atlas ลงมาที่ vm โดยเราจะเพิ่มเงื่อนไขเข้าไปคือ

  • database: sample_mflix
  • collection: movies
  • ต้องการ movies ที่มี field year ตั้งแต่ปี 2000 เป็นต้นไป

script

mongodump \
--db=sample_mflix \
--collection=movies \
--query='{"year": {"$gte": 2000}}' \
--out='./dump_data'
--uri={{mongo_connection_string}}

(🚨ตอนรันให้ลบ \ ออก และทำให้อยู่ในบรรทัดเดียวกัน )

flag options:

  • flag db เป็นการเลือก database
  • flag collection เป็นการเลือก collection
  • flag query เป็นการใช้ query ในการเป็นเงื่อนไข หรือ filter
  • flag archive เป็นการกำหนด path และชื่อไฟล์
  • flag uri เป็นการกำหนด mongo_connection_string ที่จะ connect ไปยัง source database

โดย mongo_connection_string จะมีหน้าตาประมาณนี้

mongodb+srv://{username}:{password}@{cluster_string}.mongodb.net

Authentication and Authorization

ในเคสนี้ การต่อ database เราจะต่อแบบ public ซึ่งจะต้องสร้าง credential และ whitelist ที่ Mongo Atlas ด้วยเพื่ออนุญาตให้สามารถใช้คำสั่งจาก VM ไป dump ข้อมูลได้

เพิ่ม credential และ whitelist ได้ที่ Mongo Atlas

  • Database Access (aka credential): เราจะสร้าง username และ password และ role: clusterManager หรือ atlasAdmin
  • Network Access (aka whitelist): เราจะกำหนด ip v4 ที่จะอนุญาติ เคสนี้เราจะเพิ่ม ipv4 ของเครื่อง VM เข้าไป

Output

จะได้ไฟล์ moveis.bson และ movies.metadata.json ที่ /dump/{{database_name}}/{{collection_name}} ตาม flag — out. ซึ่งได้มา 12,569 records จาก ทั้งหมด 21,349 ด้วยเงื่อนไข year ≥ 2000 นั่นเอง

  • movies.bson เป็นข้อมูล documents
  • movies.metadata.json เป็นข้อมูลของ document และ collection

📌 Checkpoint 2: เราจะได้ movies จากการ dump ซึ่งจะได้ 2 ไฟล์เป็นไฟล์​ BSON data และ ไฟล์ metata

☁ Comparison Mongodump output

จริงๆแล้วสามารถกำหนด output ของการ dump ได้เพิ่มเติมอีก 2 รูปแบบ รวมเป็น 3 ดังนี้ bson (default), archive และ zip ซึ่งจะมีข้อดี ข้อเสีย และ use case ในการเลือกใช้งานดังนี้

BSON vs Archive vs Zip

BSON

✅pros:

  • แต่ละ collection ที่ถูก store จะถูกแยกกันไปตาม BSON data ไฟล์ และ metadata
  • สามารถ restore แบบขนานได้ และยืดหยุ่นในการ restore แยก collection
  • เหมาะกับเคสที่ data มีขนาดใหญ่

❌cons

  • ได้คู่ไฟล์ BSON และ metadata จำนวนมาก

Archive

✅pros:

  • ได้ไฟล์เดียวเลย (BSON data รวมกับ metadata)
  • เหมาะกับเคสที่ต้องการจัดการกับไฟล์ไฟล์เดียว และการ streaming ไปยัง cloud

❌cons:

  • ขนาดความยืดหยุ่นในการ restore แยก collection

Zip

✅pros:

  • ขนาดไฟล์มีขนาดเล็กที่สุด ทำให้การง่ายต่อการย้ายไฟล์ (storage optimize and speed to transfer)
  • เหมาะกับเคสที่ต้องการ optimize เรื่อง storage

❌cons:

  • ขั้นตอนการ dump และ restore จะใช้เวลา และ cpu utilize มาก เนื่องจากต้องผ่านการ unzip

Part 2: Mongorestore

เมื่อมีข้อมูลแล้วเราจะ restore เข้าตัว Mongo-CE ที่อยู่ที่เดียวกัน ด้วย mongorestore

script

mongorestore \
--db=sample_mflix \
--collection=movies \
--uri={{target_mongo_connection_string}}
{{path_to_file}}

(🚨ตอนรันให้ลบ \ ออก และทำให้อยู่ในบรรทัดเดียวกัน )

  • target_mongo_connection_string ในเคสนี้เราจะ restore เข้า mongo ในเครื่อง vm นั่นคือ mongodb://localhost:27017
  • path_to_file เราเก็บ output จากการ dump ไว้ ./dump_data/sample_mflix/movies.bson

Output

จะเห็นว่าเมื่อ restore data เสร็จแล้ว จะมีการสร้าง index ให้ เนื่องจาก mongodump จะเก็บข้อมูล index ไว้ใน metadata

มาดูที่ผลลัพธ์ data ของการ restore

index ที่ถูกสร้าง

📌 Checkpoint 3: เราจะได้ข้อมูล movies ใน database สามารถ

สรุป

บทความนี้ก็เป็น hands-on lab นึงที่ใช้เครื่องมือ mongodump และ mongorestore เพื่อ handle กับ task จำพวกการ migrate data ซึ่งจริงๆแล้วประกอบด้วย 3 step หลัก คือ การเตรียมเครื่อง vm, การ dump data และการ restore data. ซึ่งด้วย option flag ของ mongodump และ mongorestore ทำให้เรามีวิธีการที่หลากหลายในการจัดการ สามารถดู option เพิ่มเติมได้ที่ mongo document 😃

References

https://www.mongodb.com/docs/database-tools/mongodump/

https://www.mongodb.com/docs/database-tools/mongorestore/

--

--

No responses yet