mysql数据库的数据审计是指通过记录数据库的操作行为、数据变更记录,实现对数据库访问和操作的追溯、监控与合规校验。审计可以帮助运维人员排查异常操作,也可以在发生数据问题时快速定位责任方。

开启通用查询日志实现基础审计
通用查询日志(general_log)会记录mysql服务器接收到的所有客户端连接和执行的SQL语句,是最简单的审计方式,适合轻量级的审计需求。
首先查看通用查询日志的当前状态:
-- 查看通用查询日志配置 SHOW VARIABLES LIKE 'general_log%';
如果需要开启通用查询日志,可以执行以下命令:
-- 开启通用查询日志 SET GLOBAL general_log = 'ON'; -- 设置日志输出到文件,也可以设置为TABLE输出到mysql.general_log表 SET GLOBAL log_output = 'FILE'; -- 设置日志文件路径,默认路径为数据目录下的hostname.log SET GLOBAL general_log_file = '/var/lib/mysql/audit_general.log';
通用查询日志会记录所有操作,包括连接、查询、更新等,但是会产生较大的性能开销,不建议在高并发的生产环境长期开启,仅适合临时排查问题使用。
利用二进制日志解析操作记录
二进制日志(binary_log)默认记录所有数据变更操作(INSERT、UPDATE、DELETE等),不会记录查询类操作,性能开销比通用查询日志小很多,适合长期记录数据变更类的审计需求。
首先确认二进制日志是否开启:
-- 查看二进制日志状态 SHOW VARIABLES LIKE 'log_bin';
如果未开启,需要修改mysql配置文件my.cnf,添加以下配置后重启服务:
[mysqld] # 开启二进制日志 log-bin=mysql-bin # 设置日志格式为ROW,能记录每行数据的变更前后内容,更适合审计 binlog_format=ROW # 设置server-id,集群环境需要保证唯一,单机也可以设置 server-id=1
二进制日志是二进制格式,需要使用mysqlbinlog工具解析查看,解析指定时间段的日志示例如下:
# 解析2024-01-01 00:00:00到2024-01-02 00:00:00的二进制日志 mysqlbinlog --start-datetime="2024-01-01 00:00:00" --stop-datetime="2024-01-02 00:00:00" /var/lib/mysql/mysql-bin.000001
如果需要更详细的行变更内容,可以加上-v参数,解析结果会展示每行的旧值和新值,方便审计数据变更细节。
使用触发器记录数据变更审计
触发器可以在数据发生INSERT、UPDATE、DELETE操作时自动执行预设的逻辑,我们可以在触发器中把操作记录插入到自定义的审计表中,实现精准的表级审计。
首先创建审计记录表,用来存储操作信息:
-- 创建审计表 CREATE TABLE `data_audit_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `table_name` varchar(64) NOT NULL COMMENT '操作的表名', `operation_type` varchar(10) NOT NULL COMMENT '操作类型:INSERT/UPDATE/DELETE', `old_data` text COMMENT '操作前的旧数据,UPDATE和DELETE时有效', `new_data` text COMMENT '操作后的新数据,INSERT和UPDATE时有效', `operator_user` varchar(64) NOT NULL COMMENT '操作数据库的用户', `operation_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据变更审计表';
以用户表user_info为例,创建UPDATE操作的触发器:
-- 创建user_info表的UPDATE触发器
DELIMITER //
CREATE TRIGGER `user_info_update_audit`
BEFORE UPDATE ON `user_info`
FOR EACH ROW
BEGIN
-- 插入审计记录,OLD代表旧行数据,NEW代表新行数据
INSERT INTO `data_audit_log` (`table_name`, `operation_type`, `old_data`, `new_data`, `operator_user`)
VALUES (
'user_info',
'UPDATE',
CONCAT('id:', OLD.id, ',name:', OLD.name, ',age:', OLD.age),
CONCAT('id:', NEW.id, ',name:', NEW.name, ',age:', NEW.age),
USER()
);
END //
DELIMITER ;
同理可以创建INSERT和DELETE类型的触发器,这种方式可以针对重点表做精准审计,但是需要为每个表单独创建触发器,维护成本较高。
使用mysql审计插件实现完整审计
如果以上方式无法满足需求,还可以使用mysql官方的审计插件或者第三方审计插件,实现更全面的审计能力,包括记录所有连接、SQL执行、权限变更等操作,还支持日志过滤和输出到指定存储。
以mysql企业版的审计插件为例,开启方式如下:
-- 安装审计插件 INSTALL PLUGIN audit_log SONAME 'audit_log.so'; -- 查看插件状态 SHOW PLUGINS; -- 设置审计日志记录所有操作 SET GLOBAL audit_log_policy = 'ALL'; -- 设置日志输出路径 SET GLOBAL audit_log_file = '/var/lib/mysql/audit_plugin.log';
社区版mysql可以使用开源的审计插件如MariaDB Audit Plugin,安装和配置方式类似,能满足大多数合规场景的审计需求。
不同审计方式对比
以下是几种常见审计方式的特点对比,方便根据自身需求选择:
| 审计方式 | 记录范围 | 性能开销 | 适用场景 |
|---|---|---|---|
| 通用查询日志 | 所有连接和SQL语句 | 高 | 临时问题排查 |
| 二进制日志 | 数据变更操作 | 中 | 长期数据变更审计 |
| 触发器审计 | 指定表的数据变更 | 低 | 重点表的精准审计 |
| 审计插件 | 全量操作(可配置过滤) | 中低 | 合规要求的全量审计 |
审计注意事项
- 审计日志需要定期归档和备份,避免日志文件占满磁盘空间
- 审计日志本身需要做好权限控制,避免审计记录被篡改
- 生产环境尽量选择性能开销小的审计方式,避免影响业务正常运行
- 需要根据业务需求设置合理的审计范围,避免过度记录无用信息
mysql数据审计触发器binary_loggeneral_log修改时间:2026-06-22 03:03:46