mysql 8.0+ 不支持直接写入系统数据表;慢查询日志只能输出到文件或syslog,mysql.slow_log是只读csv视图,非实时写入目标,且8.0默认不创建该表。

MySQL 8.0+ 是否支持直接写入系统数据表?
不支持。MySQL 的慢查询日志(slow_query_log)只能输出到文件或系统日志(syslog),**不能直接写入 MySQL 内部的数据表(如 mysql.slow_log)**。这个表是只读视图,底层依赖于文件日志解析,不是实时写入目标。
常见误解是开启 log_output = 'TABLE' 就能记录慢查询——但该配置仅对通用查询日志(general_log)生效,对慢查询日志完全无效。
-
log_output = 'TABLE'对slow_query_log无作用,设了也白设 -
mysql.slow_log表本质是 CSV 引擎 + 文件映射,依赖slow_query_log_file指向的物理文件存在且可读 - MySQL 8.0 删除了
mysql.slow_log表(默认不创建),需手动初始化并启用 CSV 存储引擎才能使用
如何让 slow_log 表可用(仅限 MySQL 5.7 及部分 8.0 手动恢复场景)
如果你坚持用 mysql.slow_log 查看慢查询(例如已有监控脚本依赖该表),必须满足三个硬性条件:
- 确保
csv存储引擎已启用:SELECT SUPPORT FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE = 'CSV';返回YES - 手动创建表(MySQL 8.0 默认不带):
CREATE TABLE IF NOT EXISTS mysql.slow_log ( start_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), user_host MEDIUMTEXT NOT NULL, query_time TIME(6) NOT NULL, lock_time TIME(6) NOT NULL, rows_sent INTEGER NOT NULL, rows_examined INTEGER NOT NULL, db VARCHAR(512) NOT NULL, last_insert_id INTEGER NOT NULL, insert_method VARCHAR(16) NOT NULL, server_id INTEGER UNSIGNED NOT NULL, sql_text MEDIUMTEXT NOT NULL, thread_id BIGINT(21) UNSIGNED NOT NULL ) ENGINE=CSV CHARACTER SET utf8mb4 COMMENT='Slow log';
- 开启慢查询日志并指定文件路径:
SET GLOBAL slow_query_log = ON;,SET GLOBAL slow_query_log_file = '/var/lib/mysql/mysql-slow.log';
注意:mysql.slow_log 不是实时同步的“数据库表”,而是通过 CSV 引擎定时扫描日志文件生成的只读快照——查不到最新慢查询是正常现象。
更可靠的做法:用 pt-query-digest 实时解析日志文件
生产环境推荐绕过 mysql.slow_log,直接处理日志文件。Percona Toolkit 的 pt-query-digest 是事实标准工具,能解析、聚合、生成报告,还能输出到 MySQL 表(自定义目标表,非系统表)。
- 先确保慢查询日志开启并轮转可控:
slow_query_log = ON,long_query_time = 1,log_queries_not_using_indexes = OFF(避免噪音) - 用
pt-query-digest --create-review-table --review h=localhost,D=percona,t=review /var/lib/mysql/mysql-slow.log把结果存入自建表 - 配合
logrotate和定时任务,每天解析一次,避免单个日志文件过大导致解析卡死 - 如果需要实时性,可搭配
tail -f+awk过滤关键字段,但不如pt-query-digest准确(它能归一化 SQL、合并相似查询)
为什么不要依赖 slow_log 表做告警或监控?
因为它的延迟和可靠性太差:CSV 引擎读取文件是全量扫描,大日志下 SELECT COUNT(*) FROM mysql.slow_log 可能卡住几秒甚至几十秒;文件权限、编码、格式错位(比如日志里含未转义换行符)都会导致整张表不可读;MySQL 重启后若日志路径变更,表内容就失效。
真正用于监控的路径只有一条:采集 slow_query_log_file 文件内容,用外部程序解析后写入你自己的带索引、可查询、可告警的业务表(如 monitoring.slow_queries),别碰 mysql.slow_log。











