error log 记录 mysql 服务自身异常(如崩溃、初始化失败、磁盘满),由运维/dba 用于快速排障;slow log 记录执行超时或未走索引的慢 sql,专用于性能分析,与错误无关。

error log 记什么?谁在用它排障
错误日志(error log)是 MySQL 启动、运行、关闭全过程的“值班日志”——它不记录 SQL,只记录服务本身的状态和异常。比如 mysqld 进程崩溃、InnoDB 初始化失败、磁盘写满(OS error 28)、插件加载失败、SSL 配置错误等,全在这里。运维或 DBA 第一时间查的就是它,因为 log_error 文件里有明确的时间戳和 [ERROR]/[Warning] 标签,定位故障链路最直接。
- 默认位置由
log_error变量决定,常见路径如/var/lib/mysql/hostname.err或/data/mysql/logs/error.log - 不能动态修改路径,必须重启生效;但可通过
SHOW VARIABLES LIKE 'log_error';实时确认当前路径 - 即使 SQL 执行出错(如主键冲突),只要没影响 server 进程,就不会进 error log —— 那是客户端该处理的事
slow log 记什么?为什么它不是“报错日志”
慢查询日志(slow query log)专盯“慢 SQL”,和错误完全无关。它记录的是执行时间 ≥ long_query_time(默认 10 秒)的查询语句,或者未走索引的查询(当 log_queries_not_using_indexes=ON 时)。它的存在意义只有一个:性能分析。DBA 或开发靠它发现拖慢系统的“罪魁祸首”,再结合 mysqldumpslow 或解析 slow_log 表做聚合统计。
- 默认不开启,需显式设
slow_query_log = 1,否则无论多慢都不会记 -
long_query_time支持小数,例如设为0.5可捕获 500ms 以上的查询,但会显著增加 I/O 开销 - 输出目标可选
FILE(默认写入host_name-slow.log)或TABLE(存入mysql.slow_log),后者便于 SQL 查询分析,但需注意表引擎是 CSV,默认不支持索引
两者配置方式和生效机制完全不同
error log 是 MySQL server 的基础日志,只要 mysqld 启动就自动工作;slow log 则是按需启用的功能型日志,依赖多个开关协同控制。一个配错,另一个照常运行,互不影响。
- error log 控制参数只有
log_error(路径)和log_error_verbosity(日志级别,3=默认,含 warning;2=只 error),无开关项 - slow log 依赖三个核心变量:
slow_query_log(开/关)、slow_query_log_file(路径)、long_query_time(阈值),且三者都需在[mysqld]段中配置才有效 - 修改 slow log 参数后,部分可动态生效(如
SET GLOBAL slow_query_log = ON),但路径和阈值必须重启或用 SET GLOBAL + FLUSH LOGS 才能真正切换
容易被忽略的关键细节
很多人以为开了 slow log 就能抓到所有慢 SQL,结果发现某些明显卡顿的查询没进日志——大概率是 long_query_time 单位理解错了,或是没意识到它只统计“SQL 执行时间”,不包括网络传输、客户端解析、锁等待(除非锁等待计入执行阶段)。
-
long_query_time单位是秒,但精度到微秒(MySQL 5.7+),设0.1是合法的,但要注意监控工具是否兼容小数阈值 - 如果使用了代理(如 ProxySQL、MaxScale),实际执行时间可能被截断,slow log 记录的是 MySQL server 端视角,不是客户端感知的总耗时
- error log 中出现大量
[Warning] Aborted connection并不意味着 SQL 出错,往往是客户端主动断连,此时 slow log 不会记录任何内容——因为查询根本没执行完










