当前位置: 代码网 > it编程>数据库>Mysql > 用logrotate归档MySQL日志的实现

用logrotate归档MySQL日志的实现

2025年09月24日 Mysql 我要评论
背景前面说过因为vim大文件导致的oom,所以后续优化方案里面写了要对mysql的日志进行归档操作。经过调研,一般两种方案实现:1使用脚本crontab去清理备份归档2使用logrotate配置进行去

背景

前面说过因为vim大文件导致的oom,所以后续优化方案里面写了要对mysql的日志进行归档操作。
经过调研,一般两种方案实现:
1使用脚本crontab去清理备份归档
2使用logrotate配置进行去清理归档
我这里主要介绍第二种方案,因为比较通用,可以清理各种日志

logrotate简介

logrotate是专门用来归档处理各种服务产生的日志

具有以下特点:

 1. 支持对日志自动进行归档压缩
 2. 支持对日志进行按天或者按周,月年等多维度进行归档
 3. 可以设置保留的时间,根据个数实现
 4. 支持归档操作进行邮件告知

使用方式

安装方式
一般系统都会自带的,没有的话yum install logrotate

常用参数:

daily                        每天进行切换
weekly                        每周进行切换
rotate num                    保留num份归档日志文件
olddir                        指定归档的目录
missingok                    如不存在该文件也不报错且进入下一轮
size                        大于这个大小,才会进行归档,否则忽略,单位是bytes
dateext                        对归档的日志文件增加日期后缀,默认格式'%y%m%d'
create                         创建一个新的文件(与copy copytruncate互斥)
copy                        将原文件的内容拷贝一份,不清理源文件内容
copytruncate                将原文件拷贝一份,然后清空源文件内容
mail                        rotate的时候邮件告知
notifempty                    如果日志文件为空,不会进行日志归档切换
compress                    对归档的日志进行压缩,默认用gzip压缩,文件名以'.gz结尾'

工作原理

#1.默认会安装在/etc/目录下
$ ls -l /etc/logrotate.
logrotate.conf   这是默认读取配置文件一般不要去动
logrotate.d/     默认读取配置文件会去读这个目录下的清理配置,优先级是先看目录下面的参数,
如果没有的话就以logrotate.conf文件中的参数为准

#2.logrotate.conf文件内容
$ cat /etc/logrotate.conf |grep include
include /etc/logrotate.d    可以看到会包含这个目录

#3.logrotate.d目录下的内容,
开始说过,logrotate是用来清理服务日志的,所以可以看到下面的
所以下面都是每个服务都会有一个默认的清理规则
$ ls -l /etc/logrotate.d:
总用量 40
-rw-r--r--  1 root root   91 9月  30 2020 bootlog
-rw-r-----  1 root root  144 2月  23 2021 falcon-sensor
-rw-r--r--  1 root root  194 11月 16 2020 httpd
-rw-r--r--  1 root root 1938 3月  14 18:46 mysql
-rw-r--r--  1 root root  203 4月   1 2020 php-fpm
-rw-r--r--  1 root root   88 4月  28 2021 subscription-manager
-rw-r--r--  1 root root  224 12月 31 2015 syslog
-rw-r--r--. 1 root root  100 10月 31 2018 wpa_supplicant
-rw-r--r--  1 root root  103 10月  2 2020 yum
-rw-r--r--  1 root root  132 6月  28 2021 zabbix-agent

#4.如何调用?
分为两步:
第一步是/etc/cron.daily/下面的一个crontab,每天会自动运行一次
$ ls -l /etc/cron.daily/
-rwx------. 1 root root 219 4月   1 2020 logrotate

第二步在/etc/anacrontab 里面会每天3点22分调用etc/cron.daily的cron任务
$ cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# see anacron(8) and anacrontab(5) for details.

shell=/bin/sh
path=/sbin:/bin:/usr/sbin:/usr/bin
mailto=root
# the maximal random delay added to the base delay of the jobs
random_delay=45
# the jobs will be started during the following hours only
start_hours_range=3-22

#period in days   delay in minutes   job-identifier   command
1	5	cron.daily		nice run-parts /etc/cron.daily
7	25	cron.weekly		nice run-parts /etc/cron.weekly
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly

mysql配置logrotate

首先,第一个问题,对于mysql日志新文件的生成方式如何选择?
copy vs copytruncate vs create

我的建议是使用copytruncate
在介绍三种方案之前,先介绍一下inode
inode简单讲就是识别物理文件的唯一文件号。
所以三个的流程就如下:

#create
1.先重命名源文件,这时候mv后的文件的inode不会变化,假设此时inode为1。
2.创建一个新的原来文件的名字,这时是一个新的inode,假设这时为2
3.如果不重启,因为当前服务写的还是inode为1的文件,所以不会写入到新文件,
只有重启服务后才会写入新的文件(inode为2的文件)

#copy
1.拷贝源文件的内容到新文件,不清空文件
2.会导致源文件一直变大,不符合我们mysql的要求

#copytruncate
1.拷贝源文件的内容到新文件,假设源文件inode为1,此时新文件就会变成2
2.truncate 源文件的内容
3.服务继续写inode为1的文件,不需要重启服务

综上,考虑我们还有filebeat会去采集slow log,所以inode必须不能变化,数据库服务也不可能说重启就重启,所以最好的选择就是copytruncate模式
最终的文件内容如下:

$ cat /etc/logrotate.d/mysql
/data/logs/mysql-error.log
{
    weekly
    rotate 2
    missingok
    dateext
    size 2g
    copytruncate
    notifempty
    compress
}

简单介绍下,就是每周进行归档,保留最近两周的数据,而且是文件大于2g的时候才会进行操作。

最后

这里只是对mysql日志进行归档,当然大家想要对其他日志进行归档的话,也是可以直接使用的,只要是日志都可以通过这种方式去实现。

到此这篇关于用logrotate归档mysql日志的实现的文章就介绍到这了,更多相关logrotate归档mysql日志内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com