!/bin/bash

function isContinue()
{
read -p “Want to continue? (y or n)” ans
while true
do
if [ “X$ans” == “X” -o “$ans” != “y” -a “$ans” != “n” ]
then
read -p “Want to continue? (y or n)” ans
continue
else
break
fi
done
if [ $ans == “n” ]
then
exit 1
fi
}

if [ ! $1 ];
then
echo “PLEASE POINT A CONFIG FILE”;
exit 1;
fi

SCRIPT_NAME=readlink -f $0
SCRIPT_PATH=dirname ${SCRIPT_NAME}

if [ ! -e ${SCRIPT_PATH}/$1 ];
then
echo “THE CONFIG FILE IS NOT EXISTED”;
exit;
fi

source ${SCRIPT_PATH}/$1

echo “OLD_MASTER: “${OLD_MASTER}
echo “NEW_MASTER: “${NEW_MASTER}
echo “SLAVES_LIST: “${SLAVES_LIST}

ssh ${OLD_MASTER} “if [ ! -d ${OLD_MASTER_MYSQL_PATH} ];then echo \”THE MYSQL_PATH ON MASTER IS NOT EXIST,PLEASE INPUT ‘n’\”;fi”;
ssh ${NEW_MASTER} “if [ ! -d ${NEW_MASTER_MYSQL_PATH} ];then echo \”THE MYSQL_PATH ON MASTER IS NOT EXIST,PLEASE INPUT ‘n’\”;fi”;
for host in ${SLAVES_LIST};
do
ssh ${host} “if [ ! -d ${SLAVE_MYSQL_PATH} ];then echo \”THE MYSQL_PATH ON SLAVE IS NOT EXIST,PLEASE INPUT ‘n’\”;fi”;
done

isContinue

for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘stop slave;’”;
done

ssh ${NEW_MASTER} “${NEW_MASTER_MYSQL_PATH}/bin/mysql —defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e ‘stop slave;’”

sleep 1

MASTER_LOG_FILE=ssh ${OLD_MASTER} "${OLD_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${OLD_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show master status\G' | grep File | cut -d : -f 2 | tr -d '[:blank:]'"

for host in ${SLAVES_LIST};
do
slave_log_file=ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Relay_Master_Log_File | cut -d : -f 2 | tr -d '[:blank:]'";
if [ “${slave_log_file}” != “${MASTER_LOG_FILE}” ];
then
for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”;
done;
ssh ${NEW_MASTER} “${NEW_MASTER_MYSQL_PATH}/bin/mysql —defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”
echo “${NEW_MASTER} Relay_Master_Log_File: ${MASTER_LOG_FILE}”
echo “${host} Relay_Master_Log_File: ${slave_log_file}”
echo “THE BINLOG FILES ARE NOT THE SAME,PLEASE CHECK”
exit 1;
fi
done

slave_log_file=ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Relay_Master_Log_File | cut -d : -f 2 | tr -d '[:blank:]'";
if [ “${slave_log_file}” != “${MASTER_LOG_FILE}” ];
then
for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”;
done;
ssh ${NEW_MASTER} “${NEW_MASTER_MYSQL_PATH}/bin/mysql —defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”
echo “${NEW_MASTER} Relay_Master_Log_File: ${MASTER_LOG_FILE}”
echo “${host} Relay_Master_Log_File: ${slave_log_file}”
echo “THE BINLOG FILES ARE NOT THE SAME,PLEASE CHECK”
exit 1;
fi

MASTER_LOG_POS=ssh ${OLD_MASTER} "${OLD_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${OLD_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show master status\G' | grep Position | cut -d : -f 2 | tr -d '[:blank:]'"

for host in ${SLAVES_LIST};
do
slave_log_pos=ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Exec_Master_Log_Pos | cut -d : -f 2 | tr -d '[:blank:]'";
if [ “${slave_log_pos}” -gt “${MASTER_LOG_POS}” ];
then
for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”;
done;
ssh ${NEW_MASTER} “${NEW_MASTER_MYSQL_PATH}/bin/mysql —defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”
echo “${OLD_MASTER} Exec_Master_Log_Pos: ${MASTER_LOG_POS}”
echo “${host} Exec_Master_Log_Pos: ${slave_log_pos}”
echo “THE SLAVE’S LOG_POSITION IS GREATER THAN THE MASTER’S,PLEASE CHECK”
exit 1;
fi
done

