MySQL 中如何记录执行过的所有 SQL 查询?
MySQL 记录所有查询:SET GLOBAL general_log='ON' 开启通用查询日志,log_output 可选 TABLE(存 mysql.general_log 表)或 FILE。注意性能开销大,仅短期调试。
运行时开启:SET GLOBAL general_log = 'ON';。输出目标由 log_output 控制:'TABLE' 存到 mysql.general_log 表(直接 SELECT 查看),'FILE' 写入日志文件。注意:全量记录性能开销大,只适合短期调试。
方式一:记录到表(便于查询)
SET GLOBAL log_output = 'TABLE';
SET GLOBAL general_log = 'ON';
-- 查看查询历史
SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 20;
方式二:记录到文件
SET GLOBAL log_output = 'FILE';
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/all-queries.log';
永久生效(配置文件)
# my.cnf
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mysql.log
用完记得关
SET GLOBAL general_log = 'OFF';
general log 记录每条 SQL 包括 SELECT,高并发下会显著拖慢数据库并快速占满磁盘。
更实用的替代:慢查询日志
日常排查性能问题用慢查询日志更合适(开销小):
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
观测云对照
观测云 MySQL 集成可采集慢查询日志和数据库指标,在控制台分析慢查询趋势并配置告警,比开 general log 翻原始记录高效得多。
常见问题(FAQ)
Q:general log 对性能影响多大?
A:每条查询多一次磁盘/表写入,高并发场景吞吐可能下降明显。仅用于短期抓"程序到底发了什么 SQL"。
Q:只想看某张表的查询?
A:general log 不支持按表过滤。可以在 TABLE 输出模式下 SELECT * FROM mysql.general_log WHERE argument LIKE '%表名%'。
Q:记录的密码会明文显示吗?
A:CREATE USER/GRANT 等含密码的语句会被改写隐藏密码,但应用 SQL 中的敏感参数是明文——注意日志文件的权限。