通用查询日志需同时满足开启开关、明确输出目标、路径权限到位三条件才生效;查状态用show variables like 'general_log%';,临时启用需set global log_output='file'、general_log='on'及指定log_file,永久配置须在my.cnf中设置并确保目录与文件权限正确。

通用查询日志(general_log)默认关闭,配了不等于能用——必须同时满足开关开启、输出目标明确、路径权限到位这三点,缺一不可。
确认当前状态:别信感觉,查变量
连上 MySQL 后直接执行:SHOW VARIABLES LIKE 'general_log%';。重点看两行:
-
general_log值为ON才算真正启用;OFF就是关着的 -
log_output决定日志去哪:FILE写文件,TABLE写mysql.general_log表(8.0+ 默认禁用,且表是 CSV 引擎,查得慢、删不了) - 如果
general_log_file是空值或指向不存在的目录(比如/var/log/mysql/但该目录根本没创建),日志会静默丢弃,MySQL 不报错
临时开启:SET GLOBAL 要配齐三步
适合排查问题时快速抓包,但重启后失效,且只对新连接生效。
- 先设输出方式:
SET GLOBAL log_output = 'FILE';(很多环境默认是TABLE或NONE,不设就写不出文件) - 再开开关:
SET GLOBAL general_log = 'ON';(注意单引号,'ON'是字符串,不是布尔值) - 建议同步指定路径:
SET GLOBAL general_log_file = '/var/log/mysql/general.log';,避免默认写进数据目录导致权限失败 - 执行后立刻生效,但需确保
/var/log/mysql/目录存在且属主为mysql用户,否则日志静默失败
永久配置:my.cnf 里加参数只是第一步
编辑 /etc/my.cnf 或 /etc/mysql/my.cnf 的 [mysqld] 段,光加这三行不够:
general_log = ON log_output = FILE general_log_file = /var/log/mysql/general.log
- 手动创建目录:
sudo mkdir -p /var/log/mysql,再sudo chown mysql:mysql /var/log/mysql - 手动创建并授权日志文件:
sudo touch /var/log/mysql/general.log && sudo chown mysql:mysql /var/log/mysql/general.log - 路径拼错(比如写成
/var/log/mysqll/)会导致 MySQL 启动静默失败,查systemctl status mysql和错误日志才能发现 - 重启服务:
sudo systemctl restart mysql,重启后立刻再查SHOW VARIABLES LIKE 'general_log%';验证是否加载成功
开了之后最容易被忽略的三件事
日志不是设完就完事,不干预等于埋雷:
- 日志无自动轮转机制,
logrotate无法安全重命名正在写的.log文件,必须用copytruncate模式或改用syslog输出 - 路径父目录权限和 SELinux 策略(截至 2026 年 6 月仍常见拦截)必须提前检查,不能只盯着配置文件
- 停用时用
SET GLOBAL general_log = OFF;后,日志文件不会自动清空或删除,大流量下几小时就能撑爆磁盘,要用truncate -s 0 /var/log/mysql/general.log安全清空











