MariaDB 10.3如何限制general_log文件大小?已配置日志写入文件
嘿,刚好对MariaDB 10.3的通用日志这块熟,来给你捋清楚~
首先得明确:MariaDB 10.3本身没有像binlog那样,直接给general_log设置大小限制或自动过期的内置参数,没法通过my.cnf配置实现自动轮转或清理,得靠外部工具来搞定。下面给你几个靠谱的方案:
方案一:用系统自带的logrotate(最推荐)
Linux系统几乎都自带logrotate,专门用来管理日志文件轮转,比手动写crontab脚本更稳定。
配置步骤:
创建logrotate配置文件:
sudo touch /etc/logrotate.d/mysql-general-log编辑这个文件,加入以下内容(可根据需求调整参数):
/var/log/mysql/mysql.log { daily # 每天轮转一次,也可设weekly/monthly rotate 7 # 保留最近7份轮转后的日志 compress # 旧日志自动压缩 missingok # 日志文件不存在时不报错 create 640 mysql mysql # 新建日志文件的权限和属主 postrotate # 通知MariaDB刷新日志,避免继续往旧文件写入 mysqladmin -uroot -p'你的数据库密码' flush-logs 2>/dev/null || true endscript }小提示:不想明文写密码的话,可以给root用户配置免密登录(比如在
~/.my.cnf里添加认证信息),或者用sudo mysqladmin flush-logs(确保mysqladmin有sudo权限)。测试配置是否生效:
sudo logrotate -v /etc/logrotate.d/mysql-general-log正常情况下会输出轮转过程的详细信息,无报错就说明配置没问题。logrotate会通过系统自带的定时任务每天自动执行。
方案二:用crontab自定义脚本
如果不想用logrotate,也可以自己写shell脚本,配合crontab定时执行。
示例脚本(命名为rotate_mysql_general_log.sh):
#!/bin/bash LOG_FILE="/var/log/mysql/mysql.log" BACKUP_DIR="/var/log/mysql/archives" # 创建备份目录(不存在则新建) mkdir -p $BACKUP_DIR # 刷新日志,让MariaDB切换到新文件 mysqladmin -uroot -p'你的数据库密码' flush-logs # 按日期重命名并压缩旧日志 DATE=$(date +%Y%m%d_%H%M%S) mv $LOG_FILE $BACKUP_DIR/mysql_log_$DATE.log gzip $BACKUP_DIR/mysql_log_$DATE.log # 删除7天前的旧备份 find $BACKUP_DIR -name "mysql_log_*.log.gz" -mtime +7 -delete
给脚本添加执行权限:
chmod +x rotate_mysql_general_log.sh
最后在crontab里添加定时任务(比如每天凌晨2点执行):
crontab -e
加入一行:
0 2 * * * /path/to/rotate_mysql_general_log.sh
方案三:手动轮转(临时需求)
如果只是临时需要清理日志,不用长期自动化,可以手动执行以下操作:
先备份旧日志:
mv /var/log/mysql/mysql.log /var/log/mysql/mysql.log.$(date +%Y%m%d)
再通知MariaDB刷新日志,生成新的空日志文件:
mysqladmin -uroot -p flush-logs
或者登录MariaDB执行SQL命令:
FLUSH GENERAL LOG;
总结
优先选logrotate,它是系统级的成熟工具,能处理各种边缘情况(比如日志文件不存在、权限问题等),比自己写脚本省心。如果有特殊定制需求,再考虑自定义crontab脚本。
内容的提问来源于stack exchange,提问作者AntmadDG

