我有一台运行 MySQL 数据库的 RHEL 服务器。我有一个执行的 Bash 脚本mysqldump
来创建备份文件。直接在 Bash 中执行脚本时创建的备份文件大小为 754259 字节。如果通过 cron 运行相同的脚本,则其大小只有 20 个字节。
据我所知, cron 运行的用户上下文与我登录手动运行脚本时使用的用户上下文相同。然而,考虑到尺寸差异,这似乎并非如此。
为什么运行相同的脚本时文件大小不同?
shell脚本内容:
backup_path=/var/custom/db_backups
configFile=/var/custom/auth.cnf
db_name=[db_name]
date=$(date +"%d-%b-%Y")
sudo /opt/rh/mysql55/root/usr/bin/mysqldump --defaults-extra-file=$configFile $db_name | gzip -9 > $backup_path/$db_name-$date.sql.gz
编辑 cron:
sudo crontab -e
cron 文件内容:
12 21 * * * /var/custom/maint_plan
这会在每天晚上 9:13 执行该脚本。
答案1
该mysqldump
命令不返回任何内容,它通过管道传输gzip
并以空的 gzip 文件结尾。看:
$ echo -n "" | gzip -9 > test.gz
$ stat -c %s test.gz
20
这会生成一个大小为 20 字节的文件。所以问题出在mysqldump
命令上。由于它是 root 的 crontab,因此该脚本以 root 权限运行。sudo
没有必要。使用它,无需sudo
.只是:
/opt/rh/mysql55/root/usr/bin/mysqldump --defaults-extra-file=$configFile $db_name | gzip -9 > $backup_path/$db_name-$date.sql.gz
答案2
通过 cron 运行的脚本失败。 20 字节是空 MySQL 转储的大小。
答案3
cron 运行脚本的环境非常有限。它可能找不到所有必需的程序。捕获获得良好转储的 shell 的环境变量,并将其转移到 cron 脚本中。