一次 MongoDB 数据库定时任务问题排查

发布时间:2025-01-09
2977 字, 需阅读 6 分钟
已被阅读60

之前写了一个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

加入Linux定时任务

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 命令。

查找 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 命令。以下是几种常见的解决方案:


1. 在脚本中使用 mongodump绝对路径

  1. 找到 mongodump 的安装路径,常用方法:

    which mongodump

    假设输出为 /usr/bin/mongodump(也可能是 /usr/local/bin/mongodump,根据你本地安装情况而定)。

  2. 在脚本中,将 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


2. 在脚本顶部显式导入环境变量

在一些发行版中,/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 的目录即可。


3. 在 crontab 中显式设置 PATH

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 运行时能找到该命令。


4. 验证

  1. 修改后立即验证:执行以下命令手动触发脚本(不通过 cron),观察是否报错:

    /bin/bash /home/timing-script/backup_mongo.sh

    如果脚本可以正常执行并产生备份文件,那么问题很可能就只是 PATH 的问题。

  2. 查看日志:等下一次定时任务执行后,查看 /var/log/mongo_backup.log 确认是否正常执行、是否还有报错信息。

作者:admin
版权声明:
本文采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
分享到: