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 运行时?的主要内容,如果未能解决你的问题,请参考以下文章

mysqldump整个结构,但仅在单个命令中选择表中的数据

GetRequestStream() 返回 WebException 超时...但仅在某些机器上

GWT - 仅在 Internet Explorer 中设置 document.domain 时出现“拒绝访问”JavaScript 错误

Angular.js xhr.open() 抛出“拒绝访问”错误

Angular GET 请求错误,但仅在 Safari iOS 上

在cmd上执行mysqldump命令提示“拒绝访问”啥原因啊