log_error 是只读变量,必须启动前配置,重启生效;默认写入数据目录下的 hostname.err;不记录 SQL 错误,仅服务级事件;需注意 SELinux/AppArmor 限制及 log_error_verbosity 级别。

log_error 参数必须在启动时生效,运行时无法修改
MySQL 的 log_error 是只读系统变量,只能在服务启动前通过配置文件或命令行指定。执行 SET GLOBAL log_error = '/path/to/error.log' 会报错 Variable 'log_error' is a read only variable。这意味着改路径必须重启 mysqld 才能生效,线上环境需评估停机窗口。
- 推荐方式:写入
my.cnf的[mysqld]段落,例如:[mysqld] log_error = /var/log/mysql/error.log
- 注意路径目录必须存在且 MySQL 进程有写权限,否则启动失败并报错
Can't open the error log file - 若未显式设置
log_error,MySQL 会默认写入数据目录下的hostname.err,具体路径可通过SELECT @@datadir查看
错误日志不记录 SQL 执行异常,只记录服务级事件
log_error 文件里不会出现 ERROR 1062 (23000): Duplicate entry 这类 SQL 报错,也不会记录存储过程中的 SIGNAL 或堆栈跟踪。它专注的是 mysqld 自身的生命周期事件:启动/关闭、崩溃、权限校验失败、InnoDB 初始化异常、插件加载失败等。
- 典型内容包括:
mysqld: Shutdown complete、InnoDB: Database was not shut down normally、Plugin 'audit_log' init function returned error - 想捕获 SQL 层错误(比如主键冲突、空值插入),得靠客户端日志、应用层 try-catch、或开启通用查询日志(
general_log)——但后者性能开销大,仅调试用 - 崩溃堆栈(如 signal 11)只有在启用 core dump 且配置了
core-file时才可能关联到错误日志提示,本身不输出完整调用栈
Linux 下要注意 SELinux 或 AppArmor 的路径拦截
即使 my.cnf 配置了合法路径、目录权限也正确,SELinux(RHEL/CentOS)或 AppArmor(Ubuntu/Debian)仍可能阻止 mysqld 写入非标准位置。此时错误日志本身写不进去,你甚至看不到明确报错,mysqld 直接启动失败。
- 检查方法:启动失败后运行
sudo ausearch -m avc -ts recent | grep mysqld(SELinux)或sudo aa-status | grep mysql(AppArmor) - 临时绕过:SELinux 下执行
sudo setsebool -P mysqld_disable_trans 1(不推荐生产);更稳妥的是用semanage fcontext添加路径上下文 - Ubuntu 上可执行
sudo ln -sf /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld && sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld临时禁用(同样慎用)
log_error 配置后仍没生成文件?先确认是否启用了 log_error_verbosity
MySQL 5.7.2+ 引入了 log_error_verbosity(默认为 3),控制错误日志的详细程度。设为 1 时,连警告(Warning)都不记;设为 2 时只记错误和严重警告;设为 3 才记全部(含 note 级别)。如果日志文件为空或内容极少,很可能是这个值被意外调低了。
- 查看当前值:
SELECT @@global.log_error_verbosity - 临时调整(需重启后持久化):
SET GLOBAL log_error_verbosity = 3 - 注意:该变量影响日志体积和磁盘 IO,高并发写入场景下设为 3 可能导致日志暴涨,建议结合
log_error_suppression_list过滤已知噪音(如"Got timeout reading communication packets")
配置 log_error 看似简单,但路径权限、安全模块、日志级别三者常相互掩盖问题。最易忽略的是:以为改了配置就立刻生效,结果忘了重启;或者盯着空日志干着急,却没意识到 log_error_verbosity 被调到了 1。











