MongoDB 是什么数据库?
MongoDB 是一种 NoSQL 文档型数据库,数据按"库、集合、文档"组织。
MongoDB 官方文档地址:
https://www.mongodb.com/docs/可以简单理解为:MySQL 的表类似 MongoDB 的集合,MySQL 的一行数据类似 MongoDB 的文档。
这里的 Document 文档是数据库记录,不是业务上传的 PDF、Word、Excel、图片等附件文件。
mongodump 备份工具官方说明:
https://www.mongodb.com/docs/database-tools/mongodump/本次使用 mongodump 备份的是 MongoDB 数据库内容,包括库、集合、文档、索引及相关元数据;不包含业务附件、应用程序文件、Nacos 配置、对象存储文件,也不是整机备份。
一、说明
本文记录一次 Docker 部署 MongoDB 的自动备份实践。
为避免暴露生产环境信息,文中 IP 均使用示例地址:
源端 MongoDB 服务器:192.168.100.26
异地备份服务器:192.168.100.15
实际使用时,请替换为真实 IP 和目录。
二、本次备份范围
本方案使用 mongodump 执行 MongoDB 全库逻辑备份。
备份内容为:
MongoDB 数据库中的库、集合、文档数据、索引及相关元数据。
需要注意:MongoDB 中的 Document 是数据库中的数据记录,不等同于业务系统上传的 PDF、Word、Excel、图片等真实附件文件。
本方案不包含:
业务附件文件、应用程序文件、Nacos 配置、MinIO/NAS/NFS/对象存储文件、整机系统或虚拟机备份。
三、环境信息
操作系统:CentOS 7.9
部署方式:Docker
MongoDB 镜像:mongo:6.0
MongoDB 容器名:mongodb
MongoDB 端口:27017
本地备份目录:/home/mongodb_backup
异地备份目录:/home/192.168.100.26_mongodb
四、确认 MongoDB 容器状态
docker ps
确认 MongoDB 容器正常运行:
NAMES
mongodb
五、确认 Docker Compose 配置
cd /home/data/mangodb
cat docker-compose.yml
示例配置:
version: '3'
services:
mongo:
image: mongo:6.0
container_name: mongodb
restart: always
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: ********
volumes:
- /home/data/mangodb/db:/data/db
核心关注点:
容器名:mongodb
宿主机数据目录:/home/data/mangodb/db
容器内数据目录:/data/db
docker-compose.yml 中如包含密码,发布文章或截图时必须脱敏。
六、登录 MongoDB 验证
进入容器:
docker exec -it mongodb /bin/bash
登录 MongoDB:
mongosh -u root -p --authenticationDatabase admin
查看数据库:
show dbs
如果能正常显示数据库列表,说明 MongoDB 服务和认证均正常。
七、配置 SSH 免密到异地服务器
在源端服务器执行:
mkdir -p /root/.ssh
chmod 700 /root/.ssh
生成密钥:
ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa -N "" -C "mongodb_backup_to_remote"
复制公钥到异地服务器:
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.100.15
测试免密:
ssh root@192.168.100.15 "hostname"
如果不再提示输入密码,说明 SSH 免密配置成功。
八、创建每日备份脚本
脚本路径:
/home/mongodb_backup/mongodb_backup_daily.sh
创建脚本:
cat > /home/mongodb_backup/mongodb_backup_daily.sh <<'EOF'
#!/bin/bash
# MongoDB Docker 容器每日备份脚本
# 本地备份保留:最近 7 天
# 异地备份保留:最近 7 天
# 备份日志保留:最近 7 天
# 说明:该脚本执行 MongoDB 全库逻辑备份,不包含业务附件文件、应用程序文件和整机系统备份
CONTAINER_NAME="mongodb"
LOCAL_DIR="/home/mongodb_backup"
LOG_DIR="/home/mongodb_backup/logs"
REMOTE_HOST="192.168.100.15"
REMOTE_USER="root"
REMOTE_DIR="/home/192.168.100.26_mongodb"
DATE=$(date +%F_%H%M%S)
BACKUP_FILE="mongodb_all_${DATE}.archive"
LOG_FILE="${LOG_DIR}/mongodb_backup_${DATE}.log"
mkdir -p "${LOCAL_DIR}" "${LOG_DIR}"
exec >> "${LOG_FILE}" 2>&1
echo "========== MongoDB 备份开始:$(date '+%F %T') =========="
echo "[1/6] 检查 MongoDB 容器是否运行..."
docker ps --format '{{.Names}}' | grep -w "${CONTAINER_NAME}" >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "错误:MongoDB 容器 ${CONTAINER_NAME} 未运行。"
echo "备份结果:失败"
exit 1
fi
echo "[2/6] 执行 MongoDB 全库逻辑备份..."
docker exec "${CONTAINER_NAME}" bash -lc "mongodump \
--host 127.0.0.1 \
--port 27017 \
-u \"\$MONGO_INITDB_ROOT_USERNAME\" \
-p \"\$MONGO_INITDB_ROOT_PASSWORD\" \
--authenticationDatabase admin \
--archive=/tmp/${BACKUP_FILE}"
if [ $? -ne 0 ]; then
echo "错误:mongodump 备份执行失败。"
echo "备份结果:失败"
exit 1
fi
echo "[3/6] 将备份文件从容器复制到宿主机..."
docker cp "${CONTAINER_NAME}:/tmp/${BACKUP_FILE}" "${LOCAL_DIR}/${BACKUP_FILE}"
if [ $? -ne 0 ]; then
echo "错误:docker cp 复制备份文件失败。"
echo "备份结果:失败"
exit 1
fi
docker exec "${CONTAINER_NAME}" bash -lc "rm -f /tmp/${BACKUP_FILE}"
chmod 600 "${LOCAL_DIR}/${BACKUP_FILE}"
if [ ! -s "${LOCAL_DIR}/${BACKUP_FILE}" ]; then
echo "错误:本地备份文件为空。"
echo "备份结果:失败"
exit 1
fi
echo "本地备份文件信息:"
ls -lh "${LOCAL_DIR}/${BACKUP_FILE}"
echo "[4/6] 将备份文件复制到异地备份服务器..."
ssh ${REMOTE_USER}@${REMOTE_HOST} "mkdir -p ${REMOTE_DIR} ${REMOTE_DIR}/logs"
scp -p "${LOCAL_DIR}/${BACKUP_FILE}" ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/
if [ $? -ne 0 ]; then
echo "错误:备份文件复制到异地服务器失败。"
echo "备份结果:失败"
exit 1
fi
scp -p "${LOG_FILE}" ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/logs/
echo "[5/6] 检查异地备份文件是否存在且非空..."
ssh ${REMOTE_USER}@${REMOTE_HOST} "test -s ${REMOTE_DIR}/${BACKUP_FILE} && ls -lh ${REMOTE_DIR}/${BACKUP_FILE}"
if [ $? -ne 0 ]; then
echo "错误:异地备份文件检查失败。"
echo "备份结果:失败"
exit 1
fi
ssh ${REMOTE_USER}@${REMOTE_HOST} "chmod 600 ${REMOTE_DIR}/${BACKUP_FILE} ${REMOTE_DIR}/logs/$(basename ${LOG_FILE})"
echo "[6/6] 清理 7 天前的本地和异地备份及日志..."
find "${LOCAL_DIR}" -maxdepth 1 -type f -name "mongodb_all_*.archive" -mtime +6 -exec rm -f {} \;
find "${LOG_DIR}" -type f -name "mongodb_backup_*.log" -mtime +6 -exec rm -f {} \;
ssh ${REMOTE_USER}@${REMOTE_HOST} "find ${REMOTE_DIR} -maxdepth 1 -type f -name 'mongodb_all_*.archive' -mtime +6 -exec rm -f {} \; ; find ${REMOTE_DIR}/logs -type f -name 'mongodb_backup_*.log' -mtime +6 -exec rm -f {} \;"
echo "备份结果:成功"
echo "========== MongoDB 备份结束:$(date '+%F %T') =========="
EOF
授权:
chmod 700 /home/mongodb_backup/mongodb_backup_daily.sh
语法检查:
bash -n /home/mongodb_backup/mongodb_backup_daily.sh
无输出表示语法正常。
九、手工执行测试
/bin/bash /home/mongodb_backup/mongodb_backup_daily.sh
查看日志:
ls -lh /home/mongodb_backup/logs/
tail -n 100 /home/mongodb_backup/logs/mongodb_backup_*.log
日志中出现以下内容,说明备份成功:
备份结果:成功
十、检查本地和异地备份
查看本地备份:
ls -lh /home/mongodb_backup/
ls -lh /home/mongodb_backup/logs/
查看异地备份:
ssh root@192.168.100.15 "ls -lh /home/192.168.100.26_mongodb"
ssh root@192.168.100.15 "ls -lh /home/192.168.100.26_mongodb/logs"
如需收紧异地文件权限:
ssh root@192.168.100.15 "chmod 600 /home/192.168.100.26_mongodb/mongodb_all_*.archive"
ssh root@192.168.100.15 "chmod 600 /home/192.168.100.26_mongodb/logs/* 2>/dev/null"
十一、配置每日定时任务
编辑 root 用户定时任务:
crontab -e
添加:
# 每天凌晨 04:30 自动执行 MongoDB 备份脚本
30 4 * * * /bin/bash /home/mongodb_backup/mongodb_backup_daily.sh >/dev/null 2>&1
查看定时任务:
crontab -l
确认 crond 服务状态:
systemctl status crond
如未运行,执行:
systemctl start crond
systemctl enable crond
十二、配置文件手工备份
本次实操中,也手工留存了 MongoDB 容器配置:
mkdir -p /home/mongodb_backup/config_$(date +%F)
cp -a /home/data/mangodb/docker-compose.yml /home/mongodb_backup/config_$(date +%F)/
docker inspect mongodb > /home/mongodb_backup/config_$(date +%F)/mongodb.inspect.json
chmod 600 /home/mongodb_backup/config_$(date +%F)/*
说明:
当前每日脚本不自动备份 docker-compose.yml 和 docker inspect 配置。
如后续修改容器端口、镜像版本、环境变量或挂载目录,建议重新手工备份配置。
十三、恢复命令参考
恢复前建议先在测试环境验证。
docker cp mongodb_all_2026-04-29_095234.archive mongodb:/tmp/
docker exec -it mongodb bash -lc "mongorestore \
--host 127.0.0.1 \
--port 27017 \
-u \"\$MONGO_INITDB_ROOT_USERNAME\" \
-p \"\$MONGO_INITDB_ROOT_PASSWORD\" \
--authenticationDatabase admin \
--archive=/tmp/mongodb_all_2026-04-29_095234.archive"
如果需要覆盖恢复,可使用:
mongorestore --drop
--drop 会删除目标集合后再恢复,生产环境必须慎用。
十四、总结
本次 MongoDB 备份方案为:
Docker 容器内执行 mongodump 全库逻辑备份
备份文件保存到宿主机
scp 同步到异地服务器
本地和异地均生成日志
crontab 每天 04:30 自动执行
本地和异地备份、日志均保留最近 7 天
最终备份路径:
本地备份路径:
/home/mongodb_backup/
本地日志路径:
/home/mongodb_backup/logs/
异地备份路径:
192.168.100.15:/home/192.168.100.26_mongodb/
异地日志路径:
192.168.100.15:/home/192.168.100.26_mongodb/logs/
总结:
这套方案不复杂,但闭环完整:能备份、能异地、能留日志、能自动清理。