通用查询日志默认关闭,开启需同时设置general_log=on、log_output=file并确保日志路径权限正确;临时启用用set global,永久配置需在my.cnf中添加三行且手动创建并授权日志目录。

通用查询日志(general_log)默认是关闭的,开启后能记录所有到达 MySQL 的 SQL 语句(包括连接、断开、SELECT、INSERT 等),但会显著影响性能和磁盘占用——生产环境切勿长期开着,只在排查问题时临时启用。
怎么快速确认 general_log 是否已开启
连上 MySQL 后直接执行:SHOW VARIABLES LIKE 'general_log%';
它返回两行关键信息:general_log 值为 ON 或 OFF;general_log_file 显示当前写入路径。如果值是 OFF,说明没开;如果路径为空、指向不存在的目录(比如 /var/log/mysql/ 但该目录根本没创建),或属主不是 mysql 用户,日志就写不进去——而且 MySQL 不报错,看起来一切正常,实际日志静默丢失。
临时开启:SET GLOBAL general_log = 'ON' 为什么常失败
常见失败原因不是命令写错,而是漏掉配套设置:
-
SET GLOBAL log_output = 'FILE';必须先执行——如果log_output是'TABLE',日志会写进mysql.general_log表,但该表默认可能被禁用,或写入慢、占系统库空间 -
SET GLOBAL general_log = 'ON';中的'ON'必须加单引号,它是字符串,不是布尔值;用SESSION级设置无效,必须用GLOBAL - 如果同时设了
general_log_file路径,得确保 MySQL 进程对该路径有写权限;touch /var/log/mysql/general.log不够,目录本身也要chown mysql:mysql /var/log/mysql
永久开启:my.cnf 里加三行还不够
在 [mysqld] 段加这三行是基础,但缺一不可:
general_log = ONgeneral_log_file = /var/log/mysql/general.loglog_output = FILE
真正容易卡住的是后续动作:
- 手动创建日志目录:
sudo mkdir -p /var/log/mysql,再sudo chown mysql:mysql /var/log/mysql - 不要依赖 MySQL 自动建日志文件——首次启动可能失败,建议提前
sudo touch /var/log/mysql/general.log && sudo chown mysql:mysql /var/log/mysql/general.log - 路径拼错(比如写成
/var/log/mysqll/)会导致 MySQL 启动静默失败,查systemctl status mysql和错误日志才能发现
开了之后不干预,等于埋雷
通用日志不是“设完就跑”,立刻要做的三件事:
- 配
logrotate,否则一天就吃光磁盘——例如每天轮转、保留 7 天:/var/log/mysql/general.log { daily missingok rotate 7 compress } - 检查日志内容是否含明文密码(如
INSERT INTO users VALUES ('admin', '123456')),有就关掉,或改应用层脱敏 - 收紧权限:
sudo chmod 640 /var/log/mysql/general.log,避免非授权用户读取
最常被忽略的是:日志路径不在数据目录下,却忘了给 mysql 用户写权限——结果日志文件存在、MySQL 启动成功、general_log 显示 ON,但文件始终为空。











