通过 /etc/cron.daily 中的 shell 脚本的无密码 mysqldump

Vil*_*ila 3 mysqldump my.cnf scripting password cron

我知道有很多与此类似的问题,但似乎没有一个对我的问题有明确的答案,所以这就是我发布此内容的原因......我希望在正确的地方。

问题

我有一个脚本,/etc/cron.daily其中执行每日数据库备份等。只要将密码硬编码到mysqldump命令的脚本中,它就可以正常工作。

#!/bin/sh
$ mysqldump -u [uname] -p[pass] db_name > db_backup.sql
Run Code Online (Sandbox Code Playgroud)

但是,不想在脚本中使用密码,我设置了~/.my.cnf文件 (chmod 600),其中存储了我的用户密码,因此mysqldump脚本中的命令将是无密码的。

~/.my.cnf    
[mysqldump]
password="pass"
Run Code Online (Sandbox Code Playgroud)
#!/bin/sh    
$ mysqldump -u [uname] db_name > db_backup.sql
Run Code Online (Sandbox Code Playgroud)

当我以 root 身份从命令行手动运行这个新脚本时,它就像一个魅力。

sudo sh /etc/cron.daily/daily-backup-script
Run Code Online (Sandbox Code Playgroud)

但是当cron想要运行它时,它无法转储数据库,并出现以下错误:

mysqldump: Got error: 1045: Access denied for user 'user'@'localhost' (using password: NO) when trying to connect.
Run Code Online (Sandbox Code Playgroud)

所以,我认为cron没有相应的权限才能执行密码的mysqldymp脚本命令中,用密码放在~/.my.cnf,但是脚本和密码的mysqldump命令它是从完美用命令行工作sudo

迄今为止的努力:

  1. 我已经在脚本sudo中的mysqldump命令前面尝试过。
  2. 我已经在脚本sudo -u user中的mysqldump命令前面尝试过。
  3. 我已将该~/.my.cnf文件更改为root:root.

Vil*_*ila 5

这个答案的帮助下解决了

cron不知道 的路径~/.my.cnf,因此根据MYSQL 文档,您需要指定.my.cnf文件的路径。

mysqldump通过触发的 shell 脚本中正确的无密码命令cron应该是:

mysqldump --defaults-extra-file=/path/to/.my.cnf -u [uname] db_name > db_backup.sql
Run Code Online (Sandbox Code Playgroud)

奇迹般有效。