方案: mongo server 本地备份,然后再scp 到 备份机器中归档
1.归档+压缩
基础用法:
mongodump --db bxc \ --username <你的用户名> \ --password <你的密码> \ --authenticationDatabase admin \ --archive=/path/to/backup/bxc_$(date +%Y%m%d).archive.gz \ --gzip
-
这个命令会直接在
/path/to/backup/目录下生成一个名为bxc_20260623.archive.gz的单一备份文件。
指定主要备份哪些集合: eg: 只备份 bxc 数据库中名为 users 的集合
docker exec sea_mongo_7 mongodump \ --db bxc \ --collection users \ --username root \ --password 'root@2024' \ --authenticationDatabase admin \ --archive \ --gzip \ > /home/hadoop/backups/bxc_users_$(date +%Y%m%d).archive.gz
docker 版本:
docker exec sea_mongo_7 mongodump \ --db bxc \ --username root \ --password 'root@2024' \ --authenticationDatabase admin \ --archive \ --gzip > /home/hadoop/backups/192-168-186-57_bxc_$(date +%Y%m%d).archive.gz
高阶用法:流式备份到对象存储
这是“归档+压缩”模式的一大亮点,可以避免备份文件占用本地磁盘空间
mongodump --db bxc \ --username <你的用户名> \ --password <你的密码> \ --authenticationDatabase admin \ --archive --gzip \ | aws s3 cp - "s3://your-backup-bucket/bxc_$(date -u +%Y%m%d).archive.gz"
这个命令将备份数据通过管道直接上传到AWS S3,本地不保留任何文件。
2.对应恢复命令
方案一: 全部恢复
基础用法
mongorestore --db bxc \ --username <你的用户名> \ --password <你的密码> \ --authenticationDatabase admin \ --archive=/path/to/backup/bxc_20260623.archive.gz \ --gzip \ --drop
docker 版本:
docker exec -i sea_mongo_7 mongorestore \ --username root \ --password 'root@2024' \ --authenticationDatabase admin \ --archive \ --gzip \ --drop \ < /home/sea/backups/192-168-186-57_bxc_20260623.archive.gz
方案二:只恢复特定的集合
如果只需要恢复 bxc 库中的某个集合(例如 users):
docker exec -i sea_mongo_7 mongorestore \ --username root \ --password 'root@2024' \ --authenticationDatabase admin \ --db bxc \ --collection users \ --archive \ --gzip \ --drop \ < /home/sea/backups/192-168-186-57_bxc_20260623.archive.gz
case2 恢复时修改db name, eg: 之前备份的数据库 是bxc 现在 改为 bxc_bk
sudo docker exec -i sea_mongo_7 mongorestore \ --username root \ --password 'root@2024' \ --authenticationDatabase admin \ --archive \ --gzip \ --nsFrom "bxc.*" \ --nsTo "bxc_bk.*" \ --drop \ < /home/sea/backups/bxc_$(date +%Y%m%d).archive.gz
备份脚本,定时任务:
mogo_backup.sh
#!/bin/bash set -e # mogmo_backup.sh # ========================================================== # MongoDB 备份脚本(使用容器内 mongodump + sshpass 传输) # 依赖:sshpass 已安装,环境变量已设置 !!! 需要安装 apt-get install sshpass # 功能: # - 备份数据库 bxc(归档 + gzip 压缩) # - 传输至远程服务器 # - 本地保留 7 天(可调整) # - 远程保留 30 天(自动清理) # ========================================================== # ---------- 配置 ---------- CONTAINER_NAME="sea_mongo_7" #mongo docker 容器name MONGO_USER="root" MONGO_PASS="${MONGODB_PASSWORD:-root}" # 从环境变量读取,默认值仅作回退 DB_NAME="bxc" AUTH_DB="admin" IP_TAG="192-168-18-57" BACKUP_BASE="$HOME/backups" LOCAL_RETENTION_DAYS=7 REMOTE_USER="sea" REMOTE_HOST="192.168.18.176" REMOTE_PATH="/home/hadoop/backup1857/mongodb" REMOTE_RETENTION_DAYS=30 REMOTE_PASS="hadoop123" # 远程服务器密码,从环境变量读取 # ---------- 构建文件名 ---------- BACKUP_NAME="${IP_TAG}_${DB_NAME}_$(date +%Y%m%d)" BACKUP_FILE="${BACKUP_BASE}/${BACKUP_NAME}.archive.gz" # ---------- 检查必要环境 ---------- if [ -z "$REMOTE_PASS" ]; then echo "错误:未设置环境变量 REMOTE_PASSWORD" >&2 exit 1 fi if [ -z "$MONGO_PASS" ]; then echo "错误:未设置环境变量 MONGODB_PASSWORD" >&2 exit 1 fi mkdir -p "$BACKUP_BASE" echo "[$(date)] 开始备份数据库 ${DB_NAME}(使用容器内 mongodump)..." # ---------- 执行备份(容器内 mongodump 输出到宿主机) ---------- docker exec "$CONTAINER_NAME" mongodump \ --db "$DB_NAME" \ --username "$MONGO_USER" \ --password "$MONGO_PASS" \ --authenticationDatabase "$AUTH_DB" \ --archive \ --gzip \ > "$BACKUP_FILE" # 检查备份文件是否生成且非空 if [ ! -s "$BACKUP_FILE" ]; then echo "[$(date)] 备份失败,文件为空!" >&2 exit 1 fi echo "[$(date)] 备份成功,文件大小:$(du -h "$BACKUP_FILE" | cut -f1)" # ---------- 传输到远程服务器(使用 sshpass) ---------- echo "[$(date)] 传输到远程服务器 ${REMOTE_HOST}..." sshpass -p "$REMOTE_PASS" scp "$BACKUP_FILE" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" if [ $? -eq 0 ]; then echo "[$(date)] 传输成功" else echo "[$(date)] 传输失败" >&2 exit 1 fi # ---------- 清理本地超过 7 天的备份 ---------- find "$BACKUP_BASE" -name "${IP_TAG}_${DB_NAME}_*.archive.gz" -mtime +${LOCAL_RETENTION_DAYS} -delete # ---------- 清理远程超过 30 天的备份(使用 sshpass) ---------- echo "[$(date)] 清理远程服务器 ${REMOTE_HOST} 上超过 ${REMOTE_RETENTION_DAYS} 天的备份..." sshpass -p "$REMOTE_PASS" ssh "${REMOTE_USER}@${REMOTE_HOST}" \ "find ${REMOTE_PATH} -name '${IP_TAG}_${DB_NAME}_*.archive.gz' -mtime +${REMOTE_RETENTION_DAYS} -delete" \ || echo "[$(date)] 远程清理失败(忽略)" echo "[$(date)] 全部任务完成"
定时任务: */5 * * * * 每5min
chmod +x /home/sea/mongo_backup_bxc.sh 添加定时任务(每天凌晨 2:00 执行): bash crontab -e 加入: bash 0 2 * * * /home/sea/mongo_backup_bxc.sh >> /home/sea/backup_bxc.log 2>&1
# 查看
crontab -l
# 重启确保生效 sudo service cron restart
浙公网安备 33010602011771号