MySQL 日志定期备份与保留整改操作文档
一、整改背景
等保测评发现项:
问题描述: MySQL 数据库日志保留不满足 180 天,未定期进行备份。
控制要求: 应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等。
二、整改目标
- MySQL 日志(
log_bin、general_log、error.log)保存时间不少于 180 天; - 日志文件每日自动备份、轮转并压缩;
- 防止日志被意外删除或覆盖,满足等保安全审计要求。
三、MySQL 日志配置调整
编辑配置文件 /etc/my.cnf:
[mysqld]# 数据路径与 socket
datadir=/mnt/sdc/mysql
socket=/var/lib/mysql/mysql.sock# 端口与进程
port=3411
pid-file=/var/run/mysqld/mysqld.pid# 错误日志
log-error=/var/log/mysqld.log# 普通查询日志
general_log = ON
general_log_file = /mnt/sdc/mysql/general.log# 二进制日志(主从复制与数据变更记录)
log_bin = /mnt/sdc/mysql/binlog/mysql-bin
server-id = 1
binlog_format = ROW
expire_logs_days = 180 # 二进制日志自动保留 180 天
保存后执行:
systemctl restart mysqld
四、配置日志自动轮转与备份
创建 logrotate 配置文件 /etc/logrotate.d/mysql-logs:
/mnt/sdc/mysql/general.log {daily # 每天轮转一次rotate 180 # 保留180份(约180天)compress # 压缩旧日志delaycompress # 延迟一天再压缩missingoknotifemptycreate 640 mysql mysql # 设置新文件权限postrotate# 通知MySQL刷新日志mysql -uroot -p'你的root密码' -e "FLUSH GENERAL LOGS;"endscript
}/var/log/mysqld.log {dailyrotate 180compressdelaycompressmissingoknotifemptycreate 640 mysql mysql
}/mnt/sdc/mysql/binlog/mysql-bin.* {dailyrotate 180missingoknotifemptycompressdelaycompresscreate 640 mysql mysql
}
⚠️ 将
'你的root密码'替换为实际数据库密码。
五、验证 logrotate 配置
-
检查配置语法:
logrotate -d /etc/logrotate.conf输出无报错表示配置正常。
-
手动执行一次轮转测试:
logrotate -f /etc/logrotate.d/mysql-logs -
验证生成的备份文件:
ls -lh /mnt/sdc/mysql/ | grep general.log可看到类似:
general.log general.log-20251028.gz general.log-20251027.gz
六、防止日志被误删或篡改
-
设置日志目录权限:
chown -R mysql:mysql /mnt/sdc/mysql chmod 750 /mnt/sdc/mysql -
设置日志文件仅允许追加写入(防篡改):
chattr +a /mnt/sdc/mysql/general.log -
如需远程备份,可在
/etc/crontab增加:0 2 * * * rsync -az /mnt/sdc/mysql/*.gz backupuser@192.168.237.56:/backup/mysql_logs/
七、整改说明(可提交测评单位)
整改措施:
- 已启用 MySQL 二进制日志
log_bin并设置expire_logs_days=180,确保日志自动保留 180 天。- 已启用通用查询日志
general_log并通过logrotate实现每日自动轮转、压缩与归档。- 已将错误日志
/var/log/mysqld.log纳入轮转策略,设置保留 180 天。- 已为日志目录配置权限及追加保护,防止误删或篡改。
- 后续将定期检查备份有效性,确保审计日志完整、可追溯。
八、后续建议
- 每季度验证一次日志轮转与保留周期;
- 可在监控系统中加入日志大小监控,避免磁盘占满;
- 定期抽查日志文件内容,确保可正常追溯操作记录。