slave_log_pos=ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Exec_Master_Log_Pos | cut -d : -f 2 | tr -d '[:blank:]'";
if [ “${slave_log_pos}” -gt “${MASTER_LOG_POS}” ];
then
for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”;
done;
ssh ${NEW_MASTER} “${NEW_MASTER_MYSQL_PATH}/bin/mysql —defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”
echo “${OLD_MASTER} Exec_Master_Log_Pos: ${MASTER_LOG_POS}”
echo “${NEW_MASTER} Exec_Master_Log_Pos: ${slave_log_pos}”
echo “THE SLAVE’S LOG_POSITION IS GREATER THAN THE MASTER’S,PLEASE CHECK”
exit 1;
fi

for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e \”start slave until master_log_file=’${MASTER_LOG_FILE}’,master_log_pos=${MASTER_LOG_POS}\””;
done
ssh ${NEW_MASTER} “${NEW_MASTER_MYSQL_PATH}/bin/mysql —defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e \”start slave until master_log_file=’${MASTER_LOG_FILE}’,master_log_pos=${MASTER_LOG_POS}\””;

sleep 1;

hosts=${SLAVES_LIST}

while true;
do
all_slaves_OK=1;
for host in ${hosts};
do
slave_log_pos=ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Exec_Master_Log_Pos | cut -d : -f 2 | tr -d '[:blank:]'";
if [ ${slave_log_pos} -ne ${MASTER_LOG_POS} ];
then
echo “${OLD_MASTER} Exec_Master_Log_Pos: ${MASTER_LOG_POS}”
echo “${host} Exec_Master_Log_Pos: ${slave_log_pos}”
all_slaves_OK=0;
break;
else
hosts=echo ${hosts} | sed "s/${host}//"
fi
done

  1. if [ ${all_slaves_OK} -eq 1 ];<br /> then<br /> slave_log_pos=`ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Exec_Master_Log_Pos | cut -d : -f 2 | tr -d '[:blank:]'";`<br /> if [ ${slave_log_pos} -ne ${MASTER_LOG_POS} ];<br /> then<br /> echo "${OLD_MASTER} Exec_Master_Log_Pos: ${MASTER_LOG_POS}"<br /> echo "${NEW_MASTER} Exec_Master_Log_Pos: ${slave_log_pos}"<br /> continue;<br /> fi<br /> echo "BEGIN TO CHANGE MASTER...";<br /> break;<br /> fi
  2. read -p "WANT TO CONTINUE ? (y OR n)" ans<br /> while true<br /> do<br /> if [ "X$ans" == "X" -o "$ans" != "y" -a "$ans" != "n" ]<br /> then<br /> read -p "Want to continue? (y or n)" ans<br /> continue<br /> else<br /> break<br /> fi<br /> done
  3. if [ $ans == "n" ]<br /> then<br /> for host in ${SLAVES_LIST};<br /> do<br /> ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'start slave;'";<br /> done;<br /> ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'start slave;'"<br /> exit 1<br /> fi<br />done

for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘stop slave;’”;
done

MASTER_LOG_FILE=ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Relay_Master_Log_File | cut -d : -f 2 | tr -d '[:blank:]'"
MASTER_LOG_POS=ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Exec_Master_Log_Pos | cut -d : -f 2 | tr -d '[:blank:]'"

MASTER_HOST=host ${OLD_MASTER} | awk '{print $4}'

CHANGE_SQL_ROLLBACK=”CHANGE MASTER TO MASTER_HOST=’${MASTER_HOST}’,MASTER_USER=’${MASTER_USER}’,MASTER_PASSWORD=’${MASTER_PASSWORD}’,MASTER_PORT=${MASTER_PORT},MASTER_LOG_FILE=’${MASTER_LOG_FILE}’,MASTER_LOG_POS=${MASTER_LOG_POS}”

echo ${NEW_MASTER}” Relay_Master_Log_File: “${MASTER_LOG_FILE}” Exec_Master_Log_Pos: “${MASTER_LOG_POS}

