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_logBooleanGlobalOFFON/OFF是否启用通用查询日志
general_log_fileStringGlobalhostname.log合法文件路径指定日志文件存储路径
log_outputEnumGlobalFILEFILE/TABLE/NONE日志输出目标:
- FILE: 文件
- TABLE: mysql.general_log表
- NONE: 不记录
log_timestampsEnumGlobalUTCUTC/SYSTEM控制日志时间戳格式:
- UTC: 国际标准时间
- SYSTEM: 系统时区时间
log_queries_not_using_indexesBooleanGlobalOFFON/OFF是否记录未使用索引的查询(需slow log开启)
log_slow_admin_statementsBooleanGlobalOFFON/OFF是否记录慢管理语句(如ALTER TABLE)

参数特性说明

  1. 动态生效:

    -- 所有参数都支持运行时修改(需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 数据库的查询活动,但需特别注意其对性能的影响和安全风险。


晚上不吃饭
4 声望1 粉丝