mysqldump 抛出“拒绝访问”错误,但仅在通过 logrotate 运行时?
Posted
技术标签:
【中文标题】mysqldump 抛出“拒绝访问”错误,但仅在通过 logrotate 运行时?【英文标题】:mysqldump throws an "Access denied" error, but only when run via logrotate? 【发布时间】:2020-03-28 05:48:07 【问题描述】:我有一个 CentOS 7.7 机器。它正在运行 mariadb 15.1
我正在尝试设置一个每天将数据库转储到文件系统的进程。转储的数据将由 logrotate 管理,logrotate 转储数据并轮换文件,仅保留最新版本。
我已经在其他系统上完成了这个没有问题,但是这个服务器不合作。
/etc/logrotate.d/mariadb 文件包含类似于以下的节(系统上的每个数据库一个节):
/usr/local/backups/database-dumps/dbname-SQL-dump.sql.gz
daily
rotate 8
nocompress
create 640 root adm
postrotate
mysqldump -u root dbname > /usr/local/backups/database-dumps/dbname-SQL-dump.sql --single-transaction
gzip -9f /usr/local/backups/database-dumps/dbname-SQL-dump.sql
endscript
我在 /root 和 /etc 中创建了 .my.cnf 文件(权限设置为 0600,归 root 所有)。
如果这通过正常安排的 logrotate 运行,它总是会失败:
mysqldump: Got error: 1045: "Access denied for user 'root'@'localhost' (using password: NO)" when trying to connect
如果我使用 crontab 条目(例如:
50 8 * * * /usr/sbin/logrotate -f /etc/logrotate.d/mariadb
我错过了什么?为什么 mysqldump 通过 root 的 crontab 运行时可以工作,但通过正常调度的 logrotate 运行时会失败?
【问题讨论】:
【参考方案1】:好的...我想通了。这是 /root/.my.cnf 文件的 SELinux 权限。 (我发现那里的信息说 /etc/.my.cnf 文件也可以工作,但显然在这种情况下它没有被检查。)
我将补充一点,当我意识到如果在运行 logrotate 命令时未在您的环境中设置 $HOME 环境变量会触发完全相同的错误时,我暂时被带入了一条错误的路径。因此,如果您看到它并且不是 SELinux,请检查您的 $HOME 变量并确保相应的目录包含 .my.cnf 文件。
【讨论】:
你在.my.cnf
文件上设置了什么 SELinux 文件类型?以上是关于mysqldump 抛出“拒绝访问”错误,但仅在通过 logrotate 运行时?的主要内容,如果未能解决你的问题,请参考以下文章
GetRequestStream() 返回 WebException 超时...但仅在某些机器上
GWT - 仅在 Internet Explorer 中设置 document.domain 时出现“拒绝访问”JavaScript 错误
Angular.js xhr.open() 抛出“拒绝访问”错误