MySQL社区版无原生审计日志,AUDIT_LOG插件仅限企业版;合规检查需结合PERFORMANCE_SCHEMA、外部代理及手动SQL扫描元数据表,而非依赖SHOW GRANTS或mysql.user单表。

MySQL 本身不内置审计日志功能,AUDIT_LOG 插件仅在 MySQL Enterprise Edition 中提供,社区版默认不可用;合规性检查需依赖外部工具或手动 SQL 扫描,不能靠 SHOW GRANTS 或 mysql.user 表直接满足等保、GDPR 等要求。
MySQL 社区版没有原生审计日志,别指望 audit_log.so
社区版启动时加载 audit_log.so 会报错:Plugin 'audit_log' is not loaded。该插件仅随商业版分发,且需单独购买许可。替代方案只有:
- 启用通用查询日志(
general_log=ON),但会严重拖慢性能,且记录所有语句(含敏感数据),不符合最小日志原则 - 使用 MariaDB 的
server_audit插件(开源、兼容 MySQL 协议),需替换数据库或额外部署代理层 - 通过 MySQL Router 或 ProxySQL 拦截流量并记录,但无法捕获本地 socket 连接或 root@localhost 的操作
用 SQL 手动做合规性检查,重点查这三类权限滥用
等保 2.0 要求“权限最小化”“分离管理员与业务账号”,但 SELECT * FROM mysql.user 只显示全局权限,容易漏掉库/表级细粒度授权。必须联合多张元数据表扫描:
SELECT u.User, u.Host, u.authentication_string IS NOT NULL AS has_password,
u.super_priv = 'Y' AS has_super,
COUNT(DISTINCT t.Table_name) AS tables_with_insert_priv
FROM mysql.user u
LEFT JOIN mysql.tables_priv t ON u.User = t.User AND u.Host = t.Host AND t.Table_priv LIKE '%Insert%'
WHERE u.Account_locked = 'N'
GROUP BY u.User, u.Host
HAVING has_super OR tables_with_insert_priv > 10;常见误判点:
CRMEB Min是CRMEB品牌全新推出的一款轻量级、高性能、前后端分离的开源电商系统,完善的后台权限管理、会员管理、订单管理、产品管理、客服系统、CMS管理、多端管理、页面DIY、数据统计、系统配置、组合数据管理、日志管理、数据库管理,一键开通短信、产品采集、物流查询等接口,系统采用TP6+Mysql+Uniapp+iView+Redis+workerman+form-builder等最流行热
-
GRANT OPTION权限比SUPER更危险——它允许用户把权限转授他人,但不会出现在mysql.user的字段里,得查mysql.db和mysql.tables_priv -
'%'主机匹配允许任意 IP 连接,但若账号绑定了REQUIRE X509,实际风险较低;只看Host列不结合ssl_type会误报 - 系统账号如
mysql.session或mysql.infoschema是内部使用,不应被人工干预,但SHOW GRANTS FOR 'mysql.session'@'localhost'会返回语法错误——这类账号不能直接GRANT或REVOKE
用 PERFORMANCE_SCHEMA 捕获运行时权限行为(5.7+)
虽然不能替代审计日志,但 performance_schema.events_statements_history_long 可回溯最近 10000 条执行语句,配合 accounts 表能定位越权操作:
SELECT a.USER, a.HOST, es.SQL_TEXT, es.TIMER_START FROM performance_schema.accounts a JOIN performance_schema.events_statements_history_long es ON a.USER = es.USER AND a.HOST = es.HOST WHERE es.SQL_TEXT LIKE '%DROP TABLE%' OR es.SQL_TEXT LIKE '%GRANT%' ORDER BY es.TIMER_START DESC LIMIT 20;
注意限制:
- 该表默认关闭,需设
performance_schema=ON且events_statements_history_long.size > 0 - 只记录成功执行的语句,失败的权限拒绝(如
ERROR 1142 (42000): INSERT command denied)不会入库 - 历史记录滚动覆盖,无法长期归档,需搭配定时导出脚本
真正的合规落地,不是堆砌 GRANT 语句,而是建立账号生命周期流程:创建时走审批工单、定期自动扫描 mysql.role_edges 树状关系、删除离职人员前先冻结再验证无活跃连接。审计日志只是证据链一环,缺失它时,performance_schema + 外部代理日志 + 定期 SQL 巡检是唯一可行组合。









