You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在CentOS 7上配置MariaDB实现每日生成新queries.log日志文件?

解决MariaDB查询日志每日轮转的方案(CentOS7)

嘿,我刚好处理过类似的场景,针对你遇到的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

火山引擎 最新活动