我正在 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 条目。