配套脚本:mongo备份脚本.sh
本文档只讲脚本本身的使用;Windows 共享和账号的搭建见《MongoDB备份到Windows共享_完整教程》。


一、脚本做什么

每次运行按顺序执行:

  1. 检查共享凭证文件是否存在(不存在直接退出,退出码 1)
  2. 自动创建本地备份目录
  3. 对配置的数据库列表逐个执行 mongodump(gzip 压缩归档)
  4. 每个库备份成功后立即用 smbclient 上传到 Windows 共享
  5. 清理本地超过 7 天的旧备份
  6. 清理 Windows 共享上超过 30 天的旧备份
  7. 汇总结果:全部成功输出 ✅;有失败项列出清单并以退出码 1 结束

关键特性:单个库失败不影响其他库,失败信息会在最后汇总。


二、配置项逐条说明

所有配置都在脚本开头,改完即生效,无需改其他部分。

2.1 MongoDB 连接

DB_HOST="127.0.0.1"     # MongoDB 地址。在别的机器就填它的 IP
DB_PORT="27017"         # 端口,默认 27017
  • MongoDB 不在本机时,需确认对端的 bindIp 和防火墙已放行(详见完整教程 3.7 节)。

2.2 备份哪些数据库

TARGET_DBS=("TestDB")                  # 单库
TARGET_DBS=("TestDB" "OtherDB")        # 多库:空格分隔,要加库直接往后写
TARGET_DBS=("ALL")                     # 特殊值 ALL:备份整个实例的所有库
  • 每个库生成一个独立文件:库名_backup_日期_时间.gzip
  • ALL 模式生成单个文件:ALLDB_backup_日期_时间.gzip,包含全部库

2.3 MongoDB 认证(可选)

# DB_USER="your_user"
# DB_PASS="your_password"
# AUTH_DB="admin"
  • 三行都注释 = 无认证连接(默认)。
  • MongoDB 开了认证就取消注释填上。账号权限要求:backup 角色,或对所有目标库的读权限。

2.4 本地与共享路径

LOCAL_BACKUP_DIR="/data/dbbackup"   # 本地备份目录,不存在会自动创建

WIN_SHARE_IP="192.168.1.10"         # Windows 服务器 IP
WIN_SHARE_PATH="backups"            # 共享名
WIN_SUBDIR="mongo"                  # 共享根下的子目录,需提前在 Windows 建好

CRED_FILE="/root/.smb/win_cred"     # 凭证文件,内容格式见下

凭证文件格式(权限必须 600):

username=mongobak
password=你的密码

2.5 保留策略

LOCAL_RETENTION_DAYS=7    # 本地保留天数(应用服务器磁盘有限,别设太大)
WIN_RETENTION_DAYS=30     # 共享上保留天数(共享是长期存储)

清理按文件名中的日期判断,只删 *_backup_*.gzip 格式的文件,不会误删目录里其他文件。


三、部署步骤(简版)

# 1. 安装依赖
sudo yum install -y samba-client mongodb-database-tools dos2unix

# 2. 放置脚本并处理换行符(Windows 编辑过的脚本必须做这步)
sudo mkdir -p /opt/scripts
# 上传脚本后:
sudo dos2unix /opt/scripts/mongo_backup.sh
sudo chmod +x /opt/scripts/mongo_backup.sh

# 3. 建凭证文件
sudo mkdir -p /root/.smb
sudo tee /root/.smb/win_cred << 'EOF'
username=mongobak
password=你的密码
EOF
sudo chmod 600 /root/.smb/win_cred

# 4. 修改脚本配置区(DB_HOST、TARGET_DBS、WIN_SHARE_IP 等)
sudo vi /opt/scripts/mongo_backup.sh

# 5. 手动跑一次验证
sudo /opt/scripts/mongo_backup.sh

# 6. 确认无误后加定时任务(每天凌晨 2 点)
sudo crontab -e

crontab 内容:

