MySQL8.0 开启 general_log(通用查询日志)+ 日志留存 180 天 整改步骤
环境:Linux + MySQL8.0,审计要求:日志开启、保存不少于 180 天
前置说明
general_log 会记录所有客户端 SQL(查询、DML、连接等),IO 开销较大,生产如果长期开启建议评估磁盘性能;也可以备选方案:接入数据库审计系统,不开启 general_log。
1. 创建日志目录、授权
# 创建日志存放目录 mkdir -p /var/log/mysql/general # 授权mysql用户读写 chown mysql:mysql /var/log/mysql/general chmod 700 /var/log/mysql/general
2. 修改 my.cnf 配置(永久生效)
编辑 /etc/my.cnf,在 [mysqld] 段添加:
[mysqld] general_log = ON general_log_file = /var/log/mysql/general/general.log
在线临时开启(不用重启,重启失效,适合先验证):
SET GLOBAL general_log = ON; SET GLOBAL general_log_file = '/var/log/mysql/general/general.log';
3. 重启 MySQL 服务
systemctl restart mysqld
4. 验证 general_log 状态
登录 mysql 执行:
SHOW VARIABLES LIKE 'general_log%';
预期返回:
general_log | ON general_log_file | /var/log/mysql/general/general.log
同时检查日志文件是否生成:
ls -l /var/log/mysql/general/general.log
5. 配置 logrotate 日志轮转(满足留存 180 天)
新建轮转配置文件 /etc/logrotate.d/mysql-general
/var/log/mysql/general/general.log {
daily
rotate 180
missingok
notifempty
compress
delaycompress
create 0600 mysql mysql
sharedscripts
postrotate
mysql -e "FLUSH LOGS;"
endscript
}参数说明:
daily:按天切割rotate 180:保留最近 180 份日志,自动删除超期,满足 180 天留存compress:压缩旧日志节省磁盘postrotate FLUSH LOGS:通知 mysql 重新打开日志句柄
6. 校验 logrotate 配置
# 调试模式(只打印,不执行切割) logrotate -d /etc/logrotate.d/mysql-general # 手动强制切割测试(验证功能) logrotate -v /etc/logrotate.d/mysql-general
7. 确认定时任务
logrotate 默认由系统 cron 每日自动执行,无需额外配置定时; 查看系统定时:cat /etc/cron.daily/logrotate
整改佐证材料(给审计用)
show variables like 'general_log%';结果截图(状态 ON)/etc/my.cnf配置截图/etc/logrotate.d/mysql-general配置截图logrotate -d 调试输出截图
日志目录文件列表截图(证明日志持续生成)