1. MySQL General Log 全面解析
作为一名数据库管理员,我经常需要排查各种SQL执行问题。在这个过程中,MySQL的general log(通用查询日志)是我最常用的工具之一。今天我就来详细分享一下这个强大但容易被忽视的功能。
General log就像MySQL的"黑匣子",它会忠实记录所有进出MySQL服务器的SQL语句。无论是简单的SELECT查询,还是复杂的DDL变更,甚至是连接和断开操作,都会被完整记录下来。这个功能在调试复杂问题、审计SQL操作或分析异常行为时特别有用。
不过需要注意的是,general log默认是关闭状态,这是有充分理由的。开启后它会记录所有SQL语句,对性能会有一定影响(根据我的经验,性能损耗大约在5-15%之间),而且日志文件会快速增长。因此,我通常只在特定调试场景下临时开启它。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. General Log 核心特性详解
2.1 日志记录范围与特点
General log最显著的特点是它的"全量记录"特性。不同于只记录慢查询的slow log,或者只记录数据变更的binlog,general log会记录:
- 所有DML语句(SELECT, INSERT, UPDATE, DELETE等)
- 所有DDL语句(CREATE, ALTER, DROP等)
- 所有DCL语句(GRANT, REVOKE等)
- 连接建立和断开事件
- 预处理语句和执行计划
这里有个重要细节需要注意:日志记录的是SQL语句的接收顺序,而非实际执行顺序。比如事务A和事务B几乎同时发送UPDATE语句,但由于锁竞争,实际执行顺序可能与接收顺序不同。这个特性在分析死锁问题时特别有用。
2.2 日志存储格式解析
General log支持两种存储方式,各有优缺点:
文件存储方式
- 优点:I/O性能较好,对系统资源占用较低
- 缺点:不方便直接查询和分析
- 典型日志格式:
code复制2023-08-20T14:23:45.123456Z 10 Connect root@localhost on
2023-08-20T14:23:47.234567Z 10 Query SELECT * FROM users
2023-08-20T14:23:49.345678Z 10 Quit
表存储方式(mysql.general_log表)
- 优点:可直接用SQL查询和分析
- 缺点:会产生额外的表I/O开销
- 表结构:
sql复制CREATE TABLE `general_log` (
`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`thread_id` bigint(21
