ติดตั้ง MongoDB และสำรองข้อมูลบน Ubuntu
MongoDB เหมาะกับข้อมูลที่โครงสร้างไม่ตายตัว เช่น Log ข้อมูลจากอุปกรณ์ หรือแคตตาล็อกสินค้าที่แต่ละรายการมีคุณสมบัติต่างกัน คู่มือนี้ติดตั้งและตั้งค่าให้ปลอดภัยพร้อมใช้งานจริง
เรื่องที่ต้องให้ความสำคัญที่สุดคือ MongoDB รุ่นเก่าเปิดโดยไม่มีรหัสผ่านตามค่าเริ่มต้น ซึ่งเป็นสาเหตุของการรั่วไหลข้อมูลจำนวนมากทั่วโลก ขั้นตอนเปิดการยืนยันตัวตนจึงเป็นขั้นตอนที่ห้ามข้าม
สิ่งที่ต้องเตรียม
- Ubuntu 22.04 หรือ 24.04 และสิทธิ์
sudo - หน่วยความจำอย่างน้อย 2 GB
- ดิสก์ที่มีพื้นที่เพียงพอ แนะนำแยกจากไดรฟ์ระบบ
ขั้นตอนที่ 1: ติดตั้ง
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt update
sudo apt install -y mongodb-org
sudo systemctl enable --now mongod
sudo systemctl status mongod --no-pager
ขั้นตอนที่ 2: สร้างผู้ใช้ผู้ดูแลก่อนเปิดการยืนยันตัวตน
mongosh
use admin
db.createUser({
user: "admin",
pwd: passwordPrompt(),
roles: [ { role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" } ]
})
db.getUsers()
exit
ขั้นตอนที่ 3: เปิดการยืนยันตัวตนและจำกัดการเชื่อมต่อ
sudo nano /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.51
security:
authorization: enabled
storage:
dbPath: /var/lib/mongodb
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
sudo systemctl restart mongod
mongosh --quiet --eval "db.adminCommand({listDatabases:1})"
คำสั่งสุดท้ายควรถูกปฏิเสธเพราะยังไม่ได้ยืนยันตัวตน นั่นคือสัญญาณว่าตั้งค่าถูกต้อง
mongosh -u admin -p --authenticationDatabase admin
อย่าตั้ง bindIp: 0.0.0.0 ให้ระบุ IP ภายในที่ต้องใช้จริงเท่านั้น และปิดกั้นด้วย Firewall อีกชั้น
sudo ufw allow from 10.0.0.0/24 to any port 27017 proto tcp
ขั้นตอนที่ 4: สร้างผู้ใช้สำหรับแอปพลิเคชัน
use myapp
db.createUser({
user: "myapp_rw",
pwd: passwordPrompt(),
roles: [ { role: "readWrite", db: "myapp" } ]
})
// ผู้ใช้สำหรับงานอ่านอย่างเดียว เช่น ระบบรายงาน
db.createUser({
user: "myapp_ro",
pwd: passwordPrompt(),
roles: [ { role: "read", db: "myapp" } ]
})
// ผู้ใช้สำหรับสำรองข้อมูล
use admin
db.createUser({
user: "backup",
pwd: passwordPrompt(),
roles: [ { role: "backup", db: "admin" } ]
})
ให้สิทธิ์เท่าที่จำเป็นเสมอ อย่าใช้ผู้ใช้ผู้ดูแลในแอปพลิเคชัน
ขั้นตอนที่ 5: ตั้งการสำรองข้อมูลอัตโนมัติ
sudo nano /usr/local/bin/mongo-backup.sh
#!/bin/bash
set -euo pipefail
DEST=/var/backups/mongodb
STAMP=$(date +%F-%H%M)
mkdir -p "$DEST"
mongodump \
--uri="mongodb://backup:РАС[email protected]:27017/?authSource=admin" \
--gzip \
--archive="$DEST/all-$STAMP.archive.gz"
# เก็บย้อนหลัง 14 วัน
find "$DEST" -name 'all-*.archive.gz' -mtime +14 -delete
echo "backup ok: $DEST/all-$STAMP.archive.gz ($(du -h "$DEST/all-$STAMP.archive.gz" | cut -f1))"
sudo chmod 700 /usr/local/bin/mongo-backup.sh
sudo /usr/local/bin/mongo-backup.sh
เก็บรหัสผ่านในไฟล์สภาพแวดล้อมที่สิทธิ์ 600 แทนการเขียนในสคริปต์ตรง ๆ
ตั้งเวลาด้วย systemd Timer
sudo nano /etc/systemd/system/mongo-backup.service
[Unit]
Description=สำรองข้อมูล MongoDB
[Service]
Type=oneshot
EnvironmentFile=/root/.mongo-backup.env
ExecStart=/usr/local/bin/mongo-backup.sh
Nice=10
sudo nano /etc/systemd/system/mongo-backup.timer
[Unit]
Description=สำรองข้อมูล MongoDB ทุกวัน
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now mongo-backup.timer
ขั้นตอนที่ 6: กู้คืนข้อมูล
# กู้ทั้งหมด
mongorestore --uri="mongodb://admin:[email protected]:27017/?authSource=admin" \
--gzip --archive=/var/backups/mongodb/all-2026-09-25-0230.archive.gz
# กู้เฉพาะฐานข้อมูลเดียวไปยังชื่อใหม่เพื่อตรวจสอบก่อน
mongorestore --uri="mongodb://admin:[email protected]:27017/?authSource=admin" \
--gzip --archive=/var/backups/mongodb/all-2026-09-25-0230.archive.gz \
--nsFrom='myapp.*' --nsTo='myapp_restore.*'
ตัวเลือก --nsFrom และ --nsTo คือวิธีที่ปลอดภัยที่สุดในการกู้ข้อมูล เพราะไม่เขียนทับของจริง
ขั้นตอนที่ 7: ตรวจสอบประสิทธิภาพ
// ดูสถานะโดยรวม
db.serverStatus().connections
db.serverStatus().opcounters
// Query ที่ช้า ซึ่งถูกเก็บโดย profiler ที่เปิดไว้ในขั้นตอนที่ 3
use myapp
db.system.profile.find().sort({millis:-1}).limit(10).pretty()
// ดูแผนการทำงานของ Query
db.orders.find({status:"paid"}).explain("executionStats")
// ดู Index ที่มี
db.orders.getIndexes()
// สร้าง Index
db.orders.createIndex({ customer_id: 1, created_at: -1 })
// ขนาดของแต่ละคอลเลกชัน
db.getCollectionNames().forEach(function(c){
var s = db[c].stats();
print(c + ": " + Math.round(s.size/1024/1024) + " MB, " + s.count + " docs");
})
ในผลของ explain ให้ดูค่า totalDocsExamined เทียบกับ nReturned หากต่างกันมากแปลว่าต้องเพิ่ม Index
ปัญหาที่พบบ่อย
เชื่อมต่อจากเครื่องอื่นไม่ได้
ตรวจ bindIp ในคอนฟิกว่ามี IP ภายในแล้ว และตรวจ Firewall ทดสอบด้วย nc -vz 10.0.0.51 27017
MongoDB กินหน่วยความจำจนเต็ม
WiredTiger ใช้หน่วยความจำได้ถึงครึ่งหนึ่งของ RAM ลบ 1 GB ตามค่าเริ่มต้น จำกัดได้ด้วย storage.wiredTiger.engineConfig.cacheSizeGB ในคอนฟิก
บริการเริ่มไม่ขึ้น
ดู Log ที่ /var/log/mongodb/mongod.log สาเหตุที่พบบ่อยคือสิทธิ์ของโฟลเดอร์ข้อมูลไม่ถูกต้อง แก้ด้วย sudo chown -R mongodb:mongodb /var/lib/mongodb
ข้อมูลโตเร็วเกินคาด
ตรวจว่ามี Index ซ้ำซ้อนหรือไม่ และพิจารณาใช้ TTL Index สำหรับข้อมูลที่หมดอายุได้ เช่น Log หรือ Session
db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 86400 })
ต้องการวางระบบฐานข้อมูลบนคลาวด์ในประเทศไทย ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี








