配套脚本:
mongo备份脚本.sh
本文档只讲脚本本身的使用;Windows 共享和账号的搭建见《MongoDB备份到Windows共享_完整教程》。
一、脚本做什么
每次运行按顺序执行:
- 检查共享凭证文件是否存在(不存在直接退出,退出码 1)
- 自动创建本地备份目录
- 对配置的数据库列表逐个执行
mongodump(gzip 压缩归档) - 每个库备份成功后立即用
smbclient上传到 Windows 共享 - 清理本地超过 7 天的旧备份
- 清理 Windows 共享上超过 30 天的旧备份
- 汇总结果:全部成功输出
✅;有失败项列出清单并以退出码 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 |
七、改动后检查清单
每次修改脚本配置后,按这个顺序过一遍:
- [ ]
dos2unix处理过(只要在 Windows 上碰过脚本) - [ ] 手动运行一次,日志无
❌ - [ ] 本地
/data/dbbackup/有新文件 - [ ] Windows 共享
mongo目录有同名文件 - [ ]
crontab -l确认定时任务还在