MySQL 8.0+ 的 slow_log 表默认使用 CSV 引擎,不支持 SELECT 和 INSERT,需用 INTO OUTFILE 或客户端拉取导出,还原只能用 LOAD DATA INFILE,且须注意 secure_file_priv、字段顺序及 log_output 配置。
MySQL 8.0+ 的 slow_log 表默认是 CSV 引擎,不能直接 mysqldump
mysql 把慢查询日志存进系统表 slow_log(注意不是 mysql.slow_log,而是 mysql.slow_log 这个库表组合)时,它默认用的是 csv 存储引擎——这意味着它底层就是个文本文件,mysqldump 会报错:couldn't execute 'select * from slow_log': the storage engine for the table doesn't support select。
所以别试 mysqldump -u root mysql slow_log,它会失败。
-
SET GLOBAL log_output = 'TABLE,FILE'才会让日志同时写入表和文件;只设'TABLE'时,slow_log是唯一入口,但导出仍受限 - CSV 引擎不支持
SELECT是设计使然,不是权限或配置问题 - 如果你看到
slow_log是MyISAM或InnoDB,说明你手动改过引擎——但官方不推荐,且重启后可能被重置
安全导出 slow_log 的两种实操路径
核心思路:绕过引擎限制,把数据“捞出来”,而不是“查出来”。优先选第一种。
- 用
SELECT ... INTO OUTFILE直接写服务器磁盘(需FILE权限 +secure_file_priv路径内):SELECT * FROM mysql.slow_log INTO OUTFILE '/var/lib/mysql-files/slow_log_$(date +%F).csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
- 如果没
FILE权限或路径受限,改用客户端拉取:mysql -u root -e "SELECT * FROM mysql.slow_log" | sed 's/\t/,/g' > slow_log_$(date +%F).csv(注意字段含换行或逗号时会错位,仅适合调试量小的场景) - 导出前务必清空旧日志:
TRUNCATE TABLE mysql.slow_log,否则下次导出会重复;但先备份好当前内容再清
导出后怎么还原回 slow_log 表?别用 INSERT
slow_log 表结构里有自增主键 start_time(datetime 类型)、user_host(text)、query_time(time)等字段,但 CSV 引擎不支持 INSERT,强行插会报错:The storage engine for the table doesn't support INSERT。
- 唯一合法还原方式是用
LOAD DATA INFILE(同样受secure_file_priv限制):LOAD DATA INFILE '/var/lib/mysql-files/slow_log_2024-06-01.csv' INTO TABLE mysql.slow_log FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
- 注意字段顺序必须和
DESCRIBE mysql.slow_log完全一致,否则列错位;建议导出时显式指定字段:SELECT start_time, user_host, query_time, lock_time, rows_sent, rows_examined, db, last_insert_id, insert_method, server_id, sql_text FROM mysql.slow_log INTO OUTFILE ... - 还原前确认
log_output没设成'TABLE',否则新慢查会和导入数据混在一起
为什么不用 general_log 表做类比?它俩根本不是一回事
general_log 表虽然也是 CSV 引擎,默认也关着,但它记录的是所有语句,体积爆炸快;而 slow_log 只记超阈值的,但字段更复杂(比如 sql_text 是 text 类型,可能含换行、\0 字符),导出时容易截断或乱码。
-
slow_log.sql_text字段默认最大长度是 1024 字节,超出部分被截断——导出时看不出,但还原后就丢指令了 - MySQL 5.7 和 8.0 的
slow_log字段略有差异(比如 8.0 多了insert_method),跨版本还原前先DESCRIBE对比 - 真正生产环境别长期依赖表存储慢日志;
log_output = 'FILE'+mysqldumpslow更稳,表只用于临时诊断
导出慢日志表这件事,难点不在语法,而在理解 CSV 引擎的“只读假象”——它看着像表,实际是文件映射。一旦忘了 secure_file_priv 路径、字段顺序、或 log_output 的实时状态,导出就变成无效操作。


















