Sao lưu toàn bộ dữ liệu bằng mongodump
Thực hiện sao lưu toàn bộ các database hiện có trên instance MongoDB đang chạy.
Công cụ mongodump sẽ xuất dữ liệu ra định dạng BSON (Binary JSON), đảm bảo tính nguyên vẹn của dữ liệu bao gồm cả index và metadata.
Đầu tiên, cần đảm bảo bạn đang chạy command với quyền user đã được cấp quyền read cho tất cả các database, hoặc chạy dưới quyền root để có quyền truy cập toàn hệ thống.
Lệnh sau sẽ tạo thư mục /var/backup/mongodb và lưu toàn bộ dữ liệu vào đó với timestamp hiện tại để phân biệt các phiên bản backup.
sudo mkdir -p /var/backup/mongodb
sudo -u mongodb mongodump --host 127.0.0.1 --port 27017 --authenticationDatabase admin -u admin -p 'YourSecurePassword' --out /var/backup/mongodb/$(date +%Y%m%d_%H%M%S)
Kết quả mong đợi: Terminal in ra thông báo dumping collections và finished, đồng thời xuất hiện thư mục backup mới trong đường dẫn chỉ định.
Verify kết quả sao lưu
Liệt kê nội dung thư mục vừa tạo để xác nhận các file dump đã được sinh ra cho từng collection.
ls -lh /var/backup/mongodb/$(date +%Y%m%d_%H%M%S)/*/*.bson
Bạn sẽ thấy danh sách các file .bson tương ứng với từng collection trong các database của bạn.
Khôi phục dữ liệu từ file backup bằng mongorestore
Thực hiện khôi phục dữ liệu từ file backup đã tạo trước đó vào một instance MongoDB khác hoặc cùng instance đang trống.
Công cụ mongorestore đọc file BSON và chèn dữ liệu vào MongoDB. Nếu database đích đã tồn tại, dữ liệu cũ sẽ bị ghi đè (overwrite) tùy thuộc vào cờ --drop.
Lưu ý: Trước khi khôi phục, cần đảm bảo MongoDB đích đang chạy và đã được cấu hình xác thực tương tự như nguồn sao lưu (cùng user, password, database auth).
Lệnh sau sẽ khôi phục toàn bộ dữ liệu từ thư mục backup cụ thể. Cờ --drop sẽ xóa toàn bộ dữ liệu hiện có trong các collection đích trước khi nhập liệu mới, đảm bảo dữ liệu sạch 100% theo bản backup.
BACKUP_DIR="/var/backup/mongodb/20240520_103000" # Thay bằng tên thư mục backup thực tế của bạn
sudo -u mongodb mongorestore --host 127.0.0.1 --port 27017 --authenticationDatabase admin -u admin -p 'YourSecurePassword' --drop $BACKUP_DIR
Kết quả mong đợi: Terminal hiển thị dòng done restoring kèm số lượng tài liệu (documents) đã được khôi phục thành công.
Verify kết quả khôi phục
Đợi khoảng 5 giây để MongoDB ghi index, sau đó kiểm tra số lượng tài liệu trong collection chính.
mongosh --host 127.0.0.1 -u admin -p 'YourSecurePassword' --authenticationDatabase admin --eval "db.getSiblingDB('your_database_name').your_collection_name.countDocuments()"
Kết quả trả về phải khớp với số lượng documents của dữ liệu gốc trước khi backup.
Xử lý lỗi phổ biến: 'Cannot bind' và 'Authentication failed'
Xử lý lỗi Cannot bind thường xảy ra khi cổng (port) 27017 đã bị một tiến trình khác chiếm dụng hoặc cấu hình bindIp không đúng.
Để kiểm tra tiến trình nào đang chiếm cổng 27017, sử dụng lệnh ss hoặc netstat.
sudo ss -tlnp | grep 27017
Nếu thấy tiến trình khác (không phải mongod) đang chạy, bạn cần dừng tiến trình đó hoặc thay đổi cổng trong file cấu hình.
Để thay đổi cổng trong file cấu hình, chỉnh sửa file /etc/mongod.conf và thay đổi giá trị port.
sudo nano /etc/mongod.conf
Sửa dòng port: 27017 thành port: 27018 (ví dụ) và khởi động lại dịch vụ.
sudo systemctl restart mongod
Đối với lỗi Authentication failed, nguyên nhân thường là do mật khẩu sai, user không tồn tại, hoặc tham số --authenticationDatabase bị thiếu.
Đảm bảo trong lệnh mongodump hoặc mongorestore, bạn luôn khai báo rõ ràng database nơi chứa thông tin user (thường là admin).
Kiểm tra lại quyền của user bằng cách đăng nhập trực tiếp và in ra danh sách user.
mongosh --host 127.0.0.1 -u admin -p 'YourSecurePassword' --authenticationDatabase admin --eval "db.getSiblingDB('admin').getUsers()"
Nếu lệnh này lỗi, hãy kiểm tra lại mật khẩu hoặc tạo lại user admin theo hướng dẫn ở Phần 3.
Kiểm tra và phân tích log file để tìm nguyên nhân sự cố
Log file là nguồn thông tin quan trọng nhất để debug các sự cố về hiệu năng, crash, hoặc lỗi giao dịch.
Trên Ubuntu 24.04 với MongoDB cài đặt qua package, log file thường được lưu tại /var/log/mongodb/mongod.log.
Để theo dõi log theo thời gian thực (tail -f) và lọc các dòng chứa từ khóa ERROR hoặc FATAL.
sudo tail -f /var/log/mongodb/mongod.log | grep -i "error\|fatal\|exception"
Khi phát hiện lỗi, cần xem toàn bộ ngữ cảnh xung quanh dòng lỗi đó (trước và sau 20 dòng) để hiểu nguyên nhân gốc rễ.
sudo grep -B 20 -A 20 "ERROR" /var/log/mongodb/mongod.log | tail -50
Trong trường hợp server bị treo (hang) hoặc không phản hồi, kiểm tra xem có thông báo nào về WiredTiger hoặc lock trong log.
Để xem trạng thái health của MongoDB ngay lập tức mà không cần đọc log, dùng lệnh mongod --version và kiểm tra trạng thái service.
sudo systemctl status mongod
Kết quả mong đợi: Thấy trạng thái active (running). Nếu thấy failed, hãy xem dòng Active: và Since: để biết thời điểm lỗi xảy ra.
Mẹo nâng cao: Cấu hình bảo vệ RAM và giới hạn kết nối
Cấu hình bảo vệ RAM giúp hệ thống Linux không bị OOM Killer (Out Of Memory) giết tiến trình MongoDB khi bộ nhớ đầy.
Chỉnh sửa file /etc/mongod.conf để giới hạn lượng RAM mà MongoDB được phép sử dụng, tránh tranh chấp tài nguyên với các ứng dụng khác.
sudo nano /etc/mongod.conf
Thêm hoặc chỉnh sửa phần storage với tham số wiredTiger.engineConfig.collectionSizeCheck hoặc giới hạn bộ nhớ cache nếu cần thiết. Quan trọng hơn là cấu hình hệ thống Linux để ưu tiên MongoDB.
Để giới hạn kết nối đồng thời (maxIncomingConnections), tìm phần net trong file cấu hình và chỉnh sửa.
# Nội dung cần thêm/sửa trong /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1
maxIncomingConnections: 20000
Khởi động lại dịch vụ để áp dụng thay đổi.
sudo systemctl restart mongod
Để bảo vệ RAM ở cấp độ hệ thống, chỉnh sửa file /etc/sysctl.conf để tăng giới hạn file descriptor và giảm thiểu việc swap (gây chậm).
sudo nano /etc/sysctl.conf
Thêm các dòng sau vào cuối file:
vm.overcommit_memory = 1
fs.file-max = 65536
net.core.somaxconn = 20000
Áp dụng ngay các thay đổi của sysctl.
sudo sysctl -p
Kết quả mong đợi: Lệnh sysctl -p in ra thông báo success và MongoDB sẽ không bị kill khi RAM gần đầy, đồng thời chịu được lượng kết nối lớn hơn.
Verify cấu hình nâng cao
Kiểm tra xem MongoDB đã nhận diện đúng giới hạn kết nối mới chưa.
mongosh --host 127.0.0.1 -u admin -p 'YourSecurePassword' --authenticationDatabase admin --eval "db.adminCommand('serverStatus').connections.current"
Con số trả về sẽ là số kết nối hiện tại, và hệ thống sẽ tự động từ chối kết nối mới nếu vượt quá maxIncomingConnections đã cấu hình.
Điều hướng series:
Mục lục: Series: Triển khai Database Document với MongoDB và Ubuntu 24.04
« Phần 5: Tối ưu hóa hiệu năng với Indexing và Query Plan