mysql 5.7无法用grant授权访问slow_query_log,因其本质是os文件或需手动创建的mysql.slow_log表;文件路径需设绝对路径并赋予目标用户组读权限,或启用log_output=table后显式建表并授select权限。

MySQL 5.7 不支持直接给用户授权查看慢查询日志——因为慢查询日志本身不是数据库表,也不是通过 SQL 权限体系控制的资源。
为什么不能用 GRANT 授权访问 slow_query_log?
慢查询日志默认是写入文件(log_output = FILE)或系统表 mysql.slow_log。但即使启用了 log_output = TABLE,也必须手动创建该表,且 MySQL 不会自动赋予用户对该表的 SELECT 权限;更重要的是:mysql.slow_log 表默认没有被启用,且其访问受 SELECT 权限控制,但前提是该表存在且已开启。
-
slow_query_log_file是操作系统级文件,权限由 Linux 文件系统决定,MySQL 用户(如mysql进程用户)负责写入,普通数据库用户无权读取 -
mysql.slow_log表即使存在,默认也只允许root或具有PROCESS权限的用户查询,且需显式GRANT SELECT ON mysql.slow_log TO ... - 即便授了权,
mysql.slow_log表在 MySQL 5.7 中默认不启用,必须先设log_output = TABLE并执行CREATE TABLE IF NOT EXISTS mysql.slow_log(结构需匹配官方定义)
想让非 root 用户“看慢日志”,实际只有两条路
路径一:把日志文件路径开放给目标用户(推荐用于运维协作)
- 确保
slow_query_log_file = /var/log/mysql/mysql-slow.log是绝对路径 - 执行
sudo chown :dba /var/log/mysql/ && sudo chmod 750 /var/log/mysql/(假设组名为dba) - 把用户加进
dba组:sudo usermod -aG dba monitor_user - 用户即可用
tail -f /var/log/mysql/mysql-slow.log实时查看
路径二:启用 log_output = TABLE 并授 SELECT 权限(仅限临时诊断,线上慎用)
- 确认已配置
log_output = TABLE(或FILE,TABLE),并重启 mysqld - 检查表是否存在:
SHOW CREATE TABLE mysql.slow_log;,若不存在则按官方结构建表(字段名、类型、引擎必须严格一致) - 执行:
GRANT SELECT ON mysql.slow_log TO 'monitor_user'@'%'; FLUSH PRIVILEGES; - 注意:
mysql.slow_log是 MyISAM 表(5.7 默认),高并发写入可能锁表;InnoDB 版本需手动改,但官方不保证兼容性
常见错误:以为 SET GLOBAL 就能开表日志
以下操作无效:
-
SET GLOBAL log_output = 'TABLE';—— 仅对新连接生效,且不会自动创建mysql.slow_log表 -
GRANT PROCESS ON *.* TO 'u'@'%';——PROCESS权限只允许查看当前线程状态(SHOW PROCESSLIST),**不能读 slow_log 表** - 只改
my.cnf里的log_output = TABLE却没建表 —— MySQL 启动时不会报错,但日志静默丢失 - 建了表但忘了
GRANT SELECT—— 用户查mysql.slow_log会直接报ERROR 1142 (42000): SELECT command denied
真正可控的“授权访问”本质是 OS 文件权限或显式 SQL 表权限,没有中间态。别指望 MySQL 权限系统能绕过文件系统或自动补全表结构。











