log_output=TABLE 不会自动创建 mysql.slow_log 表;需手动建表且 slow_query_log 必须为 ON,否则无记录;生产慎用,因 CSV 引擎无索引、TRUNCATE 会阻塞 DDL/DML,双模式更增 I/O 与运维风险。
log_output=TABLE 会触发
mysql
.slow_log 表自动创建吗
不会。MySQL 5.7.8+ 版本才原生支持
直接写入系统表,但前提是
表必须已存在且结构正确。如果该表不存在,MySQL 不会自动建表,而是静默丢弃慢查询日志 —— 你查不到任何记录,也看不到报错。
手动创建方式(仅需执行一次):
注意:
是官方推荐(非 InnoDB),因为写入频繁、只读分析场景多;用 InnoDB 可能引发锁争用和日志刷盘压力。
set global log_output='TABLE' 后为什么 still no records in mysql.slow_log
常见原因有三个,按优先级排查:
本身是 OFF:必须先
,否则
设置无效
过高(比如还是默认的 10),导致实际执行的 SQL 没超时;建议临时设为
验证是否写入
权限不足:执行
的用户需有
权限 on
,而写入依赖 MySQL 内部线程,若
库被显式
过写权限(如某些加固脚本),也会失败
验证当前状态用这两条命令:
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
log_output=TABLE 在生产环境有没有风险
有,而且不小。核心风险不是“写不进去”,而是“写进去后卡住整个库”:
会触发全局 MDL 锁,期间所有 DDL 和部分 DML(尤其是涉及表元数据的操作)会被阻塞,监控脚本查
就可能直接拖垮业务
是 CSV 引擎,不支持索引;当记录量 >10 万行后,
查询极慢,甚至拖慢
线程调度
磁盘上会额外生成
文件,出错时(如磁盘满、文件损坏)MySQL 可能反复重试写入并报
,进一步加剧 I/O 压力
所以生产环境真要用表模式,建议搭配
定期归档 +
,且必须避开业务高峰;更稳妥的做法是只用
,再用
或自研脚本定时解析。
log_output='FILE,TABLE' 能否兼顾安全与便利
不能。双模式看似保险,实则放大问题:
日志写入是同步的:一条慢 SQL 必须同时写成功 FILE 和 TABLE 才算完成,任一路径失败(如磁盘满、
损坏),整条日志丢失,且无告警
资源开销翻倍:FILE 模式走文件系统缓存,TABLE 模式走引擎层写入,两者并发刷盘容易打满 I/O,尤其在高并发慢查询场景下
运维复杂度陡增:你要同时监控两个日志源的大小、轮转、权限、备份策略 ——
和
的生命周期完全不一致
真正需要双路备份的场景,应该用 FILE 输出 + 外部日志采集器(如 Filebeat)实时推送到 ELK 或 S3,而不是依赖 MySQL 自身的双写机制。
log_output='TABLE'mysql.slow_logCREATE TABLE IF NOT EXISTS mysql.slow_log (
start_time TIMESTAMP(6) NOT NULL DEFAULT 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_id INTEGER NOT NULL,
server_id INTEGER UNSIGNED NOT NULL,
sql_text MEDIUMTEXT NOT NULL,
thread_id BIGINT UNSIGNED NOT NULL
) ENGINE=CSV AVG_ROW_LENGTH=256 CHARACTER SET utf8mb4 COMMENT='Slow log';ENGINE=CSVslow_query_logSET GLOBAL slow_query_log = 'ON'log_outputlong_query_timeSET GLOBAL long_query_time = 0.1SELECTSELECTmysql.slow_logmysqlREVOKESHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'log_output';TRUNCATE TABLE mysql.slow_loginformation_schema.tablesmysql.slow_logSELECT * FROM mysql.slow_log WHERE start_time > ...mysqldslow_log.CSNIncorrect key file for table 'slow_log'EVENTTRUNCATEFILEpt-query-digestslow_log.CSNslow_query_log_filemysql.slow_log