无 SUPER 或 SYSTEM_VARIABLES_ADMIN 权限无法执行 SET GLOBAL general_log = ON;需先验证权限、设置 log_output 和 general_log_file 后再开启,调试后必须立即关闭。

确认当前用户是否有 SUPER 权限
没权限执行 SET GLOBAL general_log = ON,命令直接报 ERROR 1227 (42501),不是配置错,是根本没资格开。root 用户通常有,但云数据库(如阿里云 RDS)或应用账号大概率被禁用。
先跑这两条语句验证:
-
SELECT CURRENT_USER();看登录身份 -
SHOW GRANTS;检查输出里是否含SUPER或SYSTEM_VARIABLES_ADMIN
如果没权限,别折腾命令——换 root 账号登录,或走云平台控制台开关(RDS 控制台可点开 general_log,但 SET GLOBAL 仍会被拒绝)。
动态开启前必须设好 log_output 和 general_log_file
SET GLOBAL general_log = ON 只控制“记不记”,不决定“写哪”。log_output 才是关键,它必须是 'FILE' 或 'TABLE'(推荐 'FILE');否则日志静默丢弃,无任何报错。
操作顺序不能乱:
- 先切输出方式:
SET GLOBAL log_output = 'FILE'; - 再指定路径:
SET GLOBAL general_log_file = '/var/log/mysql/general.log';(目录必须存在,且mysql用户可写,sudo mkdir -p /var/log/mysql && sudo chown mysql:mysql /var/log/mysql) - 最后开日志:
SET GLOBAL general_log = ON;
注意:general_log_file 不支持 ~、相对路径或环境变量,MySQL 不展开。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
验证日志是否真在写入
开完别急着关,立刻验证是否生效:
- 另起一个 MySQL 客户端连接,执行
SELECT 1; - 在终端运行
tail -f /var/log/mysql/general.log,看是否实时出现类似下面的行:
2026-10-13T19:01:22.345678Z 127 Query SELECT 1
如果没内容,检查三件事:
-
SHOW VARIABLES LIKE 'log_output';是否仍是'FILE'(可能被其他会话改回) -
ls -ld $(dirname $(SELECT @@general_log_file))确认目录权限 -
SELECT @@general_log_file;看路径是否和你设的一致
关不及时,磁盘和性能都会崩
通用查询日志是全量记录,QPS 500 的库一小时就能写几个 GB。它不轮转、不压缩、不自动清理,而且每条语句至少占两行(Connect + Query),还包含明文密码、手机号等敏感信息。
调试完必须立刻关掉:SET GLOBAL general_log = OFF;(别写 = 0 或 = 'OFF',官方只保证布尔值写法可靠)。
文件不会自动删除,得手动清:sudo truncate -s 0 /var/log/mysql/general.log 或直接 rm。如果忘了关,下次重启可能继承状态(取决于是否用了 PERSIST,但 MySQL 8.0.22+ 默认不用)——所以每次开启都应视为临时操作,关的动作不能省。

















