天天看點

【工具】批量删除binlog 的腳本

  MySQL DBA 偶爾會遇到因為空間不足,在不能删除data之前,可能先想到的是通過删除binlog 暫時解決空間問題。周末本人也遇到這樣的情況,因為不在電腦旁邊,找上司出馬并且使用手機把指令打出發給老闆去删除binlog。想想還是寫一個binlog 删除工具吧,以後遇到此類問題,直接使用腳本工具合适。

delbinlog.sh

#!/bin/bash

##author [email protected]

#date 20160327

#delnums 是每次删除多少個,分批次删除。

#rest_num是要保留多少個binlog ,可以根據實際情況調整。

if [ $# -lt 4 ];then

   echo "Usage: $0  -p PORT -r res_nums"

   exit 1

fi

while getopts ":p:r:" arg

do

    case $arg in

        p)

          #echo "p's arg:$OPTARG"

          PORT=$OPTARG

          ;;

        r)

         #echo "d's arg:$OPTARG"

          res_nums=$OPTARG

        ?)  #當有不認識的選項的時候arg為?

          echo "unkonw argument"

          echo "Usage: $0  -p PORT -r res_nums"

          exit 1

    esac

done

if [ -S /srv/my_$PORT/mysqld.sock ]; then

   SOCKET="/srv/my_$PORT/mysqld.sock"

elif [ -S /srv/my$PORT/run/mysql.sock  ]; then

   SOCKET="/srv/my$PORT/run/mysql.sock"

MYSQL="mysql -uroot -S ${SOCKET} "

del_nums=3

logs_num=`$MYSQL -e "show master logs;" | wc -l `

echo "there are $logs_num binary logs .."

if [[ $res_nums -gt $logs_num ]];

then

  exit 0

while [[ $res_nums -lt $logs_num ]]; do

   del_to_binlog=`$MYSQL --skip-column-names -e "show master logs;"  | head -n $del_nums | awk 'END {print $1}'`

   $MYSQL -e "purge master logs to '$del_to_binlog' ;"

   echo "purge master logs to  $del_to_binlog ... "

   logs_num=`$MYSQL --skip-column-names -e "show master logs;" | wc -l `

   sleep 2

有需要的可以根據自己生産環境的實際情況,适當修改。