云数据库 MySQL 开启审计日志通常需要在控制台开启云厂商自带的审计功能,或自建 MySQL 实例中安装 audit_log 插件。生产环境建议仅记录敏感操作事件,避免全量记录导致性能下降。
先说结论:开启审计日志需确认版本支持并配置插件策略,重点在于平衡安全合规与系统性能。
- 适合:MySQL 8.0.19+ 社区版或 5.7.28+ 企业版,以及支持审计功能的云数据库实例。
- 优先做:配置 audit_log_policy 为 COMMANDS 或指定事件类型,避免设置为 ALL。
- 再验证:检查日志文件是否有新增记录,并确认磁盘空间充足。
命令速用版
若拥有服务器权限,可通过以下命令快速加载插件并配置基础参数:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
SET GLOBAL audit_log_policy = 'COMMANDS';
SET GLOBAL audit_log_format = 'JSON';永久生效需将配置写入 my.cnf 文件的 [mysqld] 段:
[mysqld]
plugin_load_add = audit_log.so
audit_log = FORCE_PLUS_PERMANENT
audit_log_policy = COMMANDS
audit_log_file = /var/log/mysql/audit.log为什么会这样
MySQL 默认不开启审计日志是为了保护数据库性能。全量记录所有 SQL 语句会产生大量磁盘 IO,尤其在高并发场景下可能拖慢查询速度。审计插件通过过滤事件类型,只记录连接、权限变更或特定表操作,能在满足合规要求的同时降低资源消耗。
分步处理
第一步:确认版本支持
执行 SELECT VERSION(); 检查版本。只有 MySQL 8.0.19+ 社区版或 5.7.28+ 企业版原生支持 audit_log 插件,低版本社区版需使用第三方插件或通用日志。
第二步:安装并加载插件
连接数据库后执行 INSTALL PLUGIN audit_log SONAME 'audit_log.so';。若重启后失效,必须在配置文件中添加 plugin_load_add = audit_log.so 并设置 audit_log = FORCE_PLUS_PERMANENT。
第三步:配置审计策略
编辑配置文件,设置 audit_log_policy = COMMANDS 以记录敏感命令,或指定 audit_log_events 为 connect,query_ddl,query_dcl。避免使用 ALL 策略,防止记录每条 SELECT 语句。
第四步:设置日志路径与权限
配置 audit_log_file 为绝对路径,如 /var/log/mysql/audit.log。确保 mysql 进程对该目录有写权限,否则日志无法写入。
怎么验证是否生效
执行一条敏感操作,如 CREATE USER 或 DROP TABLE,然后检查日志文件是否有新增内容。可使用命令 tail -f /var/log/mysql/audit.log 实时查看。同时运行 SHOW PLUGINS; 确认 audit_log 状态为 ACTIVE。
常见坑
日志路径配置错误:audit_log_file 必须使用绝对路径,相对路径可能导致 MySQL 静默忽略配置。
性能风险:audit_log_policy = ALL 会记录所有查询,包括 SELECT 1,生产环境可能导致磁盘写满或 IO 飙升。
日志轮转缺失:MySQL 自身不自动轮转审计日志,需配合 logrotate 工具管理,否则单个文件过大会影响查询效率。
权限不足:日志文件所属用户必须是 mysql 运行用户,否则插件启动后会因无权写入而失效。
常见问题
社区版 MySQL 支持审计日志吗?
MySQL 8.0.19+ 社区版原生支持 audit_log 插件,低版本需安装第三方插件如 McAfee Audit Plugin。
开启审计日志会影响性能吗?
会有影响,尤其是全量记录策略。建议仅记录敏感操作事件,并监控磁盘 IO 变化。
审计日志默认存储在哪里?
默认可能写入错误日志目录,建议通过 audit_log_file 参数指定独立文件路径以便管理。
参考来源
- 如何通过 MySQL 的 Audit Plugin 记录数据库的所有敏感操作?
- mysql 如何审计用户登录记录与非法访问行为_配置开启 audit_log 审计插件
- 如何开启审计日志_mysql 操作记录配置
- mysql 如何记录用户所有操作行为_利用审计插件 Audit Log
- MySQL 8 开启审计日志