MySQL DBA 偶尔会遇到因为空间不足,在不能删除data之前,可能先想到的是通过删除binlog 暂时解决空间问题。周末本人也遇到这样的情况,因为不在电脑旁边,找领导出马并且使用手机把命令打出发给老板去删除binlog。想想还是写一个binlog 删除工具吧,以后遇到此类问题,直接使用脚本工具合适。
delbinlog.sh #!/bin/bash ##author yangyi@youzan.com #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 .."