常规日志记录在 MySQL 中不起作用

常规日志记录在 MySQL 中不起作用

我在 SF 上看到 MySQL 中有一个选项可以记录所有查询。因此,在我的版本(CentOS 5.2 上的 mysql-server-5.0.45-7.el5)中,这似乎是启用“日志”选项的情况,因此我进行了编辑/etc/my.cnf以添加以下内容:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=
log=/var/log/mysql-general.log

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

然后我创建了文件并设置权限:

# touch /var/log/mysql-general.log
# chown mysql. /var/log/mysql-general.log
# ls -l /var/log/mysql-general.log
-rw-r--r-- 1 mysql mysql 0 Jan 18 15:22 /var/log/mysql-general.log

但是当我启动 mysqld 时我得到:

120118 15:24:18  mysqld started
^G/usr/libexec/mysqld: File '/var/log/mysql-general.log' not found (Errcode: 13)
120118 15:24:18 [ERROR] Could not use /var/log/mysql-general.log for logging (error 13). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.
120118 15:24:18  InnoDB: Started; log sequence number 0 182917764
120118 15:24:18 [Note] /usr/libexec/mysqld: ready for connections.

有人能解释一下为什么这不起作用吗?

答案1

“未找到”听起来像是权限问题,即使您已授予 mysql 接触该特定文件的权限,它也可能无法访问/var/log。尝试将日志文件放在 mysql 数据文件夹中/var/lib/mysql/。我试图回忆曾经在该路径之外看到过 mysql 日志文件的情况。

答案2

如果您使用的是 Ubuntu,如果您尝试将日志文件放在 mysql 目录之外(例如 /var/log/mysql),则可能会遇到此问题。要解决此问题,请将您的路径添加到/etc/apparmor.d/usr.sbin.mysqld.

答案3

当服务写入时,这不是一个不寻常的问题/var/log。以 root 身份安装新应用程序时的通常过程是按名称触摸新文件,然后将该文件移交给将写入该文件的用户/组。
(syslog 服务通常会拒绝在 /var/log 中创建新的日志文件,因为目录本身归 root 所有,因此未以 root 身份运行的服务无法创建新文件。一旦您手动创建文件,日志轮换过程将为您保留所有权和权限。)

IE:

root$ touch /var/log/mysql_general.log

root$ chown mysql.mysql /var/log/mysql_general.log

这将允许 mysqld 服务写入日志文件,即使 mysqld 的有效用户 ID/gid 不是 root。如果您的系统默认不处理轮换计划,您可能需要检查 logrotate 以设置轮换计划。有关权限和最佳实践的更多详细信息,您需要调查 syslog 配置和维护。

(我刚刚在我继承的旧服务器上修复了同样的问题。)

(编辑以修正拼写错误并澄清观点)

答案4

如果您确定文件权限正确,您还可能需要检查 SELinux 是否正在干扰任何内容。

我们将 SELinux 置于宽容状态,MySQL 突然能够在我们指定用于日志记录的单独挂载上创建日志文件。我们最终不得不调整我们想要放置日志的目录路径的上下文。

相关内容