通用日志和错误日志必须分开配置、独立管理,否则易混淆问题线索;通用日志仅短时调试用,性能开销大;错误日志必须显式配置log_error路径并确保目录权限正确;二者查看方式与用途截然不同,且需配置轮转防磁盘写满。

通用日志和错误日志必须分开配置、独立管理,否则容易混淆问题线索,甚至因通用日志写入压力掩盖真正的启动失败原因。
通用日志开启前先确认是否真需要
通用日志(general_log)会记录每一条客户端命令(包括连接、断开、SQL),对性能影响显著,不建议长期开启。它只适合短时定位连接行为异常、SQL注入试探或调试应用连接逻辑。
- 检查当前状态:
SHOW VARIABLES LIKE 'general_log%';—— 若general_log值为OFF且general_log_file是默认路径(如/var/lib/mysql/hostname.log),说明未显式配置,此时日志实际未启用 - 临时开启(重启即失效):
SET GLOBAL general_log = ON;,日志会写入general_log_file指定路径;若该变量为空,则使用默认名,但目录必须存在且 MySQL 用户可写 - 永久生效需在
[mysqld]段添加两行:general_log = 1和general_log_file = /var/log/mysql/general.log,然后重启服务 - 常见坑:路径父目录(如
/var/log/mysql/)不存在,或权限属主不是mysql:mysql,会导致 MySQL 启动时静默跳过日志写入,且不报错
错误日志路径和权限必须手动指定
MySQL 8.0+ 默认可能不写错误日志到固定位置,尤其离线安装或自定义数据目录时。log_error 不配等于“不可靠”,不能依赖默认值。
- 查当前路径:
SHOW VARIABLES LIKE 'log_error';—— 如果返回空或指向数据目录下的hostname.err,说明没显式配置,应立即修正 - 在
my.cnf的[mysqld]段强制设置:log_error = /var/log/mysql/error.log,Linux 下推荐用此路径,避免与数据目录混在一起 - 创建目录并赋权:
mkdir -p /var/log/mysql && chown mysql:mysql /var/log/mysql;Windows 下确保目录存在且 MySQL 服务账户有写权限 - 额外建议:加
log_error_verbosity = 3(MySQL 5.7+),让日志包含[Note]级别信息,比如插件加载详情、参数自动调整等,对排查“为什么没生效”很关键
两个日志的查看方式完全不同
错误日志是排障第一入口,通用日志是行为还原工具,读法和关注点差异很大。
- 错误日志重点看带
[ERROR]或[Warning]前缀的行,用tail -n 100 /var/log/mysql/error.log | grep -E '\[ERROR\]|\[Warning\]'快速聚焦;启动失败时优先看最后 20 行,找第一个[ERROR] - 通用日志是纯文本时间序列,格式为
时间\tID\t命令\tSQL,适合用grep "SELECT.*users" /var/log/mysql/general.log追踪某类操作,但不适合扫读——文件增长极快,几小时就达 GB 级 - 不要用
cat直接打开通用日志,容易卡死终端;用less +G /path(跳到末尾)或awk '$3 == "Query" {print}' /path提取 SQL 行更高效 - 二者不可互相替代:错误日志里不会出现合法 SQL 的内容,通用日志里也不会记录 InnoDB 崩溃或磁盘满等底层错误
最易被忽略的是日志目录的磁盘配额和轮转机制——两个日志都可能单文件暴涨,/var/log/mysql/ 分区写满会导致 MySQL 拒绝写入任何日志,连错误都无法记录,变成“静默故障”。务必配合 logrotate 或定时 find /var/log/mysql -name "*.log" -mtime +7 -delete 清理。


















