General Log 概述
General Query Log(通用查询日志)是 MySQL 记录所有到达服务器的 SQL 语句的日志文件,无论这些语句是否执行成功都会被记录。
作用与功能
- 全量 SQL 记录: 记录所有客户端发送到 MySQL 服务器的 SQL 语句
- 问题排查: 帮助诊断 SQL 执行问题、分析客户端行为
- 审计功能: 提供基础的数据库操作审计能力
- 性能分析: 辅助分析数据库访问模式
工作机制
1. 记录时机: 在 SQL 语句被接收后立即记录(执行前)
2. 记录内容:
- 连接/断开连接信息
- 所有执行的 SQL 语句
- 查询开始时间
- 用户和主机信息
3. 写入方式: 可以写入文件或表(mysql.general_log)
配置方式:
查看是否开启General log
show global variables like 'general%';
# 查看当前 General Log 输出方式
show global variables like 'log_output';
配置文件设置(永久生效)
[mysqld]
general_log = 1
#开关控制是否启用通用查询日志功能
#取值:
#1 或 ON:启用日志记录
#0 或 OFF:禁用日志记录(默认值)
general_log_file = /var/log/mysql/mysql-general.log
#指定日志文件的存储路径和文件名
log_output = FILE
#定义日志的输出目的地
动态设置(无需重启)
-- 开启 general log
SET GLOBAL general_log = 'ON';
-- 指定日志输出方式(FILE/TABLE/NONE)
SET GLOBAL log_output = 'FILE';
-- 设置日志文件路径(需要FILE权限)
SET GLOBAL general_log_file = '/var/log/mysql/general.log';
-- 关闭 general log
SET GLOBAL general_log = 'OFF';
优缺点分析
优点:
全面记录:捕获所有 SQL 语句
简单易用:配置简单,无需额外工具
无性能采样:记录所有查询而非抽样
多输出格式:支持文件和表两种存储方式
缺点:
性能影响:高并发下可能影响性能(5-15% 性能下降)
日志膨胀:日志文件可能快速增长
安全风险:记录敏感信息(如密码明文)
无执行详情:只记录 SQL 不记录执行计划/结果
最佳实践
临时使用: 建议仅在排查问题时开启
日志轮转: 配置日志轮转防止磁盘占满
# Linux 日志轮转示例
/var/log/mysql/mysql-general.log {
daily
rotate 7
missingok
compress
postrotate
mysqladmin flush-logs
endscript
}
敏感信息过滤: 避免记录含密码的操作
生产环境慎用: 长期开启需评估性能影响
查看日志内容
- 文件方式:
tail -f /var/log/mysql/general.log
- 表方式(当 log_output='TABLE'):
SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 10;
注意事项
需要 SUPER 权限来启用/禁用 general log
日志文件所在目录需要 MySQL 用户写入权限
文件方式性能更好,表方式更便于SQL查询
文件路径需提前创建并设置正确权限
表方式存储的日志会写入系统库,可能影响性能,需定期清理
表方式记录会写入mysql.general_log系统表
生产环境推荐FILE方式,避免系统表膨胀
长期开启需配置日志轮转(使用logrotate工具)
在高并发场景下,双写模式(FILE+TABLE)可能显著影响性能
log_output 支持多目标组合(用逗号分隔)
MySQL 8.0+ 支持性能模式作为替代方案
相关参数
MySQL General Log 相关参数
参数名 | 类型 | 作用域 | 默认值 | 可选值 | 说明 |
---|---|---|---|---|---|
general_log | Boolean | Global | OFF | ON/OFF | 是否启用通用查询日志 |
general_log_file | String | Global | hostname.log | 合法文件路径 | 指定日志文件存储路径 |
log_output | Enum | Global | FILE | FILE/TABLE/NONE | 日志输出目标: - FILE: 文件 - TABLE: mysql.general_log表 - NONE: 不记录 |
log_timestamps | Enum | Global | UTC | UTC/SYSTEM | 控制日志时间戳格式: - UTC: 国际标准时间 - SYSTEM: 系统时区时间 |
log_queries_not_using_indexes | Boolean | Global | OFF | ON/OFF | 是否记录未使用索引的查询(需slow log开启) |
log_slow_admin_statements | Boolean | Global | OFF | ON/OFF | 是否记录慢管理语句(如ALTER TABLE) |
参数特性说明
动态生效:
-- 所有参数都支持运行时修改(需SUPER权限) SET GLOBAL general_log = ON; SET GLOBAL log_output = 'TABLE';
参数依赖:
- 当log_output包含TABLE时,会写入mysql.general_log系统表
- general_log_file仅在log_output包含FILE时生效
通过合理配置和使用 General Query Log,可以有效地监控和分析 MySQL 数据库的查询活动,但需特别注意其对性能的影响和安全风险。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。