需求:
1、自動處理mysql bin日志腳本
2、輸出可讀log
3、保留1周的日志
4、對所有數據庫統一處理。
實現過程描述:
思路:兩種方式實現
1、mysql目錄通過ls獲取bin日志目錄並通過命令刪除。
2、通過mysql命令獲取bin日志,並通過命令刪除。
相比較來說第二種更加容易實現。
功能語句:
mysql -h192.168.1.2 -uroot -pXXXXX < /home/GC_Tools/housekeeping/mysql_bin_log/bin/Getlog.sql > /home/GC_Tools/housekeeping/mysql_bin_log/bin/templog.txt
以上命令輸出格式如下:
mysql-bin.001021 1073742032
mysql-bin.001022 1073742579
mysql-bin.001023 1073742818
mysql-bin.001024 1073741920
mysql-bin.001025 1073741915
mysql-bin.001026 790706635
第一列是日志名稱,第二列是日志大小。
以上是截取的一部分內容,我們需要的數據是倒數第七天的日志名稱。
通過mysql清理日志的命令去清理它之前的所有日志。
直接獲取倒數第七行的數據:
tac templog.txt | sed -n 7p | awk -F ' ' '{print $1}'
以下給出簡略版本,只實現功能:刪除指定數據庫的bin日志,保留七天日志。
#####################################
#!/bin/bash
TIME=`date +%Y%m%d%H%M%S`
BINPATH="/home/GC_Tools/housekeeping/mysql_bin_log"
SQLPARAM="mysql -h192.168.1.6 -uroot -pXXXXX"
echo $TIME "start clean" >> $BINPATH/log/clean.log
$SQLPARAM < $BINPATH/bin/Getlog.sql > templog.txt
BinLog=`tac templog.txt | sed -n 7p | awk -F ' ' '{print $1}'`
echo "Get the log's name is" \"$BinLog\" >>$BINPATH/log/clean.log
echo "purge binary logs to '$BinLog';" > temp.sql
$SQLPARAM < $BINPATH/bin/temp.sql >> $BINPATH/log/clean.log
#############################################
簡略版本完成,功能測試正常。
接下來需要實現功能:
1、部署路徑不要求,自適應。
2、讀取數據庫IP配置文件,並循環處理。
完整版本:
#!/bin/bash
#動態獲取腳本路徑
BINPATH=`pwd | sed -e 's/\/bin//'`
#獲取當前系統時間
TIME=`date +%Y%m%d%H%M%S`
#while do 循環處理配置文件
while read LINE
do
#輸出日志
echo $TIME >>$BINPATH/log/clean.log
echo $LINE >>$BINPATH/log/clean.log
#獲取數據庫ip
CHOST=`echo $LINE | awk -F ':' '{print $2}'`
#拼寫數據庫連接sql
SQLPARAM="mysql -h$CHOST -uroot -pXXXXX"
#查詢當前連接數據庫的日志信息列表
$SQLPARAM < $BINPATH/bin/Getlog.sql > templog.txt
#獲取倒數七天的日志名稱
BinLog=`tac templog.txt | sed -n 7p | awk -F ' ' '{print $1}'`
echo $Binog $BINPATH/log/clean.log
#拼寫清理日志sql,並保存在臨時文件
echo "purge binary logs to '$BinLog';" > temp.sql
#執行sql,清理mysql日志
$SQLPARAM < $BINPATH/bin/temp.sql >>$BINPATH/log/clean.log
rm -rf templog.txt
rm -rf temp.sql
#循環讀取配置文件內容
done<$BINPATH/etc/clean.conf
ps:配置文件實例
clean.conf
DB2:192.168.1.3
DB4:192.168.1.4
DB5:192.168.1.5
DB6:192.168.1.6
再再PS:
程序功能說明:
定期(每周六晚)清理mysql的binlog,保留七天的日志,其余日志刪除。
使用說明:
1、只需要在/etc配置文件內配置數據庫名稱與IP即可,不需要增加其他配置。
2、腳本本身沒有檢測數據庫是否連接正常的功能,默認連接正常,如果數據庫異常最好不要配置,不然會連接超時。
PS:寫完之後發現,mysql其實有相應的配置項可以設置binlog的數量,汗顏....,不過腳本的功能和邏輯是想通的,也不算是完全沒有價值和收獲,當然有些大神直接一行shell命令就可以解決這個需求,我目前還在努力向這個方向邁進。