%PDF- %PDF-
Direktori : /etc/ansible/roles/mysql/library/ |
Current File : //etc/ansible/roles/mysql/library/bx_slave |
#!/bin/bash # -- stop slave IO process # -- wait when slave process reads all relay logs # -- reset slave, reset master # -- return master info # Options: # src = ip address or socket # login|password or /root/.my.cnf #set -x DEFAULT_CONF=/root/.my.cnf # can set login and password from file DEFAULT_CONF_USAGE=0 BASE_DIR=/opt/webdir LOGDIR=$BASE_DIR/logs [[ ! -d $LOGDIR ]] && mkdir -m 750 $LOGDIR LOG_FILE=$LOGDIR/reset_slave.log #CACHE_DIR=$BASE_DIR/tmp #[[ ! -d $CACHE_DIR ]] && mkdir -p -m 700 $CACHE_DIR #CACHE_FILE=(mktemp $CACHE_DIR/.reset_slaveXXXXXX) save_log(){ message=$1 printf "%-15s: [%s] %s\n" "$(date +%Y/%m/%d:%H:%M:%S)" "$$" "$message" >> $LOG_FILE } print_good(){ local msg="${1}" local changed="${2:-true}" save_log "$msg" echo "{\"changed\": $changed, \"msg\": \"$msg\"}" # [[ -f $CACHE_FILE ]] && rm -f $CACHE_FILE exit } print_error(){ local msg="${1}" save_log "$msg" echo "{\"changed\": false, \"failed\": true, \"msg\": \"$msg\"}" # [[ -f $CACHE_FILE ]] && rm -f $CACHE_FILE exit 1 } # test mandatory option and print error if not exists test_variables() { for desc in "src=$src" "login=$login" "password=$password"; do var=$(echo $desc | cut -d'=' -f1) val=$(echo $desc | cut -d'=' -f2) if [[ -z "$val" ]]; then # test if login and password needed variables if [[ ( "$var" == "login" ) || ( "$var" == "password" ) ]]; then if [[ ! -f "$DEFAULT_CONF" ]]; then print_error "option $var= is mandatory, you must define it or create $DEFAULT_CONF file" fi DEFAULT_CONF_USAGE=1 else print_error "option $var= is mandatory, you must define it or create $DEFAULT_CONF file" fi fi done } reset_slave(){ save_log "start process resetting slave" if [[ $DEFAULT_CONF_USAGE -eq 1 ]]; then src_mysql_cmd="mysql --defaults-file=$DEFAULT_CONF" save_log " usage default config $DEFAULT_CONF" else src_mysql_cmd="mysql --user=$login --password=$password" save_log " usage login and password" fi if [[ $(echo $src | grep -c '^/') -gt 0 ]]; then src_mysql_cmd=$src_mysql_cmd" --socket=$src" else host= port=3306 if [[ $(echo "$src" | grep -c ':') -gt 0 ]]; then host=$(echo "$src" | awk -F':' '{print $1}') port=$(echo "$src" | awk -F':' '{print $2}') else host=$src fi src_mysql_cmd=$src_mysql_cmd" --host=$host --port=$port" fi # show slave status Slave_IO_Running=$($src_mysql_cmd -e "show slave status \G" | \ awk -F':' '/Slave_IO_Running:/{print $2}' | sed -e 's/^\s\+//;s/\s\+$//;') Slave_SQL_Running=$($src_mysql_cmd -e "show slave status \G" | \ awk -F':' '/Slave_SQL_Running:/{print $2}' | sed -e 's/^\s\+//;s/\s\+$//;') save_log " Slave_SQL_Running=$Slave_SQL_Running Slave_IO_Running=$Slave_IO_Running" if [[ $Slave_SQL_Running != "Yes" ]]; then print_error "Slave is not configured on mysql server=$src" fi # wait until slave is ready for master Seconds_Behind_Master=1 while [[ $Seconds_Behind_Master -gt 0 ]]; do sleep 5; save_log " waiting Seconds_Behind_Master=$Seconds_Behind_Master" Seconds_Behind_Master=$($src_mysql_cmd -e "show slave status \G" | \ awk -F':' '/Seconds_Behind_Master/{print $2}' | sed -e 's/^\s\+//;s/\s\+$//;') done # stop slave $src_mysql_cmd -e "stop slave IO_THREAD;" 1>/dev/null 2>&1 [[ $? -gt 0 ]] && \ print_error "Slave stop is failed" save_log " stop IP thread on server=$src" # reset slave and master info $src_mysql_cmd -e "stop slave; reset master;" 1>/dev/null 2>&1 [[ $? -gt 0 ]] && \ print_error "Slave stop is failed" save_log "reset master status on server=$src" print_good "deleting slave configuration on server=$src is complete" } # get options from file source ${1} test_variables reset_slave