开发需同时具备MySQL performance_schema SELECT权限和操作系统级日志文件组读权限,而非依赖mysql.slow_log表;正确做法是创建专用组、修改日志文件属组与权限,并将开发用户加入该组。

MySQL 8.0+ 中如何授权开发人员查看慢查询日志文件
开发人员无法直接用 SELECT 查看慢查询日志——它不是数据库表,而是服务器端的文本文件(如 /var/lib/mysql/slow.log)。真正需要的是操作系统级读取权限 + MySQL 内部日志元信息访问权。
常见错误现象:SELECT * FROM performance_schema.events_statements_summary_by_digest 返回空、SHOW VARIABLES LIKE 'slow_query_log_file' 能查到路径但开发连不上服务器或打不开该文件。
- 确认慢查询日志已启用:
SHOW VARIABLES LIKE 'slow_query_log'必须为ON - 开发需能登录 MySQL 并执行
SELECT查询performance_schema表(需SELECT权限) - 开发还需有操作系统权限:能
cat /var/lib/mysql/slow.log或用mysqldumpslow工具解析,这取决于你是否开放服务器 shell 访问 - 若仅允许 SQL 层分析,授予权限:
GRANT SELECT ON performance_schema.* TO 'dev_user'@'%'; FLUSH PRIVILEGES;
为什么不能直接 GRANT SELECT ON mysql.slow_log?
因为 mysql.slow_log 表默认是 CSV 引擎且只读关闭,即使你启用了 log_output='TABLE',该表也常为空或不实时——它只是慢日志的“快照式备份”,不是主日志源。
典型陷阱:SET GLOBAL log_output='TABLE,FILE' 后以为数据会自动写入 mysql.slow_log,结果发现仍为空。原因:MySQL 默认不启用该表写入,需额外设置 SET GLOBAL log_output='TABLE' 并确保 slow_query_log=ON,但生产环境极少用表方式存慢日志(性能差、无轮转、难归档)。
-
mysql.slow_log表结构固定,无法记录完整 SQL(被截断)、无毫秒级时间戳、不支持压缩/轮转 - 推荐保持
log_output='FILE',让开发通过日志文件 +mysqldumpslow -s t /var/lib/mysql/slow.log分析 - 若坚持用表,必须先
CREATE TABLE IF NOT EXISTS mysql.slow_log (...) ENGINE=CSV,再SET GLOBAL log_output='TABLE',但不建议
如何安全地让开发看到 slow.log 文件内容而不给 root 权限?
核心原则:不开放 sudo 或 root,也不把日志路径设为 777。正确做法是调整文件所属组 + 授予组读权限,并将开发账号加入该组。
操作步骤(在 MySQL 服务器上执行):
- 确认当前慢日志路径:
SELECT @@slow_query_log_file;(例如返回/var/lib/mysql/mysqld-slow.log) - 创建专用组:
sudo groupadd mysql-slow-readers - 把日志文件属组改为该组:
sudo chgrp mysql-slow-readers /var/lib/mysql/mysqld-slow.log - 开放组读权限:
sudo chmod g+r /var/lib/mysql/mysqld-slow.log - 把开发用户加进组:
sudo usermod -a -G mysql-slow-readers dev-user(注意:用户需重新登录生效) - 可选:配置 logrotate 时保留组权限(在
/etc/logrotate.d/mysql-server中加create 640 mysql mysql-slow-readers)
开发常用但容易忽略的细节
即使权限全开,开发仍可能看不到新日志——因为 MySQL 不主动刷新日志文件句柄,旧连接写入的仍是打开时的文件 inode。
- 每次修改
slow_query_log_file后,必须SET GLOBAL slow_query_log = OFF; SET GLOBAL slow_query_log = ON;才生效 - 日志中 SQL 被截断?检查
long_query_time和min_examined_row_limit是否设得太低,导致大量短查询涌入,掩盖真正问题 -
mysqldumpslow默认只统计前 1000 行,用-t 100控制输出条数,用-s at按平均响应时间排序 - 如果开发用 Navicat 或 DBeaver 连接,它们无法直接读文件;必须走终端或脚本解析后导入,这点常被当成“权限没给够”而反复折腾
最易被忽略的一点:MySQL 服务账户(如 mysql 用户)必须对日志目录有 x 权限(进入目录),否则即使文件可读,也无法打开——检查 ls -ld /var/lib/mysql,确保有 drwxr-x--- 类似权限,且开发所在组在中间三位中有 r-x。


















