6.4.4 通用日志与审计场景取舍

通用日志(general log)记录所有连接与语句,审计价值高但性能与存储成本大。本节聚焦“是否开启、何时开启、如何替代”的取舍策略,结合审计合规、故障排查与性能影响给出可落地的选择标准,并提供可执行示例、排错与练习。

原理草图与数据流#

文章图片

适用场景与价值评估#

  • 合规审计:需要完整记录用户行为、登录来源、执行语句与时间线;适合短周期审计或突发取证。
  • 故障排查:复现线上偶发问题、定位复杂连接异常或协议层问题;适合临时开启。
  • 开发测试:验证应用发包、连接池行为或SQL生成逻辑;适合非生产环境。

成本与风险#

  • 性能影响:对高并发业务影响显著,增加磁盘IO与CPU开销。
  • 数据膨胀:日志增长极快,易触发磁盘告警与写满风险。
  • 敏感信息:可能记录明文参数与业务数据,需配合脱敏与访问控制。

取舍策略与替代方案#

  • 生产环境默认关闭:除合规要求外不长期启用。
  • 短期开启:限定时间窗口、业务低峰期与目标实例;结合日志轮转策略与容量预留。
  • 使用审计插件替代:选择官方/第三方审计插件记录关键事件,降低性能影响并支持过滤规则。
  • 结合慢日志与binlog:慢日志用于性能追踪,binlog用于数据变更追溯,可满足大部分需求。

启用原则与操作建议#

  • 明确目标:先定义需要审计的用户、库表或SQL类型,避免全量开启。
  • 范围可控:仅对指定实例、时间段开启;必要时切换到只记录连接行为。
  • 安全与合规:设置日志访问权限,配置脱敏或审计平台统一接入。

通用日志开启/关闭示例(含命令解释)#

示例适用于 MySQL 5.7/8.0,建议在低峰或测试环境执行。

-- 1) 查看当前general log状态
SHOW VARIABLES LIKE 'general_log%';
-- general_log: ON/OFF
-- general_log_file: 日志文件路径

-- 2) 临时开启(重启失效)
SET GLOBAL general_log = ON;

-- 3) 切换输出到文件(默认可能为FILE或TABLE)
SET GLOBAL log_output = 'FILE';

-- 4) 指定日志文件(需写入权限)
SET GLOBAL general_log_file = '/var/log/mysql/general.log';

-- 5) 只记录连接相关(减少写入)
SET GLOBAL general_log = ON;
SET GLOBAL log_output = 'TABLE'; -- 或FILE
# 6) 观察日志增长与内容
sudo tail -f /var/log/mysql/general.log

# 7) 查看文件大小与增长速率
sudo ls -lh /var/log/mysql/general.log
sudo du -sh /var/log/mysql/general.log

# 8) 关闭通用日志
mysql -uroot -p -e "SET GLOBAL general_log = OFF;"

安装审计插件替代示例(以 MySQL Enterprise Audit 为例)#

若使用开源替代,可选 MariaDB Audit Plugin 或第三方审计组件,具体以发行版支持为准。

-- 1) 查看可用插件
SHOW PLUGINS;

-- 2) 安装审计插件(需有插件库)
INSTALL PLUGIN audit_log SONAME 'audit_log.so';

-- 3) 启用与配置策略(仅记录连接与DDL)
SET GLOBAL audit_log_policy = 'LOGINS,QUERIES'; -- 示例策略
SET GLOBAL audit_log_format = 'JSON';           -- 便于平台解析

-- 4) 验证是否生效
SHOW VARIABLES LIKE 'audit_log%';
# 5) 审计日志查看(路径依实现而定)
sudo ls -lh /var/lib/mysql/audit.log

排错清单(常见问题与定位命令)#

  • 开启后无日志:检查 log_output 与文件路径权限。
  • 日志文件不增长:确认 general_log=ON 且实际有连接/查询。
  • 写满磁盘:检查 df -h,紧急关闭日志并清理。
# 权限与路径检查
sudo ls -ld /var/log/mysql
sudo stat /var/log/mysql/general.log

# 配置确认
mysql -uroot -p -e "SHOW VARIABLES LIKE 'general_log%'; SHOW VARIABLES LIKE 'log_output';"

# 紧急关闭与清理
mysql -uroot -p -e "SET GLOBAL general_log=OFF;"
sudo truncate -s 0 /var/log/mysql/general.log

审计场景选型对照#

  • 需要全量访问行为:优先审计插件或短期general log。
  • 需要SQL性能优化:优先慢查询日志。
  • 需要数据变更追踪:优先binlog。
  • 需要登录与权限行为:优先审计插件或错误日志结合。

练习与验证#

  1. 短期审计演练:在测试库开启 general log 5 分钟,执行 5 条 SQL,统计日志行数并关闭。
  2. 容量评估:压测 1 分钟,计算日志增量并估算日增长(增量×1440)。
  3. 替代方案验证:安装审计插件,仅记录登录行为,验证日志中无明文SQL。
# 练习脚本(示例)
mysql -uroot -p -e "SET GLOBAL general_log=ON;"
for i in {1..5}; do
  mysql -uroot -p -e "SELECT NOW(), $i;"
done
mysql -uroot -p -e "SET GLOBAL general_log=OFF;"
wc -l /var/log/mysql/general.log

最佳实践摘要#

  • 生产长期审计优先使用插件/平台,general log仅用于临时排查。
  • 开启前评估IO、磁盘与敏感数据风险,设置自动关闭与轮转。
  • 审计目标清晰化,避免“全量记录导致成本失控”。