【MySQL】用logrotate归档MySQL日志

背景

前面说过因为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日志进行归档,当然大家想要对其他日志进行归档的话,也是可以直接使用的,只要是日志都可以通过这种方式去实现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渔不是鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值