背景
前面说过因为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日志内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论