用logrotate歸檔MySQL日志的實(shí)現(xiàn)
背景
前面說過因?yàn)?code>vim大文件導(dǎo)致的OOM,所以后續(xù)優(yōu)化方案里面寫了要對(duì)MySQL的日志進(jìn)行歸檔操作。
經(jīng)過調(diào)研,一般兩種方案實(shí)現(xiàn):1使用腳本crontab去清理備份歸檔2使用logrotate配置進(jìn)行去清理歸檔
我這里主要介紹第二種方案,因?yàn)楸容^通用,可以清理各種日志
logrotate簡介
logrotate是專門用來歸檔處理各種服務(wù)產(chǎn)生的日志
具有以下特點(diǎn):
1. 支持對(duì)日志自動(dòng)進(jìn)行歸檔壓縮
2. 支持對(duì)日志進(jìn)行按天或者按周,月年等多維度進(jìn)行歸檔
3. 可以設(shè)置保留的時(shí)間,根據(jù)個(gè)數(shù)實(shí)現(xiàn)
4. 支持歸檔操作進(jìn)行郵件告知
使用方式
安裝方式
一般系統(tǒng)都會(huì)自帶的,沒有的話yum install logrotate
常用參數(shù):
daily 每天進(jìn)行切換
weekly 每周進(jìn)行切換
rotate num 保留num份歸檔日志文件
olddir 指定歸檔的目錄
missingok 如不存在該文件也不報(bào)錯(cuò)且進(jìn)入下一輪
size 大于這個(gè)大小,才會(huì)進(jìn)行歸檔,否則忽略,單位是bytes
dateext 對(duì)歸檔的日志文件增加日期后綴,默認(rèn)格式'%Y%m%d'
create 創(chuàng)建一個(gè)新的文件(與copy copytruncate互斥)
copy 將原文件的內(nèi)容拷貝一份,不清理源文件內(nèi)容
copytruncate 將原文件拷貝一份,然后清空源文件內(nèi)容
mail rotate的時(shí)候郵件告知
notifempty 如果日志文件為空,不會(huì)進(jìn)行日志歸檔切換
compress 對(duì)歸檔的日志進(jìn)行壓縮,默認(rèn)用gzip壓縮,文件名以'.gz結(jié)尾'
工作原理
#1.默認(rèn)會(huì)安裝在/etc/目錄下 $ ls -l /etc/logrotate. logrotate.conf 這是默認(rèn)讀取配置文件一般不要去動(dòng) logrotate.d/ 默認(rèn)讀取配置文件會(huì)去讀這個(gè)目錄下的清理配置,優(yōu)先級(jí)是先看目錄下面的參數(shù), 如果沒有的話就以logrotate.conf文件中的參數(shù)為準(zhǔn) #2.logrotate.conf文件內(nèi)容 $ cat /etc/logrotate.conf |grep include include /etc/logrotate.d 可以看到會(huì)包含這個(gè)目錄 #3.logrotate.d目錄下的內(nèi)容, 開始說過,logrotate是用來清理服務(wù)日志的,所以可以看到下面的 所以下面都是每個(gè)服務(wù)都會(huì)有一個(gè)默認(rèn)的清理規(guī)則 $ 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.如何調(diào)用? 分為兩步: 第一步是/etc/cron.daily/下面的一個(gè)crontab,每天會(huì)自動(dòng)運(yùn)行一次 $ ls -l /etc/cron.daily/ -rwx------. 1 root root 219 4月 1 2020 logrotate 第二步在/etc/anacrontab 里面會(huì)每天3點(diǎn)22分調(diào)用etc/cron.daily的cron任務(wù) $ 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
首先,第一個(gè)問題,對(duì)于MySQL日志新文件的生成方式如何選擇?
copy VS copytruncate VS create
我的建議是使用copytruncate
在介紹三種方案之前,先介紹一下inode
inode簡單講就是識(shí)別物理文件的唯一文件號(hào)。
所以三個(gè)的流程就如下:
#create 1.先重命名源文件,這時(shí)候mv后的文件的inode不會(huì)變化,假設(shè)此時(shí)inode為1。 2.創(chuàng)建一個(gè)新的原來文件的名字,這時(shí)是一個(gè)新的inode,假設(shè)這時(shí)為2 3.如果不重啟,因?yàn)楫?dāng)前服務(wù)寫的還是inode為1的文件,所以不會(huì)寫入到新文件, 只有重啟服務(wù)后才會(huì)寫入新的文件(inode為2的文件) #copy 1.拷貝源文件的內(nèi)容到新文件,不清空文件 2.會(huì)導(dǎo)致源文件一直變大,不符合我們MySQL的要求 #copytruncate 1.拷貝源文件的內(nèi)容到新文件,假設(shè)源文件inode為1,此時(shí)新文件就會(huì)變成2 2.truncate 源文件的內(nèi)容 3.服務(wù)繼續(xù)寫inode為1的文件,不需要重啟服務(wù)
綜上,考慮我們還有filebeat會(huì)去采集slow log,所以inode必須不能變化,數(shù)據(jù)庫服務(wù)也不可能說重啟就重啟,所以最好的選擇就是copytruncate模式
最終的文件內(nèi)容如下:
$ cat /etc/logrotate.d/mysql
/data/logs/mysql-error.log
{
weekly
rotate 2
missingok
dateext
size 2G
copytruncate
notifempty
compress
}
簡單介紹下,就是每周進(jìn)行歸檔,保留最近兩周的數(shù)據(jù),而且是文件大于2G的時(shí)候才會(huì)進(jìn)行操作。
最后
這里只是對(duì)MySQL日志進(jìn)行歸檔,當(dāng)然大家想要對(duì)其他日志進(jìn)行歸檔的話,也是可以直接使用的,只要是日志都可以通過這種方式去實(shí)現(xiàn)。
到此這篇關(guān)于用logrotate歸檔MySQL日志的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)logrotate歸檔MySQL日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
replace MYSQL字符替換函數(shù)sql語句分享(正則判斷)
最近更新網(wǎng)站發(fā)現(xiàn)一些字段的值不是預(yù)期的效果,需要替換下值,通過下面的sql語句,直接執(zhí)行就可以了2012-06-06
MySQL查看與修改當(dāng)前數(shù)據(jù)庫編碼的方法
這篇文章主要介紹了MySQL查看與修改當(dāng)前數(shù)據(jù)庫編碼的方法,需要的朋友可以參考下2016-04-04
MySQL中distinct和group by去重的區(qū)別解析
在MySQL中,我們經(jīng)常需要對(duì)查詢結(jié)果進(jìn)行去重,而DISTINCT和GROUP BY是實(shí)現(xiàn)這一功能的兩種常見方法,這篇文章主要介紹了MySQL中distinct和group by去重的區(qū)別,需要的朋友可以參考下2025-01-01
mysql?8.0.28?winx64.zip安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了mysql?8.0.28?winx64.zip安裝配置方法圖文教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
通用SQL存儲(chǔ)過程分頁以及asp.net后臺(tái)調(diào)用的方法
下面小編就為大家?guī)硪黄ㄓ肧QL存儲(chǔ)過程分頁以及asp.net后臺(tái)調(diào)用的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
MySQL中Decimal類型和Float Double的區(qū)別(詳解)
下面小編就為大家?guī)硪黄狹ySQL中Decimal類型和Float Double的區(qū)別(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03

