• mysql数据库主从切换的两个脚本


    注意: 操作前需要修改对应的账号、密码、Ip地址信息,

    请一定要根据自己实际情况,谨慎执行操作。

    ChangeIpOneByOne.sh

    ### 修改本地从库为主库的操作####
    
    # 1、登录到本地的数据库(从库)上,根据不同端口需要执行多遍
        `which mysql` -uroot -p"123456" -P3306 -S /tmp/mysql3306.sock
    # 2、停止当前slave同步
        stop slave;
    # 3、重置当前的slave同步
        reset slave;
    # 4、修改当前库为读写状态
        set global read_only=0;
    # 5、查看主库状态
        show master status;
        记录下 File: mysqld-bin.000011  Position: 231
    # 6、配置主库的IP
        ifconfig bond1:1 192.168.1.159 up
    # 7、另一个从库上执行操作
        `which mysql` -uroot -p"123456" -P3306 -S /tmp/mysql3306.sock
    # 8、停止slave同步
        stop slave;
    # 9、重置slave同步
        reset slave;
    # 10、修改新的主库为新升级的库
        change master to master_host='192.168.1.159',master_port=3306,master_user='repl',master_password='Repl123456',MASTER_LOG_FILE='mysqld-bin.000011',MASTER_LOG_POS=231"
    # 11、查看同步状态
        show slave statusG;
    # 12、修改新主库上的配置文件
        sed -i "s/IPADDR=192.168.1.159/IPADDR=192.168.1.156/g" /etc/sysconfig/network-scripts/ifcfg-bond1
        sed -i "s/read_only = 1/read_only = 0/g" /etc/my3306.cnf
    
    ###  修改本地IP地址为从库的操作#####
    # 1、登录到本地的数据库(从库)上
    # 2、增加从库的Ip地址
        ifconfig bond1:1 192.168.1.159 up
        sed -i "s/IPADDR=192.168.1.159/IPADDR=192.168.1.156/g" /etc/sysconfig/network-scripts/ifcfg-bond1
    

    changeIP.sh

    #!/bin/bash
    set -o nounset 
    #数据库的端口
    PORTS=( 3306 3308 )
    PSW="123456"
    REPL_USER="repl"
    REPL_USER_PSW="repl123456"
    ANSIBLE_HOST_NAME="168"         #同 SLAVE_HOST_IP ,需要在/etc/ansible/hosts里配置
    #[root@t159 ~]# more /etc/ansible/hosts 
    #[168]
    #192.168.1.168
    
    #网卡配置文件
    NETWORKCONFIGFILE="/etc/sysconfig/network-scripts/ifcfg-eth1"
    #临时网卡
    TEMPNETNIC="eth1:1"
    
    ##############################################
    #                                            #
    #           配置修改开始                     #
    #                                            #
    ##############################################
    
    LOCAL_HOST_IP="192.168.1.156"   ##升级为主库的现有IP地址
    MASTER_HOST_IP='192.168.1.169'  ## 主库的IP地址
    SLAVE_HOST_IP="192.168.1.168"   ##原另一个从库的IP
    
    MYSQL_BIN=`which mysql`
    MYSQL_MASTER_BIN="${MYSQL_BIN} -uroot -p${PSW}"
    
    ##############################################
    #                                            #
    #           配置修改结束                     #
    #                                            #
    ##############################################
    
    
    # define restricted path
    PATH="/bin:/usr/bin:/sbin:/usr/sbin"
    # adirname - return absolute dirname of given file
    adirname() { odir=`pwd`; cd `dirname $1`; pwd; cd "${odir}"; }
    MYNAM=`basename "$0"`
    MYDIR=`adirname "$0"`
    MYLOG_PATH="${MYDIR}/logs"
    MYLOG="${MYLOG_PATH}/${MYNAM}_`date +%F`.log"
    for D in ${MYLOG_PATH}
    do
        if [ ! -d ${D} ] ; then
            mkdir -p ${D}
            echo -e "Mkdir ${D}" >> ${MYLOG}
        fi
    done
    
    # ---------
    # functions
    # ---------
    #日志函数
    function L(){
        message="$(date -d today +"%Y-%m-%d %H:%M:%S") - $1"
        echo -e "33[34m  $message 33[0m" && echo $message >> ${MYLOG}
    }
    
    #主库挂,从库升级为主库
    #1、将主库IP地址增加到从库上
    #2、停止slave同步
    #3、重看当前从库的pos和bin-logs记录
    #4、修改从库为读写状态
    #5、修改另一个从库来连接新的主库并查看同步状态
    
    #从库挂。另一个从库作为新的从库
    #1、将挂掉的从库IP地址增加到本地服务器上即可。
    
    #1、将主库IP地址增加到从库上
    function AddMasterIP(){
        #临时增加原masterIP地址到临时网卡上
        `which ifconfig` ${TEMPNETNIC} ${MASTER_HOST_IP} up
        L "ifconfig ${TEMPNETNIC} ${MASTER_HOST_IP} up"
        #修改网卡配置文件,但不重启(防止该服务器重启后临时IP地址丢失)
        sed -i "s/IPADDR=${LOCAL_HOST_IP}/IPADDR=${MASTER_HOST_IP}/g" ${NETWORKCONFIGFILE} 
        L "sed -i "s/IPADDR=${LOCAL_HOST_IP}/IPADDR=${MASTER_HOST_IP}/g" ${NETWORKCONFIGFILE}"
        NIP=`\`which ifconfig\` ${TEMPNETNIC}|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "`
        FIP=`cat ${NETWORKCONFIGFILE}|grep IPADDR|awk -F "=" '{print $2}'`
        if [ "${NIP}" != "${MASTER_HOST_IP}" ]&&[ "${NIP}" != "${FIP}" ];then
            L "${MASTER_HOST_IP} is error,exit1"
            exit 1
        fi
        L "该服务器上设置${MASTER_HOST_IP}成功.
          临时增加IP为${NIP},网卡配置文件为${FIP}"
        return 0
    }
    
    function StopSlave(){
        #2、停止当前slave同步
        ${MYSQL_MASTER_BIN} -e "stop slave"
        ${MYSQL_MASTER_BIN} -e "reset slave"
        L "${MYSQL_MASTER_BIN} -e "stop slave""
        SLAVESTATUS=`${MYSQL_MASTER_BIN} -e "show slave statusG"|grep "Slave_SQL_Running"|grep -v "State"|awk '{print $NF}'`
        L "${SLAVESTATUS} ${MYSQL_MASTER_BIN} -e "show slave statusG"|grep "Slave_SQL_Running"|grep -v "State"|awk '{print $NF}'"
        if [ "${SLAVESTATUS}" != "No" ];then
            L "当前db${IPORT}停止slave失败。"
            exit 1
        fi
        L "停止当前DB${IPORT}的slave同步成功"
        return 0
    }
    
    #function GetNewMasterLogFile(){
    #    #3、重看当前升级为主库的bin-logs记录
    #    #bin-logs记录
    #    Log_File=`${MYSQL_MASTER_BIN} -e "show master statusG"|egrep "File"|awk -F " " '{print $2}'`
    #    L "新的maser库${IPORT}的Log_File是${Log_File}"
    #    LogFile=${Log_File}
    #}
    function GetNewMasterPosNum(){
        #3、重看当前升级为主库的posnum记录
        #posnum
        Pos=`${MYSQL_MASTER_BIN} -e "show master statusG"|grep "Position"|awk -F " " '{print $2}'`
        L "新的master库${IPORT}的pos是${Pos}"
        return ${Pos}
    }
    
    function AlterReadOnlyStatus(){
        #4、修改当前库为读写状态
        ${MYSQL_MASTER_BIN} -e "set global read_only=0"
        #修改网卡配置文件,但不重启(防止该服务器重启后临时IP地址丢失)
        sed -i "s/read_only = 1/read_only = 0/g" /etc/my${IPORT}.cnf
        L "sed -i "s/read_only = 1/read_only = 0/g" /etc/my${IPORT}.cnf"
        ReadOnlyStatus=`${MYSQL_MASTER_BIN} -e "show variables like "read_only""|awk '{print $NF}'|sed -n '$p'`
        ReadOnlyConfig=`grep "read_only" /etc/my${IPORT}.cnf |awk '{print $NF}'`
        #echo "${ReadOnlyStatus}"
        if [ "${ReadOnlyStatus}" != "OFF" ] && [ "${ReadOnlyConfig}" != "0" ];then
            L "修改当前数据库${IPORT}的读写状态失败。"
            exit 1
        fi
        L "修改当前数据库${IPORT}的读写状态成功。"
        return 0
    }
    
    function AnsibleSlaveConnect(){
        #5、修改另一个从库来连接新的主库并查看同步状态
        ansible ${ANSIBLE_HOST_NAME} -m shell -a "${MYSQL_MASTER_BIN} -e "stop slave""
        L "另一个从库${IPORT}停止原主从同步成功"
        ansible ${ANSIBLE_HOST_NAME} -m shell -a "${MYSQL_MASTER_BIN} -e "reset slave""
        L "另一个从库${IPORT}重置原主从同步成功"
        ansible ${ANSIBLE_HOST_NAME} -m shell -a "${MYSQL_MASTER_BIN} -e "set global read_only=1""
        L "获取新主库${IPORT}的bin-logs记录"
        LogFile=`${MYSQL_MASTER_BIN} -e "show master statusG"|egrep "File"|awk -F " " '{print $2}'`
        L "获取新主库${IPORT}的Pos记录"
        GetNewMasterPosNum
        ansible ${ANSIBLE_HOST_NAME} -m shell -a "${MYSQL_MASTER_BIN} -e "change master to master_host='${MASTER_HOST_IP}',master_port=${IPORT},master_user='${REPL_USER}',master_password='${REPL_USER_PSW}',MASTER_LOG_FILE='${LogFile}',MASTER_LOG_POS=${Pos}""
        L "另一个从库${IPORT}指定新的主库"
        L "ansible ${ANSIBLE_HOST_NAME} -m shell -a "${MYSQL_MASTER_BIN} -e "change master to master_host='${MASTER_HOST_IP}',master_port=${IPORT},master_user='${REPL_USER}',master_password='${REPL_USER_PSW}',MASTER_LOG_FILE=${LogFile},MASTER_LOG_POS=${Pos}"""
        ansible ${ANSIBLE_HOST_NAME} -m shell -a "${MYSQL_MASTER_BIN} -e "start slave""
        L "另一个从库${IPORT}开启同步"
        SlaveRsyncIp=`ansible ${ANSIBLE_HOST_NAME} -m shell -a "${MYSQL_MASTER_BIN} -e "show slave statusG""|grep "Master_Host"|awk '{print $NF}'`
        L "ansible ${ANSIBLE_HOST_NAME} -m shell -a "${MYSQL_MASTER_BIN} -e "show slave statusG""|grep "Master_Host"|awk '{print $NF}'"
        L "SlaveRsyncIp ${SlaveRsyncIp} ,${MASTER_HOST_IP}"
        if [ "${SlaveRsyncIp}" != "${MASTER_HOST_IP}" ];then
            L "同步主库${IPORT}的IP错误"
            exit 1
        fi
        L "另一个从库${IPORT}配置完成,并开始同步"
        return 0
    }
    
    ##############################################
    #                                            #
    #           始设置本机为slave db             #
    #                                            #
    ##############################################
    
    function AddSlaveIP(){
        `which ifconfig` ${TEMPNETNIC} ${SLAVE_HOST_IP} up
        L "ifconfig eth1:1 ${SlaveIP} up"
        
        L "本地增加slave ip地址成功"
    }
    
    ##############################################
    #                                            #
    #           始设置本机为master db            #
    #                                            #
    ##############################################
    function MasterDB(){
        for IPORT in ${PORTS[@]}
        do
            MYSQL_MASTER_BIN="${MYSQL_BIN} -uroot -p${PSW} -P${IPORT} -S /tmp/mysql${IPORT}.sock"
            StopSlave
            if [ $? != 0 ];then
                L "停止${IPORT}的slave同步失败."
                exit 1
            fi 
            AlterReadOnlyStatus
            if [ $? != 0 ];then
                L "设置master${IPORT}库为读写库失败."
                exit 1
            fi 
            AddMasterIP
            if [ $? != 0 ];then
                L "增加临时IP或修改IP配置文件失败."
                exit 1
            fi 
            AnsibleSlaveConnect
            if [ $? != 0 ];then
                L "修改另一从库${IPORT}的master库为新的master库失败."
                exit 1
            fi 
        L "${IPORT}设置为新的主库完成!"
        done
    }
    
    ##############################################
    #                                            #
    #              开始执行脚本                    #
    #                                            #
    ##############################################
    
    function exec_continue(){
        read -p "Continue, Input your choice(m/s/b):" choice_user
        echo "Your choice: '${choice_user}'"
        echo " "
        if [ "m" == "${choice_user}" ];then
            MasterDB
        elif [ "s" == "${choice_user}" ];then
            AddSlaveIP
        else
            exit 1
        fi
    }
    
    exec_continue
    

      

  • 相关阅读:
    CoreText实现图文混排之点击事件
    iOS仿喜马拉雅FM做的毕业设计及总结(含新手福利源码)
    iOS---多线程实现方案一 (pthread、NSThread)
    iOS中navigationItem的titleView如何居中
    从 setNeedsLayout 说起
    精准化测试专业平台Paw:苹果APP应用代码质量的守护者
    Runtime实战之定制TabBarItem大小
    YYModel 源码历险记 代码结构
    10分钟搞定支付宝和微信支付 的 各种填坑
    如何写好一个UITableView
  • 原文地址:https://www.cnblogs.com/xzlive/p/15160200.html
Copyright © 2020-2023  润新知