Crontab与bash脚本中mysqldump备份的两个问题求助
解决Crontab备份脚本的两个问题:旧文件未删除&文件名带问号
咱们逐个来排查和解决你遇到的这两个问题:
问题一:find命令未删除旧备份文件
可能的原因
- 环境变量/路径问题:Crontab的默认PATH非常有限,可能找不到
find命令的完整路径(比如默认PATH里没包含/usr/bin),导致命令执行失败。 - 权限不足:执行Crontab任务的用户(比如root或者普通用户)没有对
/opt/mysqlbackup目录的读写删除权限,无法删除里面的文件。 - mtime参数理解偏差:
-mtime +2指的是修改时间超过2天前的文件,如果你的需求是删除2小时前的备份,这个参数就不符合预期,不会删除任何文件。 - find命令语法兼容性:部分老版本的find工具对
-exec rm {} +的支持可能有问题,或者路径拼写错误(比如/opt/mysqlbackup不存在或拼写错了)。
解决方案
- 指定find的绝对路径:把脚本里的
find改成绝对路径(一般是/usr/bin/find),避免Crontab找不到命令:
这里用/usr/bin/find /opt/mysqlbackup -type f -mtime +2 -delete-delete替代-exec rm {} +,语法更简洁,也减少了出错概率。 - 检查并修复权限:执行以下命令确认目录权限,确保Crontab用户有操作权限:
ls -ld /opt/mysqlbackup # 如果权限不足,比如只有root能写,可调整权限(根据实际需求) chown -R your_cron_user:your_cron_group /opt/mysqlbackup chmod -R 750 /opt/mysqlbackup - 修正mtime参数:如果要删除2小时前的备份,把
-mtime +2改成-mmin +120(120分钟=2小时):/usr/bin/find /opt/mysqlbackup -type f -mmin +120 -delete - 添加日志排查:给find命令加日志输出,方便定位问题:
之后查看/usr/bin/find /opt/mysqlbackup -type f -mtime +2 -delete >> /opt/mysqlbackup/cleanup.log 2>&1cleanup.log就能看到命令执行的报错信息。
问题二:备份文件名末尾带问号(如2020-02-02-12.12_mydb.sql.gz?)
可能的原因
这个问题90%以上是脚本的换行符格式问题:如果你的脚本是在Windows系统下编辑的,会使用CRLF(\r\n)作为换行符,而Linux系统只认LF(\n)。当脚本在Linux上执行时,date命令的输出会被带上多余的\r(回车符),这个字符在终端显示时就会变成问号。
解决方案
- 转换脚本换行符为Linux格式:使用
dos2unix工具转换脚本:
如果没有dos2unix /opt/mysqlbackup.shdos2unix,也可以用sed命令手动删除\r字符:sed -i 's/\r$//' /opt/mysqlbackup.sh - 验证文件名的特殊字符:用
od -c命令查看文件名的实际字符,确认是否有\r:
如果输出里最后有od -c /opt/mysqlbackup/2020-02-02-12.12_mydb.sql.gz?\r,说明就是换行符的问题,转换脚本后就会解决。 - 额外注意:Crontab里的%转义:虽然你的
date命令写在脚本里不需要转义,但如果以后直接在Crontab行里写date,记得把%转义成\%(因为Crontab里%是特殊字符,用来表示换行)。
内容的提问来源于stack exchange,提问作者Chatis
相关产品推荐
相关产品推荐

