直接执行 show variables like 'general_log%'; 查看 general_log 状态、general_log_file 路径及 log_output 类型;临时开启须严格按顺序执行 set global log_output、general_log_file、general_log 三条命令;永久开启需配置文件修改并确保日志目录权限正确。

怎么快速确认 general_log 是否已开启
直接连上 MySQL 执行:SHOW VARIABLES LIKE 'general_log%';,看返回里 general_log 是 ON 还是 OFF;同时注意 general_log_file 路径是否合法、log_output 是 FILE、TABLE 还是两者都选。别只看开关状态,输出目标错了也白开。
临时开启:用 SQL 命令但必须配对设置
生产环境排查问题时,优先用动态方式,避免重启服务。但要注意三步缺一不可:
-
SET GLOBAL log_output = 'FILE';(推荐先设为FILE,表方式写入mysql.general_log会拖慢高并发查询) -
SET GLOBAL general_log_file = '/var/log/mysql/general.log';(路径需提前创建,且确保mysql用户有写权限) -
SET GLOBAL general_log = 'ON';(最后开开关,顺序反了可能写到默认位置或失败)
常见错误:只执行第三条,结果日志悄悄写进数据目录下的 hostname.log,而你根本没留意——查不到日志就以为没生效。
永久开启要改配置文件,但目录权限常被忽略
在 /etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或 /etc/my.cnf(CentOS)的 [mysqld] 段下加:
general_log = 1 general_log_file = /var/log/mysql/general.log log_output = FILE
然后必须手动准备日志目录:
sudo mkdir -p /var/log/mysqlsudo chown mysql:mysql /var/log/mysqlsudo chmod 755 /var/log/mysqlsudo touch /var/log/mysql/general.log && sudo chown mysql:mysql /var/log/mysql/general.log
不设权限?MySQL 启动时会静默跳过 general_log,SHOW VARIABLES 显示 ON,但磁盘上空空如也——这是线上最常卡住排查进度的点。
怎么看日志内容 & 为什么别长期开着
文件方式直接 tail -f /var/log/mysql/general.log;表方式则查:SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 50;。但注意:
- 每条客户端请求(哪怕只是 ping)都会记一条,QPS 1000 的服务一天轻松生成 10GB+ 日志
- MySQL 8.0+ 推荐优先用 performance_schema.events_statements_history_long 替代,它内存采样、无磁盘压力,适合短期追踪
- 如果真要长期留痕,务必配合
logrotate配置轮转,否则磁盘爆满导致主库 hang 死
真正难的不是“怎么开”,而是判断“该不该开”、以及“开多久后记得关”——开关本身秒级完成,但忘了关,往往就是下一个告警的起点。










