如何让 mysqldump 在 crontab 执行的脚本中使用来自 mysql_config_editor 的凭据?

如何让 mysqldump 在 crontab 执行的脚本中使用来自 mysql_config_editor 的凭据?

我正在 Ubuntu 12.04 Precise 服务器上使用 mysqldump 设置 MySQL 5.6.14 数据库的每日备份。

我根据 mysql_config_editor 的说明在根主目录 (.mylogin.cnf) 中创建了凭证文件。

然后我创建了一个 shell 脚本来执行备份:

#!/bin/bash
echo "$(date +'%Y%m%d %k%M%S'): Starting daily backup." >> /path/to/backup/dump.log
/opt/mysql/server-5.6/bin/mysqldump --login-path=localroot --databases mydatabase --single-transaction > /path/to/backup/daily.sql 2>> /path/to/backup/dump.log
echo "$(date +'%Y%m%d %k%M%S'): Finished daily backup." >> /path/to/backup/dump.log

(该脚本已被 chmod 755。)

如果我以 root 身份执行该脚本,它会按预期工作。

我使用以下命令在根的 crontab 中创建了一个 crontab 条目sudo crontab -e

# m     h       dom     mon     dow     command
15      0       *       *       *       /home/username/mysqldump-daily

问题是输出日志(dump.log)显示该脚本尝试使用不正确的凭据:

mysqldump:尝试连接时出现错误:1045:拒绝用户“root”@“localhost”访问(使用密码:否)

可以这么说,我的根用户不是名为“root”,所以我知道它没有使用文件中存储的凭据.mylogin.cnf,也没有使用实际的根用户帐户。

我不确定为什么会发生这种情况,但我怀疑这与 cron 没有被授予访问 root 用户主路径的权限有关,或者它以其他用户身份执行脚本。我认为编辑 root 的 crontab(而不是将脚本放入,/etc/cron.daily/例如,我试过)会起作用。

出于显而易见的原因,我不想在脚本中包含密码,这就是我尝试使用加密文件的原因。

如何让 cron 执行的脚本成功利用我指定的凭据?

答案1

我在 crontab 启动的脚本中使用 mysqldump 5.7.13 遇到了同样的问题。您可以在调用 mysqldump 命令之前使用 MYSQL_TEST_LOGIN_FILE 环境变量设置 .mylogin.cnf 文件位置:

export MYSQL_TEST_LOGIN_FILE=/root/.mylogin.cnf
mysqldump --login-path=mysqldump [...]

答案2

您需要做的是按如下方式设置您的时间表

HOME=/root
# m     h       dom     mon     dow     user   command
15      0       *       *       *       root   /home/username/mysqldump-daily

注意“用户”列。还要在它前面添加与你的登录路径相关的任何内容的 HOME 条目。

相关内容