Saturday, 5 March 2016

Resume Replication OR Automatically Add New Server In Slave DB MySQL AWS CentOS



[root@server]# cat /home/sysuser/server_restart_script/resume_replication.sh
# Script to automate manual tasks after adding new server
# Script written on 07 May 2015
# cp /var/lib/mysql/auto.cnf /home/sysuser/server_restart_script/
# add ifconfig to change serverid of only new servers
# mysql -u root -p'dbpassword' dbname -e "show slave status \G" | grep -inr "Exec_Master_Log_Pos" |  awk '{print $3}' > /home/sysuser/server_restart_script/slave_position
# mysql -u root -p'dbpassword' dbname -e "show slave status \G" | grep -inr "Relay_Master_Log_File" |  awk '{print $3}' > /home/sysuser/server_restart_script/slave_file

cnf_dir=/etc
home_dir=/var/lib/mysql
auto_file=auto.cnf_bak
sh_file=/home/sysuser/server_restart_script
user=root
password='dbpassword'

# Below script is for 52.76.40.133
# Remove "!" from below condition
if ifconfig | grep "inet addr" | head -1 | grep "172.31.4.58"
then
        echo "This is Old Server"
else
        echo "This is new server"

        # ===================================================================================================
        service mysqld stop;

        # ===================================================================================================
        # Change Server ID ########### sed -i '23s/.*/server-id='$((RANDOM%200+9999))'/' $cnf_dir/my.cnf;
        sed -i '23s/.*/server-id='$(shuf -i 20000-65000 -n 1)'/' $cnf_dir/my.cnf;

        # ===================================================================================================
        # Change Server UUID
        if [[ ! -e "$home_dir/$auto_file" ]];   #if auto.cnf_bak not present then create auto.cnf_bak file
        then
                echo "$home_dir/$auto_file Not found.. Renaming $home_dir/auto.cnf to $auto_file .......... "
                mv $home_dir/auto.cnf $home_dir/auto.cnf_bak;
                echo $'\n'
        else     #else: directory already present then just assign a variable.
                echo $home_dir/"$auto_file found. Deleting this file"
                rm -f $home_dir/$auto_file
                mv $home_dir/auto.cnf $home_dir/$auto_file;
        fi
        # ===================================================================================================

        service mysqld start;
                service mysqld status > $sh_file/mysql_status;

                # Check if mysql is running
                if grep -q -i 'running...' $sh_file/mysql_status
                then
                        echo "MySQL Is Running !!!!"
                else
                        service mysqld start;
                fi

                # Check if replication is running
                mysql -u $user -p$password -v -v -v dbname -e "show slave status \G" | grep -inr "Slave_IO_Running" > $sh_file/repl_log
                mysql -u $user -p$password -v -v -v dbname -e "show slave status \G" | grep -inr "Slave_SQL_Running" >> $sh_file/repl_log

                if grep -q -i "No" head -4 $sh_file/repl_log
                then
                        # Get Master log file & Slave log position for replication to resume
                        mysql -u $user -p$password -v dbname -e "Stop Slave" ;

                        mysql -u $user -p$password dbname -e "show slave status \G" | grep -inr "Exec_Master_Log_Pos" |  awk '{print $3}' > $sh_file/slave_position;
                        mysql -u $user -p$password dbname -e "show slave status \G" | grep -inr "Relay_Master_Log_File" |  awk '{print $3}' > $sh_file/slave_file;

                        mysql -u $user -p$password -v dbname -e "Stop Slave" ;
                        mysql -u $user -p$password -v dbname -e "Reset Slave" ;

                        # mysql -u $user -p$password -v dbname -e "CHANGE MASTER TO MASTER_LOG_FILE='""$(cat /home/sysuser/server_restart_script/slave_file)""', MASTER_LOG_POS= " "$(cat /home/sysuser/server_restart_script/slave_position)" ;

                        # Create sql file with change master command
                        echo "CHANGE MASTER TO MASTER_LOG_FILE='""$(cat /home/sysuser/server_restart_script/slave_file)""', MASTER_LOG_POS= " "$(cat /home/sysuser/server_restart_script/slave_position);" > $sh_file/change_master.sql;

                        mysql -u $user -p$password dbname < $sh_file/change_master.sql;

                        mysql -u $user -p$password -v dbname -e "Start Slave" ;

                        # echo $'\n' "CHANGE MASTER TO MASTER_LOG_FILE='""$(cat /home/sysuser/server_restart_script/slave_file)""', MASTER_LOG_POS= " "$(cat /home/sysuser/server_restart_script/slave_position);"
                else
                        echo "Replication is running";
                fi

        # ===================================================================================================

fi



:wq



Now Setup Cron :

@reboot /bin/sh /home/sysuser/server_restart_script/resume_replication.sh >> /home/sysuser/server_restart_script/output_sync




No comments: