一、查看通用查询日志状态
首先检查当前通用查询日志的配置状态。
查看通用查询日志是否开启及日志文件位置
SHOW VARIABLES LIKE 'general_log%';
查看日志输出方式(FILE/TABLE/NONE)
SHOW VARIABLES LIKE 'log_output';
查看当前日志记录情况
SHOW GLOBAL STATUS LIKE 'Questions'; -- 总查询数
输出示例:
Variable_name Value
general_log OFF
general_log_file /var/lib/mysql/server.log
Variable_name Value
log_output FILE
二、配置通用查询日志
1. 动态开启/关闭(无需重启)
适合临时诊断使用,重启后失效。
开启通用查询日志
SET GLOBAL general_log = 'ON';
关闭通用查询日志
SET GLOBAL general_log = 'OFF';
设置日志输出到文件(默认)
SET GLOBAL log_output = 'FILE';
设置日志输出到mysql.general_log表
SET GLOBAL log_output = 'TABLE';
同时设置文件和表
SET GLOBAL log_output = 'FILE,TABLE';
2. 永久配置(修改配置文件)
编辑 MySQL 配置文件 `my.cnf` 或 `my.ini`:
[mysqld]
启用通用查询日志
general_log = 1
指定日志文件路径
general_log_file = /var/lib/mysql/general.log
设置日志输出方式
log_output = FILE
设置日志文件大小限制(避免磁盘占满)
max_binlog_size = 100M
修改配置后需要重启 MySQL 服务。
三、查看通用查询日志内容
1. 当日志输出到文件时
实时查看日志内容
tail -f /var/lib/mysql/general.log
查看最近的100条记录
tail -n 100 /var/lib/mysql/general.log
查找特定用户的查询
grep "root@localhost" /var/lib/mysql/general.log
统计查询类型
grep "Query" /var/lib/mysql/general.log | wc -l
2. 当日志输出到表时
查看日志表结构
DESC mysql.general_log;
查询日志内容(按时间倒序)
SELECT event_time, user_host, thread_id, server_id, command_type, argument
FROM mysql.general_log
ORDER BY event_time DESC
LIMIT 10;
查询特定类型的操作
SELECT * FROM mysql.general_log
WHERE argument LIKE 'SELECT%'
ORDER BY event_time DESC;
清空日志表(需要权限)
TRUNCATE TABLE mysql.general_log;
四、通用查询日志内容解读
日志中的典型条目包含以下信息:
/usr/sbin/mysqld, Version: 8.0.33-0ubuntu0.20.04.2 ((Ubuntu)). started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time | Id | Command | Argument |
---|---|---|---|
2023-10-27T10:15:32.123456Z | 8 | Connect | root@localhost on test using SSL |
2023-10-27T10:15:33.234567Z | 8 | Query | SELECT @@version_comment limit 1 |
2023-10-27T10:15:34.345678Z | 8 | Query | SHOW VARIABLES LIKE '%general%' |
2023-10-27T10:15:35.456789Z | 8 | Query | USE test |
2023-10-27T10:15:36.567890Z | 8 | Query | SELECT * FROM tb_student |
2023-10-27T10:15:40.678901Z | 8 | Quit |
关键字段说明:
`Time`:操作发生的时间戳
`Id`:连接线程ID
`Command`:命令类型(Connect、Query、Quit等)
`Argument`:具体的SQL语句或操作详情
五、日志维护与管理
1. 日志轮询与删除
使用mysqladmin刷新日志(创建新日志文件)
mysqladmin -u root -p flush-logs
手动备份并重置日志
mv /var/lib/mysql/general.log /var/lib/mysql/general.log.old
mysqladmin -u root -p flush-logs
如果输出到表,可以定期清理
TRUNCATE TABLE mysql.general_log;
2. 自动日志清理
将以下命令加入定时任务:
每天凌晨清理7天前的通用查询日志
find /var/lib/mysql/ -name "general.log.*" -mtime +7 -delete
或者按大小轮询(超过100M时)
if [ $(du -m /var/lib/mysql/general.log | cut -f1) -gt 100 ]; then
mysqladmin -u root -p flush-logs
fi
六、最佳实践与注意事项
1. 性能影响严重:通用查询日志会记录所有操作,对I/O性能影响很大(可能降低性能20-50%),生产环境不建议长期开启。
2. 临时诊断使用:只在需要排查问题时临时开启,问题解决后立即关闭。
3. 合适的开启时机:
排查未知的数据库操作
审计用户行为
调试应用程序的SQL语句
4. 安全考虑:日志中可能包含敏感信息(如密码),确保日志文件权限设置正确:
chmod 600 /var/lib/mysql/general.log
chown mysql:mysql /var/lib/mysql/general.log
5. 磁盘空间监控:通用查询日志可能快速增长,需要监控磁盘空间使用情况。
6. 与慢查询日志的区别:
通用日志:记录所有查询
慢查询日志:只记录执行时间超过阈值的查询
示例工作流程:
1. 临时开启通用查询日志(诊断模式)
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'FILE';
2. 重现问题场景(运行应用程序)
3. 立即关闭日志以减少性能影响
SET GLOBAL general_log = 'OFF';
4. 分析日志内容
使用grep或其他文本工具分析日志文件
5. 找到问题后清理日志
mysqladmin -u root -p flush-logs
七、替代方案
对于生产环境,考虑使用更轻量级的替代方案:
1. 性能模式(Performance Schema):提供更细粒度的性能监控
2. 审计插件:如MySQL Enterprise Audit插件
3. 二进制日志:用于复制和点-in-time恢复,也可以用于审计数据变更
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程