for host in ${SLAVES_LIST};
do
slave_log_file=ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Relay_Master_Log_File | cut -d : -f 2 | tr -d '[:blank:]'";
slave_log_pos=ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Exec_Master_Log_Pos | cut -d : -f 2 | tr -d '[:blank:]'";
echo ${host}” Relay_Master_Log_File: “${slave_log_file}” Exec_Master_Log_Pos: “${slave_log_pos};
done

MASTER_LOG_FILE=ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show master status\G' | grep File | cut -d : -f 2 | tr -d '[:blank:]'"
MASTER_LOG_POS=ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show master status\G' | grep Position | cut -d : -f 2 | tr -d '[:blank:]'"

echo ${NEW_MASTER}” MASTER_LOG_FILE: “${MASTER_LOG_FILE}” MASTER_LOG_POS: “${MASTER_LOG_POS}

MASTER_HOST=host ${NEW_MASTER} | awk '{print $4}'

CHANGE_SQL=”CHANGE MASTER TO MASTER_HOST=’${MASTER_HOST}’,MASTER_USER=’${MASTER_USER}’,MASTER_PASSWORD=’${MASTER_PASSWORD}’,MASTER_PORT=${MASTER_PORT},MASTER_LOG_FILE=’${MASTER_LOG_FILE}’,MASTER_LOG_POS=${MASTER_LOG_POS}”

echo ${CHANGE_SQL}

read -p “WANT TO CONTINUE ? (y OR n)” ans
while true
do
if [ “X$ans” == “X” -o “$ans” != “y” -a “$ans” != “n” ]
then
read -p “Want to continue? (y or n)” ans
continue
else
break
fi
done

if [ $ans == “n” ]
then
for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”;
done;
ssh ${NEW_MASTER} “${NEW_MASTER_MYSQL_PATH}/bin/mysql —defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”
exit 1
fi

for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e \”${CHANGE_SQL}\””;
done

for host in ${SLAVES_LIST};
do
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”;
done

sleep 1

FAILED_SLAVES=””
ALL_SLAVES_OK=1

for host in ${SLAVES_LIST};
do
io_running=ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Slave_IO_Running | cut -d : -f 2 | tr -d '[:blank:]'";
sql_running=ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Slave_SQL_Running | cut -d : -f 2 | tr -d '[:blank:]'";
echo ${host}” Slave_IO_Running: “${io_running}” Slave_IO_Running: “${sql_running};
if [ ${io_running} != “Yes” -o ${sql_running} != “Yes” ];
then
echo $CHANGE_SQL_ROLLBACK
echo “NOW WE WILL CHANGE THIS SLAVE BACK TO THE OLD MASTRE”
isContinue
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘stop slave;’”;
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e \”${CHANGE_SQL_ROLLBACK}\””;
ssh ${host} “${SLAVE_MYSQL_PATH}/bin/mysql —defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”;
sleep 1
io_running=ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Slave_IO_Running | cut -d : -f 2 | tr -d '[:blank:]'";
sql_running=ssh ${host} "${SLAVE_MYSQL_PATH}/bin/mysql --defaults-extra-file=${SLAVE_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Slave_SQL_Running | cut -d : -f 2 | tr -d '[:blank:]'";
echo “ROLLBACK RESULT: “${host}” Slave_IO_Running: “${io_running}” Slave_IO_Running: “${sql_running};
FAILED_SLAVES=”${FAILED_SLAVES} “${host};
ALL_SLAVES_OK=0
fi
done

if [ ${ALL_SLAVES_OK} -eq 1 ];
then
echo “ALL SLAVES CHANGED SUCCESSFUL”
else
echo “FAILED SLAVES ARE ${FAILED_SLAVES}”
fi

ssh ${NEW_MASTER} “${NEW_MASTER_MYSQL_PATH}/bin/mysql —defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e ‘start slave;’”;
sleep 1;
io_running=ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Slave_IO_Running | cut -d : -f 2 | tr -d '[:blank:]'";
sql_running=ssh ${NEW_MASTER} "${NEW_MASTER_MYSQL_PATH}/bin/mysql --defaults-extra-file=${NEW_MASTER_MYSQL_PATH}/etc/user.admin.cnf -e 'show slave status\G' | grep Slave_SQL_Running | cut -d : -f 2 | tr -d '[:blank:]'";
echo ${NEW_MASTER}” Slave_IO_Running: “${io_running}” Slave_IO_Running: “${sql_running};