Docker 部署 MongoDB 6.0 数据库每日自动备份实践:本地 + 异地保留 7 天_20260429

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/

总结:

这套方案不复杂,但闭环完整:能备份、能异地、能留日志、能自动清理。

相关推荐
szccyw01 小时前
如何在XSLT中将动态字段值(如name)安全插入HTML链接的URL参数中
jvm·数据库·python
Cat_Rocky1 小时前
K8S-daemonset控制器
云原生·容器·kubernetes
qq_460978401 小时前
如何在 PHP 包含文件中动态排除当前页面的导航项
jvm·数据库·python
wolfengi1 小时前
python之使用docxtpl渲染word模板
数据库·python·word
2401_831419441 小时前
Layui如何实现表格内部的图片点击后进入相册轮播模式
jvm·数据库·python
INosdfgs1 小时前
HAProxy 入门:高性能开源负载均衡
运维·其他·开源·负载均衡
Jetev1 小时前
SQL使用JOIN连接更新目标表数据_UPDATE语句结合JOIN语法实现
jvm·数据库·python
2401_832365521 小时前
如何用最快速度完成Navicat的Linux系统完美安装配置_傻瓜式操作步骤
jvm·数据库·python
大袁同学1 小时前
【进程间通信】:洞穿边界修管道,映射内存渡进程
linux·c++·管道·进程间通信·ipc