• MySQL 5.7限制general_log日志大小


    背景

    需求:

    • 在MySQL 5.7.41中开启general_log 并限制其大小,避免快速增长占用硬盘空间。

    解决:

    • 通过定时任务,执行简单的脚本,判断general_log 日志的大小,实现对通用查询日志的“每日备份”或“每日清理”的功能。

    多说几句:

    • 等保二级要求必须开启MySQL数据库的通用查询日志general_log ,但其文件大小增长速度太快,数据库有效数据都还没增长多少,硬盘空间可能就会被general_log 日志占用不少。而binog 至少还能通过binlog_expire_logs_seconds过期时间参数设置日志保存策略,避免占用空间。没有这样的参数限制general_log,必然要通过其它手段限制general_log空间。

    实际操作:备份脚本和清理脚本

    提供两种思路:

    1. 思路一:每日检查日志大小,当其超过某个阈值时,将文件复制归档到某个专门存储日志的目录。
    2. 思路二:每日检查日志大小,当超过某个阈值时,不执行归档备份,直接将general_log内容清除。

    MySQL中开启general日志需要修改my.cnf文件,增加以下两行指定日志存储路径:

    [mysqld]
    general_log = 1
    general_log_file = /mnt/general.log
    
    • 1
    • 2
    • 3

    思路一:每日备份日志

    参考脚本 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    思路二:每日清空日志

    参考脚本 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    快速验证脚本的方法:dd创建日志文件

    1. 用dd命令快速生成指定大小的文件,比如生成101MB大小的/mnt/general.log文件,可以执行以下命令:
    dd if=/dev/zero of=/mnt/general.log bs=1M count=101
    
    • 1
    1. 执行之前准备的脚本文件,查看结果。

    参考截图

    在这里插入图片描述

    实际操作:配置corntab定时任务

    给脚本配置可执行权限:

    chmod +x bak_general_log.sh
    chmod +x clear_general_log.sh
    
    • 1
    • 2

    使用cron等工具将脚本定期执行,例如每天凌晨执行一次:

    crontab -e
    
    • 1

    然后在编辑器中添加以下内容:

    0 0 * * * /mnt/bak_general_log.sh
    0 0 * * * /mnt/clear_general_log.sh
    
    • 1
    • 2

    上述脚本二选一即可。

    结束

    注意:

    1. 备份脚本中没有指定备份目录。
    2. 备份脚本中涉及了MySQL应用重启。
    3. 备份脚本的具体内容可根据实际情况修改。
  • 相关阅读:
    【shapely】自相交问题
    Flask学习笔记(七)
    MPI转以太网模块在施耐德Vijeo_Citect 中的配置方式
    你可能还不知道的CSS好用属性:clip-path
    rxjs Observable 自定义 Operator 的开发技巧
    大语言模型Ollama
    Service Mesh 解决问题
    我们能做出来数据库吗?
    科普-鸟哥私房菜中的“od -t oCc /etc/issue”的意思
    Unity动态创建Avatar骨骼映射
  • 原文地址:https://blog.csdn.net/weixin_43092290/article/details/134081543