0 2 * * * /opt/scripts/mongo_backup.sh >> /var/log/mongo_backup.log 2>&1

四、日常使用

4.1 看日志

tail -50 /var/log/mongo_backup.log

正常输出示例:

[2026-08-25 02:00:01] 开始备份数据库 [TestDB](127.0.0.1:27017)...
[2026-08-25 02:00:03] ✅ 备份成功: /data/dbbackup/TestDB_backup_20260825_020001.gzip
[2026-08-25 02:00:03] 正在上传到 Windows 共享 //192.168.1.10/backups/mongo ...
[2026-08-25 02:00:05] ✅ 上传成功: TestDB_backup_20260825_020001.gzip
[2026-08-25 02:00:05] 清理本地超过 7 天的旧备份...
[2026-08-25 02:00:05] 清理共享上超过 30 天的旧备份...
[2026-08-25 02:00:06] ✅ 备份任务完成,全部成功(1 个目标)。

4.2 判断失败

  • 日志中出现 ❌ 表示某一步失败,看同行的库名和提示。
  • 脚本退出码:全部成功为 0,有失败为 1。需要接监控系统时,按退出码告警即可:
/opt/scripts/mongo_backup.sh >> /var/log/mongo_backup.log 2>&1 || echo "MongoDB 备份失败,请检查" | mail -s "备份告警" ops@example.com

4.3 备份文件在哪

位置 路径 保留时长
应用服务器本地 /data/dbbackup/TestDB_backup_*.gzip 7 天
Windows 共享 D:\backups\mongo\TestDB_backup_*.gzip 30 天

五、恢复数据

5.1 常规恢复(文件在本地)

mongorestore --host 127.0.0.1 --port 27017 \
  --gzip --archive=/data/dbbackup/TestDB_backup_20260825_020001.gzip \
  --db TestDB --drop

5.2 文件只在共享上

# 先从共享拉回本地
smbclient -m SMB3 "//192.168.1.10/backups" -A /root/.smb/win_cred \
  -c "cd mongo; get TestDB_backup_20260825_020001.gzip /tmp/restore.gzip"

# 再恢复
mongorestore --gzip --archive=/tmp/restore.gzip --db TestDB --drop

5.3 ALL 模式备份恢复单个库

mongorestore --gzip --archive=ALLDB_backup_20260825_020001.gzip \
  --nsInclude="TestDB.*"

⚠️ --drop 会先删掉现有同名集合再恢复,生产环境务必确认后再加。

5.4 恢复演练建议

每季度挑一个备份文件,恢复到测试库名验证完整性:

mongorestore --gzip --archive=/data/dbbackup/TestDB_backup_xxx.gzip \
  --nsFrom="TestDB.*" --nsTo="TestDB_restore_test.*"

恢复到新库名不影响线上数据,验证完删掉即可。


六、常见问题

现象 原因 处理
无法执行 xxx.sh: 没有那个文件或目录 脚本带 Windows 换行符 dos2unix /opt/scripts/mongo_backup.sh
凭证文件不存在 没建 /root/.smb/win_cred 按第三节第 3 步创建
备份失败 紧跟某库名 mongodump 连不上或权限不足 检查 DB_HOST/端口/认证;远程场景查 bindIp 和防火墙
上传失败 共享不通或账号没写权限 用smbclient -m SMB3 "//IP/backups" -A 凭证 -c "ls" 单独测
共享上老文件没删掉 保留天数内属正常 确认WIN_RETENTION_DAYS 设置
cron 不执行但手动正常 cron 环境变量差异 脚本内全是绝对路径即可;查/var/log/cron

七、改动后检查清单

每次修改脚本配置后,按这个顺序过一遍:

  1. [ ] dos2unix 处理过(只要在 Windows 上碰过脚本)
  2. [ ] 手动运行一次,日志无 ❌
  3. [ ] 本地 /data/dbbackup/ 有新文件
  4. [ ] Windows 共享 mongo 目录有同名文件
  5. [ ] crontab -l 确认定时任务还在