方案: 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

 

 

posted on 2026-06-23 17:57  lshan  阅读(21)  评论(0)    收藏  举报