Your IP : 18.222.24.153


Current Path : /proc/9785/cwd/etc/ansible/roles/mysql/library/
Upload File :
Current File : //proc/9785/cwd/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