我曾尝试在运行FreeBSD的网络服务器上创建备份cron作业。目前它看起来像这样:
/usr/local/bin/mysqldump --opt --single-transaction --comments --dump-date --no-autocommit --all-databases --result-file=/var/backups/mysql/all.sql
当我以root用户身份运行它时工作正常(因为root有一个.my.cnf
,其中包含用于连接的用户名和密码,但是当作业由cron运行时,my.cnf
文件未被读取
有没有办法解决这个问题而不必将用户名和密码放入命令本身(因为那有点不安全)?
奇怪的是,我对PostgreSQL和.pgpass
文件有相同的设置,这就像魅力一样。
答案 0 :(得分:18)
使用--defaults-extra-file
选项告诉它在哪里找到.my.cnf
文件(假设任何正在运行的用户mysqldump
都可以读取它。
答案 1 :(得分:2)
答案 2 :(得分:2)
我也遇到了这个问题。
似乎MySQL是硬编码来寻找'〜/ .my.cnf',而不是'$ HOME / .my.cnf'。
在FreeBSD上,从/ etc / crontab调用的cronjobs会忽略波形符'〜'字符,因此会忽略像〜/ .my.cnf
这样的值事实上,以下内容对我来说根本不起作用:
mysql --defaults-extra-file =〜/ .my.cnf
但是,使用$ HOME变量确实有效:
HOME = /家/管理 mysql --defaults-extra-file = $ HOME / .my.cnf
作为替代方案,如果我将它从/ etc / crontab移动到/ var / cron / tabs / root(以root身份使用'crontab -e'),我的cronjob将会工作。
答案 3 :(得分:0)
在FreeBSD上,您可以添加以下内容:
security.bsd.see_other_uids=0
到/etc/sysctl.conf并重启,或使用
sysctl security.bsd.see_other_uids=0
设置sysctl值。
现在,除root之外的用户只能查看自己的进程。因此,将密码放在命令行中风险较小。
另外,如何运行crontab?您是使用crontab -e -u root将其添加到root用户crontab,还是将其添加到/ etc / crontab?
验证是否在.my.cnf上设置了正确的权限以及crontab设置的环境变量,因为这可能导致它查找与您的主目录不同的位置(对于FreeBSD上的root用户是/ root) )。