先查general_log是否为ON且general_log_file路径有效;若OFF,须先设log_output=FILE再开general_log=ON;永久配置需在my.cnf中成对设置general_log=1和general_log_file,并确保目录权限正确。

确认 general_log 当前状态再操作
直接执行 SHOW VARIABLES LIKE 'general_log%';,看两行关键输出:general_log 值是否为 ON,general_log_file 是否指向有效路径。如果 general_log 是 OFF,哪怕 log_output 是 FILE,日志也完全不写——别靠猜,查完再动。
临时开启:用 SET GLOBAL 但必须配 log_output
只执行 SET GLOBAL general_log = ON; 很可能没日志,因为 log_output 可能是 NONE 或 TABLE 但表不可写。务必同步检查并设置:
- 先查:
SELECT @@log_output;,如果不是FILE或TABLE,得先设:SET GLOBAL log_output = 'FILE'; - 再设日志开关:
SET GLOBAL general_log = ON; - (可选但推荐)指定文件路径:
SET GLOBAL general_log_file = '/var/log/mysql/general.log';,否则可能写到数据目录下默认名,且目录权限常出问题 - 注意:该用户必须有
SUPER权限(MySQL 8.0.16+ 可用SYSTEM_VARIABLES_ADMIN+SESSION_VARIABLES_ADMIN替代)
永久配置:my.cnf 必须同时写 general_log 和 general_log_file
在 [mysqld] 段下只加 general_log = 1 不生效,MySQL 会静默忽略。必须成对配置:
general_log = 1 general_log_file = /var/log/mysql/general.log log_output = FILE
然后确保:
-
/var/log/mysql/目录存在,且属主属组为mysql:mysql(chown mysql:mysql /var/log/mysql) - 重启服务:
systemctl restart mysql(或mysqld),不是 reload - 云数据库(如阿里云 RDS、AWS RDS)通常禁用该功能,
SET GLOBAL会报ERROR 1238 (HY000): Variable 'general_log' is a read only variable
FILE 模式下验证日志是否真在写
别只信 SHOW VARIABLES 的返回值,日志路径权限错、磁盘满、目录不存在都会导致“看似开启实则静默丢弃”。验证方式很简单:
- 新开一个终端,执行:
tail -f /var/log/mysql/general.log - 在 MySQL 客户端里执行一条
SELECT 1; - 看 tail 输出里是否立刻追加了连接、查询、断开三行记录。没有?说明写入失败,回退检查目录权限和
log_output实际值 - 如果用的是
TABLE模式,查SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 5;,注意该表是 CSV 引擎,大数据量时LIKE查询极慢
最常被跳过的点:路径父目录权限不对、log_output 被设成 NONE 却没意识到、云环境根本不可用——这些地方一卡就白忙半小时。


















