具体操作步骤

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

更多推荐