之前写了一个Linux 定时备份数据库的脚步,这几天发现没有备份成功,于是做了问题排查,下面是排查记录。
/home/user/backup_mongo.sh
#!/bin/bash # # mongo 定时备份脚本示例 # # 1. 设置日期时间,用于区分不同的备份文件夹 DATE=$(date +%F-%H-%M-%S) # 2. 设置备份目录,将在 /data/backup 下创建以当前日期时间命名的文件夹 BACKUP_DIR="/data/backup/${DATE}" # 3. 如果目录不存在,创建目录 mkdir -p "${BACKUP_DIR}" # 4. 执行 mongodump 备份操作 # 将 blog 数据库备份到 BACKUP_DIR 路径下 mongodump --host 127.0.0.1 --port 27017 --db blog --out "${BACKUP_DIR}" # 5. 可选:清理过旧的备份文件(例如保留 15 天内的备份) find /data/backup -type d -mtime +15 -exec rm -rf {} \; # 6. 脚本结束
保存并退出后,给脚本添加执行权限:
chmod +x /home/user/backup_mongo.sh
crontab -e
打开文件配置如下:
0 1 * * * /bin/bash /home/user/backup_mongo.sh >> /var/log/mongo_backup.log 2>&1
0 1 * * *
表示在每天的 1 点 0 分执行脚本。>> /var/log/mongo_backup.log 2>&1
表示将脚本执行的输出信息与错误信息都重定向到 /var/log/mongo_backup.log,方便后期查看日志。该脚本的确执行了,但是只在data/backup
下生成了日期文件夹,并没有备份的数据。
查看日志:
cat /var/log/mongo_backup.log ## 输出内容 /home/user/backup_mongo.sh: line 17: mongodump: command not found
在执行定时任务时出现 mongodump: command not found,通常是因为 系统的 PATH 环境变量 在定时任务(cron)执行时与交互式 Shell 不同,导致找不到 mongodump 命令。
which mongodump
输出:
/usr/mongodb/bin/mongodump
/usr/mongodb/bin/mongodum --host 127.0.0.1 --port 27017 --db blog --out "${BACKUP_DIR}"
问题解决。
在执行定时任务时出现 mongodump: command not found
,通常是因为 系统的 PATH
环境变量 在定时任务(cron)执行时与交互式 Shell 不同,导致找不到 mongodump
命令。以下是几种常见的解决方案:
mongodump
的绝对路径找到 mongodump
的安装路径,常用方法:
which mongodump
假设输出为 /usr/bin/mongodump
(也可能是 /usr/local/bin/mongodump
,根据你本地安装情况而定)。
在脚本中,将 mongodump
替换为其绝对路径,例如:
#!/bin/bash DATE=$(date +%F-%H-%M-%S) BACKUP_DIR="/data/backup/${DATE}" mkdir -p "${BACKUP_DIR}" # 使用绝对路径 /usr/bin/mongodump --host 127.0.0.1 --port 27017 --db blog --out "${BACKUP_DIR}" # ...
这样,脚本在任何环境下都能找到 mongodump
。
在一些发行版中,/etc/profile
、~/.bashrc
等文件中会对 PATH 做扩展,但 cron 默认不会加载这些脚本。可以在脚本开头手动指定 PATH,例如:
#!/bin/bash # 显式指定 PATH export PATH=$PATH:/usr/local/bin:/usr/bin DATE=$(date +%F-%H-%M-%S) BACKUP_DIR="/data/backup/${DATE}" mkdir -p "${BACKUP_DIR}" mongodump --host 127.0.0.1 --port 27017 --db blog --out "${BACKUP_DIR}"
根据实际安装环境,补充上包含 mongodump
的目录即可。
在 crontab -e
中,也可以在任务之前声明 PATH,例如:
# Cron 的 PATH 配置 PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin # 每天凌晨1点执行脚本 0 1 * * * /bin/bash /home/timing-script/backup_mongo.sh >> /var/log/mongo_backup.log 2>&1
将 /usr/local/bin
或实际安装 mongodump
的目录加入 PATH,保证 cron 运行时能找到该命令。
修改后立即验证:执行以下命令手动触发脚本(不通过 cron),观察是否报错:
/bin/bash /home/timing-script/backup_mongo.sh
如果脚本可以正常执行并产生备份文件,那么问题很可能就只是 PATH 的问题。
查看日志:等下一次定时任务执行后,查看 /var/log/mongo_backup.log
确认是否正常执行、是否还有报错信息。