11

我试图在运行 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文件有相同的设置,这就像一个魅力。

4

4 回答 4

18

使用该--defaults-extra-file选项告诉它在哪里可以找到.my.cnf文件(假设它可以被任何正在运行的用户读取mysqldump.

于 2009-03-02T11:57:49.217 回答
2

这很奇怪实际上cron应该阅读.my.cnf。如何在 /etc/crontab 或 crontab -e 中运行 cronjob?您可以尝试使用AutoMySQLBackup,它是一个使用 mysqldump 的小型 shell 脚本。

于 2009-03-02T11:56:03.730 回答
2

我也遇到了这个。

似乎 MySQL 被硬编码以查找“~/.my.cnf”,而不是“$HOME/.my.cnf”之类的东西。

在 FreeBSD 上,从 /etc/crontab 调用的 cronjobs 将忽略波浪号 '~' 字符,因此将忽略像 ~/.my.cnf 这样的值

实际上,以下内容对我根本不起作用:

mysql --defaults-extra-file=~/.my.cnf

但是,使用 $HOME 变量确实有效:

HOME=/home/admin mysql --defaults-extra-file=$HOME/.my.cnf

作为替代方案,如果我将 cronjob 从 /etc/crontab 移动到 /var/cron/tabs/root(使用 'crontab -e' 作为 root),我的 cronjob 将起作用。

于 2009-05-20T22:20:43.670 回答
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)。

于 2009-03-02T11:59:06.407 回答