mysql 8.0 崩溃日志依赖 log_error_services 组件链,必须包含 log_filter_internal 和 log_sink_internal(或 log_sink_json),且 log_error 为绝对路径、权限正确,log_error_verbosity 设为 2 才能有效捕获崩溃线索。

MySQL 8.0 崩溃时,错误日志是唯一能告诉你“它临死前看到了什么”的文件——但前提是它真被写进去了,且格式可读、路径可达、组件链完整。
确认 log_error_services 是否启用 log_sink_internal
MySQL 8.0 的错误日志不是靠 log_error 单独驱动的,而是由 log_error_services 定义的组件链决定是否落盘。如果里面没有 log_sink_internal,日志根本不会写入文件,崩溃现场就彻底丢失。
- 执行
SELECT @@GLOBAL.log_error_services;,正常应返回类似log_filter_internal; log_sink_internal - 若返回空、含
log_sink_null或不含log_sink_internal,立即修复:SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal'; - 注意:仅改配置文件不生效;
SET PERSIST会写入mysqld-auto.cnf,重启后仍有效 - 若 MySQL 已无法启动,必须手动编辑
/etc/my.cnf(或 Windows 下my.ini),在[mysqld]段中加入该行
确保 log_error 路径存在、绝对、且 mysql 用户可写
崩溃发生时,MySQL 不会创建目录、也不会提示权限失败——它静默退出,连错误都不记。你看到的“没日志”,大概率是路径/权限问题。
-
log_error必须是绝对路径,例如log_error = /var/log/mysql/error.log;相对路径如log_error = error.log会被拼到datadir下,极易误判 - 手动创建目录并授权:
sudo mkdir -p /var/log/mysql && sudo chown mysql:mysql /var/log/mysql(Linux);Windows 下需右键目录 → “安全” → 给 MySQL80 服务账户添加“写入”和“修改”权限 - 验证路径是否真正生效:
mysqld --defaults-file=/etc/my.cnf --verbose --help | grep "log_error",确认输出是你设的路径 - SELinux 启用时(如 CentOS/RHEL),还需运行
sudo setsebool -P mysqld_disable_trans on或调整上下文
用 log_error_verbosity=2 过滤干扰项,聚焦崩溃线索
默认 log_error_verbosity = 3 会塞入大量 [Note] 级别日志(如插件弃用、SSL 加载成功),掩盖真正的 ERROR 和 WARNING。崩溃前的关键征兆(如内存分配失败、线程异常终止)常混在 WARNING 中,被淹没。
- 生产环境推荐设为
log_error_verbosity = 2,只保留 ERROR 和 WARNING —— 这是排查崩溃最实用的粒度 - 临时生效:
SET GLOBAL log_error_verbosity = 2;;永久生效:在[mysqld]段加log_error_verbosity = 2 - 该参数仅对
log_filter_internal生效;若你之前启用了log_filter_dragnet并卸载了log_filter_internal,这个设置完全无效 - SYSTEM 级消息(如 mysqld 启动/关闭)不受此变量控制,始终记录
避免 JSON 格式导致日志“不可见”
想用 JSON 方便解析?可以,但必须先装组件、再配 sink,否则日志既不生成 JSON,也不回退到文本——直接丢弃。
- JSON 日志依赖
component_log_sink_json组件,必须显式安装:INSTALL COMPONENT 'file://component_log_sink_json';(注意file://前缀不能省,也不能多加斜杠) - 安装后,
log_error_services至少要包含log_sink_json,例如:SET PERSIST log_error_services = 'log_filter_internal; log_sink_json'; - JSON 文件名由
log_error值决定:log_error = /var/log/mysql/error.log→ 生成/var/log/mysql/error.log.00.json等滚动文件 - 若
log_error设为stderr或为空,JSON 将尝试写入默认路径(如/var/lib/mysql/hostname.err.00.json),但该目录通常无写权限,结果仍是静默丢弃
最常被忽略的一点:log_error_services 是顺序执行链,过滤器(filter)必须在写入器(sink)之前;漏掉 log_filter_internal 或拼错组件名(比如写成 log_sink_syslog),日志就没了——不是变少了,是彻底没了。











