MongoDB 容器数据备份
具体操作步骤
1 创建文件夹,赋予权限
mkdir-p/opt/mongo-back/{log,mongodb_backups,scripts}chmod-R755/opt/mongo-backcd/opt/mongo-back/logtouchmongo_backup.log2 创建脚本
vimongo_backup.sh#!/bin/bash# --- 配置区 ---# MongoDB容器的名字或IDCONTAINER_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,并将输出目录挂载到宿主机dockerexec"$CONTAINER_NAME"mongodump--out"/tmp/backup_$TIMESTAMP"# 检查容器内命令是否执行成功if[$?-eq0];then# 将容器内的临时备份文件复制到宿主机dockercp"$CONTAINER_NAME:/tmp/backup_$TIMESTAMP""$BACKUP_PATH"echo"[$TIMESTAMP] 备份成功完成,存放于:$BACKUP_PATH">>$LOG_FILE# (可选) 清理容器内的临时备份dockerexec"$CONTAINER_NAME"rm-rf"/tmp/backup_$TIMESTAMP"# (可选) 清理宿主机上的旧备份,比如只保留最近7天的find"$BACKUP_DIR"-typed-name"backup_*"-mtime+7-execrm-rf{}\;echo"[$TIMESTAMP] 已清理7天前的旧备份。">>$LOG_FILEelseecho"[$TIMESTAMP] 备份失败!容器内命令执行出错。">>$LOG_FILEfiecho"----------------------------------------">>$LOG_FILE3 创建定时任务
crontab-e# 输入一下内容# 每天三点备份数据库03* * * /opt/mongo-back/scripts/mongo_backup.sh4 赋执行权,查看定时任务
chmod+x /opt/mongo-back/scripts/mongo_backup.shcrontab-l5 执行命令, 查看效果
6 数据库有认证校验的
#!/bin/bash# --- 配置区 ---# MongoDB容器的名字或IDCONTAINER_NAME="78979574f748"# <-- 一定要改成你的容器名# 宿主机上存放备份的目录BACKUP_DIR="/opt/mongo-back/mongodb_backups"# 日志文件LOG_FILE="/opt/mongo-back/log/mongo_backup.log"# --- MongoDB 认证信息 ---# 注意:在容器内部,host 通常就是 localhost 或者 127.0.0.1MONGO_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 指定要备份的库dockerexec"$CONTAINER_NAME"mongodump--uri="$MONGO_URI"--db="$MONGO_DB_TO_BACKUP"--out="/tmp/backup_$TIMESTAMP"# 检查容器内命令是否执行成功if[$?-eq0];then# 将容器内的临时备份文件复制到宿主机dockercp"$CONTAINER_NAME:/tmp/backup_$TIMESTAMP""$BACKUP_PATH"echo"[$TIMESTAMP] 备份成功完成,存放于:$BACKUP_PATH">>$LOG_FILE# (可选) 清理容器内的临时备份dockerexec"$CONTAINER_NAME"rm-rf"/tmp/backup_$TIMESTAMP"echo"[$TIMESTAMP] 已清理容器内的临时备份。">>$LOG_FILE# (可选) 清理宿主机上的旧备份,比如只保留最近7天的find"$BACKUP_DIR"-typed-name"backup_*"-mtime+7-execrm-rf{}\;echo"[$TIMESTAMP] 已清理7天前的旧备份。">>$LOG_FILEelseecho"[$TIMESTAMP] 备份失败!容器内命令执行出错,请检查认证信息或容器状态。">>$LOG_FILE# 可以在这里加入告警逻辑,比如发送邮件或钉钉消息fiecho"----------------------------------------">>$LOG_FILE7 根据备份文件恢复数据
我的容器名称为mongo
- 将宿主机的整个备份文件夹拷贝到容器的 /tmp 目录下
dockercp/opt/mongo-back/mongodb_backups/backup_20251119_030001/superior mongo:/tmp/superior_backup- 在容器内执行恢复命令,路径使用容器内的路径 (无认证)
dockerexecmongo mongorestore--hostlocalhost--port27017--dbsuperior--drop/tmp/superior_backup- 在容器内执行恢复命令,路径使用容器内的路径 (有认证)
dockerexecmongo mongorestore--hostlocalhost--port27017--dbsuperior--drop-uadmin-p'密码'--authenticationDatabaseadmin /tmp/superior_backup