MongoDB 容器数据备份
·
具体操作步骤
1 创建文件夹,赋予权限
mkdir -p /opt/mongo-back/{log,mongodb_backups,scripts}
chmod -R 755 /opt/mongo-back
cd /opt/mongo-back/log
touch mongo_backup.log
2 创建脚本
vi mongo_backup.sh
#!/bin/bash
# --- 配置区 ---
# MongoDB容器的名字或ID
CONTAINER_NAME="69013dadb912" # <-- 一定要改成你的容器名
# 宿主机上存放备份的目录
BACKUP_DIR="/opt/mongo-back/mongodb_backups"
# 日志文件
LOG_FILE="/opt/mongo-back/log/mongo_backup.log"
# --- 脚本逻辑 ---
# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"
# 生成带时间戳的备份文件夹名
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
# 这次备份文件将直接存放在宿主机的这个路径下
BACKUP_PATH="$BACKUP_DIR/backup_$TIMESTAMP"
echo "[$TIMESTAMP] 开始备份容器 $CONTAINER_NAME 中的 MongoDB 数据库..." >> $LOG_FILE
# 核心命令:在容器内执行 mongodump,并将输出目录挂载到宿主机
docker exec "$CONTAINER_NAME" mongodump --out "/tmp/backup_$TIMESTAMP"
# 检查容器内命令是否执行成功
if [ $? -eq 0 ]; then
# 将容器内的临时备份文件复制到宿主机
docker cp "$CONTAINER_NAME:/tmp/backup_$TIMESTAMP" "$BACKUP_PATH"
echo "[$TIMESTAMP] 备份成功完成,存放于: $BACKUP_PATH" >> $LOG_FILE
# (可选) 清理容器内的临时备份
docker exec "$CONTAINER_NAME" rm -rf "/tmp/backup_$TIMESTAMP"
# (可选) 清理宿主机上的旧备份,比如只保留最近7天的
find "$BACKUP_DIR" -type d -name "backup_*" -mtime +7 -exec rm -rf {} \;
echo "[$TIMESTAMP] 已清理7天前的旧备份。" >> $LOG_FILE
else
echo "[$TIMESTAMP] 备份失败!容器内命令执行出错。" >> $LOG_FILE
fi
echo "----------------------------------------" >> $LOG_FILE
3 创建定时任务
crontab -e
# 输入一下内容
# 每天三点备份数据库
0 3 * * * /opt/mongo-back/scripts/mongo_backup.sh
4 赋执行权,查看定时任务
chmod +x /opt/mongo-back/scripts/mongo_backup.sh
crontab -l
5 执行命令, 查看效果

6 数据库有认证校验的
#!/bin/bash
# --- 配置区 ---
# MongoDB容器的名字或ID
CONTAINER_NAME="78979574f748" # <-- 一定要改成你的容器名
# 宿主机上存放备份的目录
BACKUP_DIR="/opt/mongo-back/mongodb_backups"
# 日志文件
LOG_FILE="/opt/mongo-back/log/mongo_backup.log"
# --- MongoDB 认证信息 ---
# 注意:在容器内部,host 通常就是 localhost 或者 127.0.0.1
MONGO_HOST="localhost"
MONGO_PORT="27017"
MONGO_USER="admin"
MONGO_PASS="admin123"
MONGO_AUTH_DB="admin" # 认证数据库
MONGO_DB_TO_BACKUP="test_db" # 要备份的目标数据库
# --- 脚本逻辑 ---
# 创建备份目录和日志目录(如果不存在)
mkdir -p "$BACKUP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"
# 生成带时间戳的备份文件夹名
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
# 这次备份文件将直接存放在宿主机的这个路径下
BACKUP_PATH="$BACKUP_DIR/backup_$TIMESTAMP"
echo "[$TIMESTAMP] 开始备份容器 $CONTAINER_NAME 中的数据库 '$MONGO_DB_TO_BACKUP'..." >> $LOG_FILE
# 构建认证URI,路径为空,使用 authSource 指定认证库
MONGO_URI="mongodb://${MONGO_USER}:${MONGO_PASS}@${MONGO_HOST}:${MONGO_PORT}/?authSource=${MONGO_AUTH_DB}"
# 核心命令:在容器内执行 mongodump,使用URI认证,并用 --db 指定要备份的库
docker exec "$CONTAINER_NAME" mongodump --uri="$MONGO_URI" --db="$MONGO_DB_TO_BACKUP" --out="/tmp/backup_$TIMESTAMP"
# 检查容器内命令是否执行成功
if [ $? -eq 0 ]; then
# 将容器内的临时备份文件复制到宿主机
docker cp "$CONTAINER_NAME:/tmp/backup_$TIMESTAMP" "$BACKUP_PATH"
echo "[$TIMESTAMP] 备份成功完成,存放于: $BACKUP_PATH" >> $LOG_FILE
# (可选) 清理容器内的临时备份
docker exec "$CONTAINER_NAME" rm -rf "/tmp/backup_$TIMESTAMP"
echo "[$TIMESTAMP] 已清理容器内的临时备份。" >> $LOG_FILE
# (可选) 清理宿主机上的旧备份,比如只保留最近7天的
find "$BACKUP_DIR" -type d -name "backup_*" -mtime +7 -exec rm -rf {} \;
echo "[$TIMESTAMP] 已清理7天前的旧备份。" >> $LOG_FILE
else
echo "[$TIMESTAMP] 备份失败!容器内命令执行出错,请检查认证信息或容器状态。" >> $LOG_FILE
# 可以在这里加入告警逻辑,比如发送邮件或钉钉消息
fi
echo "----------------------------------------" >> $LOG_FILE
7 根据备份文件恢复数据
我的容器名称为mongo
- 将宿主机的整个备份文件夹拷贝到容器的 /tmp 目录下
docker cp /opt/mongo-back/mongodb_backups/backup_20251119_030001/superior mongo:/tmp/superior_backup
- 在容器内执行恢复命令,路径使用容器内的路径 (无认证)
docker exec mongo mongorestore --host localhost --port 27017 --db superior --drop /tmp/superior_backup
- 在容器内执行恢复命令,路径使用容器内的路径 (有认证)
docker exec mongo mongorestore --host localhost --port 27017 --db superior --drop -u admin -p '密码' --authenticationDatabase admin /tmp/superior_backup
更多推荐
所有评论(0)