如何在CentOS 7上配置MariaDB实现每日生成新queries.log日志文件?
嘿,我刚好处理过类似的场景,针对你遇到的CentOS7上MariaDB queries.log 体积超4GB的问题,用系统自带的logrotate工具是最稳定可靠的方案,完全能实现你要的每日生成新日志、按queries-3132018.log格式命名的需求。下面是详细的操作步骤:
方法一:用logrotate(推荐)
logrotate是Linux系统默认的日志管理工具,自带日志切割、权限维护、旧日志清理等功能,比手动脚本省心太多。
1. 创建logrotate配置文件
在/etc/logrotate.d/目录下新建一个专门针对MariaDB查询日志的配置文件,比如命名为mariadb-queries:
vi /etc/logrotate.d/mariadb-queries
然后粘贴以下配置内容(注意根据你的实际情况调整参数):
/var/log/mariadb/queries.log { daily # 每日执行一次日志轮转 rotate 30 # 保留最近30天的旧日志,可按需修改 missingok # 如果日志文件不存在,不报错跳过 notifempty # 空日志文件不进行轮转 create 640 mysql mysql # 轮转后创建新日志,权限640,属主属组设为MariaDB运行用户mysql postrotate # 通知MariaDB刷新日志,切换到新的queries.log文件 # 这里推荐用socket连接避免明文密码,或者替换成你的root密码 /usr/bin/mysqladmin -S /var/lib/mysql/mysql.sock flush-logs endscript dateformat -%_m%d%Y # 日期格式:去掉前导零的月+日+年,比如3132018对应3月13日2018 extension .log # 确保旧日志后缀是.log,生成queries-3132018.log格式 }
参数说明:
- 如果你的MariaDB必须用密码连接,可以把
mysqladmin命令改成/usr/bin/mysqladmin -u root -p'你的数据库密码' flush-logs,但不建议在配置文件里明文写密码,优先用socket连接(默认socket路径是/var/lib/mysql/mysql.sock,如果你的不一样可以改)。 dateformat -%_m%d%Y里的%_m会去掉月份的前导零,比如3月就显示3而不是03,刚好匹配你给的示例格式;如果需要两位月份,改成%m即可。
2. 测试配置是否生效
手动执行一次logrotate来验证配置没问题:
logrotate -v /etc/logrotate.d/mariadb-queries
执行完后去/var/log/mariadb/目录看看,旧的queries.log应该已经被重命名为带日期后缀的文件,同时生成了新的空queries.log,MariaDB会自动把新的查询日志写入这个新文件。
3. 确认自动执行
CentOS7默认已经把logrotate加入了每日定时任务(在/etc/cron.daily/logrotate),所以不需要额外设置cron,每天凌晨系统会自动执行日志轮转。
方法二:手动脚本+cron(备选)
如果你不想用logrotate,也可以写个简单的shell脚本配合cron来实现:
1. 编写轮转脚本
创建脚本文件/usr/local/bin/rotate_mariadb_queries.sh:
#!/bin/bash LOG_DIR="/var/log/mariadb" LOG_FILE="queries.log" # 生成日期后缀:去掉前导零的月+日+年 DATE_SUFFIX=$(date +"%_m%d%Y") # 检查日志文件存在才执行操作 if [ -f "${LOG_DIR}/${LOG_FILE}" ]; then # 重命名旧日志 mv "${LOG_DIR}/${LOG_FILE}" "${LOG_DIR}/${LOG_FILE}-${DATE_SUFFIX}" # 刷新MariaDB日志,让它生成新的queries.log /usr/bin/mysqladmin -S /var/lib/mysql/mysql.sock flush-logs fi
2. 给脚本加执行权限
chmod +x /usr/local/bin/rotate_mariadb_queries.sh
3. 添加到cron每日执行
编辑cron任务:
crontab -e
写入以下内容,设置每天凌晨0点执行脚本:
0 0 * * * /usr/local/bin/rotate_mariadb_queries.sh
保存退出即可。
不过还是更推荐用logrotate,它能帮你自动清理超过保留天数的旧日志,还能确保新日志的权限正确,比手动脚本更省心。
内容的提问来源于stack exchange,提问作者Ryan Simmons




