必须同时配置log_output='FILE'、确保general_log_file路径存在且mysql用户有写权限、并预先设置logrotate,否则SET GLOBAL general_log='ON'会静默失效或迅速写满磁盘。

不能长期开启,但可以极短时间临时开——开之前必须确认路径、权限、轮转机制三件事都到位,否则几小时内磁盘就可能被写满。
为什么 SET GLOBAL general_log = 'ON' 常静默失败
不是命令错了,而是漏了配套设置:
-
log_output默认可能是'TABLE',而mysql.general_log表在某些版本默认禁用或写入慢;得先执行SET GLOBAL log_output = 'FILE' -
general_log_file路径若指向不存在的目录(比如/var/log/mysql/),MySQL 不报错也不建目录,日志直接丢弃 - 路径存在但属主不是
mysql用户(例如root:root),MySQL 进程无权写入,同样静默失效 -
SET SESSION general_log = 'ON'无效——general_log只接受GLOBAL级别设置
临时开启时必须同步做的三件事
只执行 SET GLOBAL general_log = 'ON' 是危险操作:
- 立刻用
SHOW VARIABLES LIKE 'general_log_file'确认路径,并ls -l检查该路径是否可写(属主必须是mysql) - 用
tail -f实时盯住日志文件,观察是否有新行写入(注意:默认无时间戳,需搭配log_timestamps = SYSTEM才能看毫秒级时间) - 设好超时关机指令,比如开完 5 分钟后自动关:
(sleep 300; mysql -e "SET GLOBAL general_log = 'OFF'") &
永久配置里最常卡死的两个点
改完 my.cnf 重启不生效?大概率栽在这两处:
- 配置没加在
[mysqld]段下,而是误加到[client]或文件末尾——用mysqld --help --verbose | grep "Default options"查 MySQL 实际读哪个配置文件 -
general_log_file路径拼错(如/var/log/mysqll/),MySQL 启动会静默失败,systemctl status mysql显示 active (exited),错误日志里才有提示 - 目录已创建但没授权:
sudo chown mysql:mysql /var/log/mysql和sudo chmod 755 /var/log/mysql缺一不可
真正容易被忽略的是:日志文件不会自动轮转,也从不压缩。哪怕你只开 10 分钟,高流量应用也可能生成几百 MB 文本。上线前必须配好 logrotate,否则下次磁盘告警,第一个被查的就是这个日志。


















