MySQL 中如何记录执行过的所有 SQL 查询?

MySQL 记录所有查询:SET GLOBAL general_log='ON' 开启通用查询日志,log_output 可选 TABLE(存 mysql.general_log 表)或 FILE。注意性能开销大,仅短期调试。

最佳实践
MySQL 中如何记录执行过的所有 SQL 查询?封面

运行时开启: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 中的敏感参数是明文——注意日志文件的权限。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台