mysql通用查询日志(general_log)仅用于调试,不适用于安全审计;启用需设general_log=on、log_output为file或table,并配置路径;其无用户区分、无轮转、性能开销大,合规审计应使用audit_log等专用插件。

MySQL 默认不开启访问日志(general log),且它和安全日志(如 audit log)不是一回事——后者需插件支持,前者只是简单记录所有 SQL 语句,性能开销大,生产环境通常禁用。
如何启用 general_log 记录所有客户端操作
这是最常被误称为“访问日志”的功能,实际是通用查询日志,用于调试而非审计。
-
general_log是开关变量,设为ON才生效;默认为OFF - 日志输出位置由
log_output控制:可选FILE(写入文件)或TABLE(写入mysql.general_log表) - 若选
FILE,路径由general_log_file指定,默认是hostname.log,位于datadir下 - 动态开启示例:
SET GLOBAL general_log = ON;<br>SET GLOBAL log_output = 'FILE';<br>SET GLOBAL general_log_file = '/var/log/mysql/general.log';
- 注意:
SET GLOBAL修改在重启后失效,需写入配置文件(my.cnf)的[mysqld]段落才能持久化
为什么 general_log 不适合做安全审计
它不区分用户、不记录连接/断开、不标记权限变更,连密码明文(如 SET PASSWORD)都可能被记下,且无法过滤只留高危操作。
Modoer 是一款以本地分享,多功能的点评网站管理系统。采用 PHP+MYSQL 开发设计,开放全部源代码。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱。在升级前一定要备份好自己的原版本,特别是自己设计了模板和修改了代码的用户。Modoer多功能点评系统 v1.2.5 Build 20111220更新列表修正 安全漏洞和安全隐患增加 后台登陆和SQL错误记录日志修复 若干小BUG
- 每条语句都写入,QPS 高时 I/O 压力陡增,可能拖慢实例
- 无自动轮转机制,日志文件会无限增长,需额外脚本或
logrotate配合 - 不记录客户端 IP(除非结合
host列查information_schema.PROCESSLIST,但非实时) - MySQL 8.0+ 的
error_log也不包含 SQL 执行记录,和general_log无关
真正可用的安全审计方案:MySQL Enterprise Audit 或 community 替代品
官方企业版提供 audit_log 插件,社区版 MySQL 5.7+ 可用 MariaDB 的 server_audit 插件或 Percona 的 audit_log(需单独下载)。
- 加载方式类似:
INSTALL PLUGIN server_audit SONAME 'server_audit.so'; - 关键配置项包括:
server_audit_logging(是否启用)、server_audit_events(如CONNECT,QUERY,TABLE)、server_audit_file_path - 审计日志格式为 JSON 或普通文本,含时间戳、用户、主机、SQL 类型、结果状态等字段
- 插件日志独立于 error/general log,支持按大小/时间轮转(依赖具体插件版本)
- 注意:插件需在启动时加载(
plugin_load_add = server_audit.so),否则INSTALL PLUGIN仅临时生效
真正要落地安全日志管理,得先分清需求:是临时排查连接异常,还是满足等保/PCI 合规?前者开 general_log 加 tail -f 就行;后者必须用审计插件,并确保日志不可删、有备份、能集中采集——这些都不是 MySQL 自身能闭环的事。









