MySQL5.7限制general_log日志大小的实现
作者:高达可以过山车不行
MySQL5.7.41中为避免通用查询日志general_log快速增长占用硬盘空间,可以通过定时任务执行脚本进行每日备份或清理,从而限制其大小,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
背景
需求:
- 在MySQL 5.7.41中开启
general_log
并限制其大小,避免快速增长占用硬盘空间。
解决:
- 通过定时任务,执行简单的脚本,判断
general_log
日志的大小,实现对通用查询日志的“每日备份”或“每日清理”的功能。
多说几句:
- 等保二级要求必须开启MySQL数据库的通用查询日志
general_log
,但其文件大小增长速度太快,数据库有效数据都还没增长多少,硬盘空间可能就会被general_log
日志占用不少。而binog
至少还能通过binlog_expire_logs_seconds
过期时间参数设置日志保存策略,避免占用空间。没有这样的参数限制general_log
,必然要通过其它手段限制general_log
空间。
实际操作:备份脚本和清理脚本
提供两种思路:
- 思路一:每日检查日志大小,当其超过某个阈值时,将文件复制归档到某个专门存储日志的目录。
- 思路二:每日检查日志大小,当超过某个阈值时,不执行归档备份,直接将
general_log
内容清除。
MySQL中开启general日志需要修改my.cnf文件,增加以下两行指定日志存储路径:
[mysqld] general_log = 1 general_log_file = /mnt/general.log
思路一:每日备份日志
参考脚本 bak_general_log.sh
#!/bin/bash LOG_FILE="/mnt/general.log" MAX_SIZE=100 if [ -f "$LOG_FILE" ]; then CURRENT_SIZE=$(du -m "$LOG_FILE" | awk '{print $1}') if [ "$CURRENT_SIZE" -gt "$MAX_SIZE" ]; then mv "$LOG_FILE" "$LOG_FILE.$(date +%Y%m%d%H%M%S)" touch "$LOG_FILE" chmod 0640 "$LOG_FILE" chown mysql:mysql "$LOG_FILE" systemctl restart mysql fi fi
思路二:每日清空日志
参考脚本 clear_general_log.sh
#!/bin/bash LOG_FILE="/mnt/general.log" MAX_SIZE=100 if [ -f "$LOG_FILE" ]; then CURRENT_SIZE=$(du -m "$LOG_FILE" | awk '{print $1}') if [ "$CURRENT_SIZE" -gt "$MAX_SIZE" ]; then echo > "$LOG_FILE" fi fi
快速验证脚本的方法:dd创建日志文件
- 用dd命令快速生成指定大小的文件,比如生成101MB大小的
/mnt/general.log
文件,可以执行以下命令:
dd if=/dev/zero of=/mnt/general.log bs=1M count=101
- 执行之前准备的脚本文件,查看结果。
参考截图
实际操作:配置corntab定时任务
给脚本配置可执行权限:
chmod +x bak_general_log.sh chmod +x clear_general_log.sh
使用cron等工具将脚本定期执行,例如每天凌晨执行一次:
crontab -e
然后在编辑器中添加以下内容:
0 0 * * * /mnt/bak_general_log.sh 0 0 * * * /mnt/clear_general_log.sh
上述脚本二选一即可。
结束
注意:
- 备份脚本中没有指定备份目录。
- 备份脚本中涉及了MySQL应用重启。
- 备份脚本的具体内容可根据实际情况修改。
到此这篇关于MySQL5.7限制general_log日志大小的文章就介绍到这了,更多相关MySQL5.7限制general_log日志内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!