slow_log表默认关闭,启用需同时满足log_output包含'TABLE'且slow_query_log=ON;授权必须显式指定mysql.slow_log,禁用通配符;SELECT仅需SELECT权限,但须防FILE权限滥用导致日志泄露。

slow_log 表默认是关闭的,先确认它是否启用
MySQL 的 slow_log 是一个存储引擎为 CSV 的系统表(mysql.slow_log),但它**不默认启用**。即使你开了慢查询日志写入文件,slow_log 表也不会自动记录任何内容——它和文件日志是两套独立机制。
启用前必须满足两个条件:
-
log_output必须包含'TABLE'(例如SET GLOBAL log_output = 'FILE,TABLE') -
slow_query_log必须为ON
检查当前配置:SHOW VARIABLES LIKE 'log_output';SHOW VARIABLES LIKE 'slow_query_log';
如果 log_output 是 'FILE' 或空,SELECT FROM mysql.slow_log 会返回空结果,不是权限问题,而是根本没往表里写。
授予 SELECT 权限给具体用户时,注意 mysql 数据库的特殊性
mysql 系统数据库下的表(包括 slow_log)不能用通配符授权,必须显式指定表名。以下语句才有效:
GRANT SELECT ON mysql.slow_log TO 'analyzer'@'%';
这些写法都**无效**:
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
-
GRANT SELECT ON mysql.* TO ...(mysql库不允许通配授权) -
GRANT SELECT ON *.* TO ...(权限过大且不生效) -
GRANT REPLICATION CLIENT ON *.* TO ...(这个权限只用于读取 binlog,跟slow_log无关)
授完权后记得执行 FLUSH PRIVILEGES;,否则权限不会立即生效。
SELECT slow_log 需要额外权限:FILE 权限可能被误启
读取 mysql.slow_log 表本身只要 SELECT 权限,但有个隐藏风险:如果用户同时拥有 FILE 权限,且 slow_log 表的底层 CSV 文件可被 MySQL 进程读取(比如路径在 /var/lib/mysql/mysql/slow_log.CSV),攻击者可能通过 LOAD_FILE() 直接读取原始日志内容。
所以务必确认:
- 不要给分析账号授予
FILE权限 - 如果业务上确实需要
FILE,确保secure_file_priv不为空,且该目录不包含slow_log.CSV -
slow_log表默认数据目录权限应为mysql:mysql,且其他用户不可读
常见报错:Access denied for SELECT on mysql.slow_log
遇到这个错误,先排除三件事:
- 用户是否真的连接到了目标实例?跨实例或 proxy 后端容易连错
- 是否执行了
FLUSH PRIVILEGES;?特别是通过 SQL 授予而非配置文件加载时 - 是否用了
root@localhost但实际连接的是root@127.0.0.1?host 匹配必须精确
验证权限是否生效:SHOW GRANTS FOR 'analyzer'@'%';
输出中应明确出现 GRANT SELECT ON `mysql`.`slow_log`。
真正麻烦的点在于:表存在、权限看起来对、SQL 也合法,但查出来永远是空——八成是 log_output 没设成 TABLE,而不是权限问题。

















