MySQL通用日志查不到INSERT/UPDATE语句,是因为general_log仅记录成功解析并进入执行流程的原始语句;若因语法错误、权限不足、代理拦截、连接池复用或log_output配置不当(如设为'NONE'),则DML不会被记录。

MySQL通用日志开启后为什么查不到INSERT/UPDATE语句?
通用日志(general_log)默认只记录客户端发来的原始语句,但前提是语句实际被服务器解析并进入执行流程。如果SQL因语法错误、权限不足或被代理层拦截,就不会写入日志。
常见错误现象:general_log 文件里只有 Connect、Quit,没有业务DML;或者只看到 SELECT 却看不到 INSERT —— 很可能是因为应用用了连接池复用连接,而日志只在新连接建立时记录初始语句,后续语句是否记入取决于 log_output 和 general_log 开关时机。
- 确认已动态开启:
SET GLOBAL general_log = ON;(仅对新连接生效) - 日志输出目标必须明确:
SET GLOBAL log_output = 'FILE';或'TABLE';设为'NONE'会导致静默丢弃 - 文件路径由
general_log_file控制,默认是主机名.log,不是你期望的 /var/log/mysql/xxx - 如果用
log_output = 'TABLE',查mysql.general_log表,注意该表是CSV引擎,不支持索引和大容量查询,别直接SELECT *
audit_log插件启用后MySQL启动失败怎么办?
MySQL企业版自带的 audit_log 插件对版本和配置敏感,社区版默认不包含。强行安装会报错 Plugin 'audit_log' is not loaded,更常见的是启动阶段卡死或崩溃,根本原因是插件依赖的共享库路径不对或权限不足。
使用场景:需要细粒度审计(如谁在什么时间删了哪张表),且必须满足合规要求(等保、GDPR)。
- 先确认版本:
SELECT VERSION();,audit_log插件仅支持 MySQL 5.6.10+ 企业版;社区版需换用mysql-audit(McAfee开源插件) - 加载前检查:
SHOW PLUGINS;看是否已存在;若存在但状态为DISABLED,说明配置有冲突 - 配置文件中添加:
plugin_load_add = audit_log.so(Linux)或audit_log.dll(Windows),路径必须绝对且MySQL进程有读权限 - 插件参数如
audit_log_policy = ALL会显著拖慢高并发写入,生产环境慎用;建议先设为LOGINS观察稳定性
用performance_schema代替audit_log可行吗?
可以补一部分,但不能替代。MySQL 5.7+ 的 performance_schema 能追踪语句执行生命周期,包括账号、时间、影响行数,但它不记录完整SQL文本(默认截断),也不持久化到磁盘——重启即清空,且默认关闭大部分消费者(consumer)。
性能影响明显:开启全部语句采集会使QPS下降15%~30%,尤其在短连接高频场景下。
- 必须显式启用:
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_statements_history_long'; - 完整SQL依赖
performance_schema.events_statements_history_long.SQL_TEXT字段,但长度受max_digest_length限制(默认4096字节),超长会被截断 - 无法审计连接/断开、权限拒绝等非执行事件,这些仍需
general_log或专用插件 - 查最近执行的敏感操作示例:
SELECT USER, HOST, SQL_TEXT FROM performance_schema.events_statements_history_long WHERE SQL_TEXT LIKE '%DROP TABLE%' ORDER BY EVENT_ID DESC LIMIT 5;
audit_log_file权限被拒绝或日志写不进指定路径
MySQL服务进程(通常是 mysql 用户)对目标目录无写权限,是最常见的“日志开了却找不到文件”原因。插件不会报错,只会静默失败。
容易踩的坑:以为改了 audit_log_file 配置就完事,没检查父目录属主和SELinux上下文(CentOS/RHEL上尤其明显)。
- 路径必须由MySQL用户可写:
sudo chown mysql:mysql /var/log/mysql/audit/ && chmod 750 /var/log/mysql/audit/ - SELinux启用时,需打标:
sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql/audit(/.*)?" && sudo restorecon -Rv /var/log/mysql/audit - 不要把日志和数据目录放一起,audit日志增长快,容易撑爆磁盘;也别设成
/tmp,系统清理会误删 - 插件日志轮转靠外部工具(如logrotate),它自身不支持按大小或时间切分
general_log 加时间范围过滤就行;后者必须用持久化、防篡改、带签名的方案,插件只是其中一环。


















