一、查看通用查询日志状态

首先检查当前通用查询日志的配置状态。

 查看通用查询日志是否开启及日志文件位置

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

TimeIdCommandArgument
2023-10-27T10:15:32.123456Z8Connectroot@localhost on test using SSL
2023-10-27T10:15:33.234567Z8QuerySELECT @@version_comment limit 1
2023-10-27T10:15:34.345678Z8QuerySHOW VARIABLES LIKE '%general%'
2023-10-27T10:15:35.456789Z8QueryUSE test
2023-10-27T10:15:36.567890Z8QuerySELECT * FROM tb_student
2023-10-27T10:15:40.678901Z8Quit


关键字段说明:

 `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恢复,也可以用于审计数据变更

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)