MySQL DBA 偶爾會遇到因為空間不足,在不能刪除data之前,可能先想到的是通過刪除binlog 暫時解決空間問題。周末本人也遇到這樣的情況,因為不在電腦旁邊,找領導出馬并且使用手機把命令打出發(fā)給老板去刪除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" fi 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 fi 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 done logs_num=`$MYSQL -e "show master logs;" | wc -l ` echo "there are $logs_num binary logs .."