shell脚本实现Mysql主从数据库

当初为了方便配置主从数据库 写了shell脚本
也是边学边写 记录一下 但愿能不停地完善
具体流程可见上一篇:Mysql主从数据库配置
代码能够对照着上面这篇一块儿看 可能会比较好理解
我也尽可能多写注释 毕竟本身也会忘 (~ ̄▽ ̄)~ mysql


上代码web

#!/bin/bash
#source /home/alpha/shelltest/config.ini 直接导配置文件可能会方便一点 这里我就不改了
cat $1 | while read line
do
      #master side
      masterIp=$(echo $line |awk '{print $1}') #master ip地址
      masterSqlname=$(echo $line |awk '{print $2}') #master数据库用户名
      masterSqlpass=$(echo $line |awk '{print $3}') #master数据库密码
      slaveName=$(echo $line |awk '{print $4}') #master受权给slave远程登陆master数据库的用户名
      slavePass=$(echo $line |awk '{print $5}') #slave 登陆master时的密码
      slaveIp=$(echo $line |awk '{print $6}') #slave ip地址
      slaveSqlname=$(echo $line |awk '{print $7}') #slave 数据库用户名
      slaveSqlpass=$(echo $line |awk '{print $8}') #slave 数据库密码
      port=$(echo $line |awk '{print $9}') #端口号

      echo ${line}
      echo

     #在数据库中给slave登陆master数据库的权限
      grantCmd="grant replication slave on*.*to '${slaveName}'@'${slaveIp}' identified by '${slavePass}';"
      echo "grant cmd:" ${grantCmd}

    #在master的mysql数据库中执行grant操做
      remoteCmd="mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e \"${grantCmd}\""
      echo "remote cmd:" ${remoteCmd}

      mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e "${grantCmd}"

      if [ $? -eq 0 ]; then
          echo "exec: <grant replication slave...> success"
      else
          echo "exec: <grant replication slave...> failure"
          fi
      echo

     #查看master状态
      statusCmd="mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e \"show master status;\""
      echo "status cmd:" ${statusCmd}
      mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e "show master status;"
      if [ $? -eq 0 ]; then
          echo "exec: <show master status> success"
      else
          echo "exec: <show master status> failure"
      fi
      echo

     #查看master状态 获取file 以及position的信息
      bininfo=$(mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e "show master status;")
      file=$(echo $bininfo | awk '{print $5}')
      pos=$(echo $bininfo | awk '{print $6}')

      echo "bininfo:" $bininfo
      echo "file name:" $file
      echo "position:" $pos

     #查看master中mysql的登陆帐户信息
      queryCmd="mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e \"select Host, User, Password from mysql.user;\""
      echo "query cmd:" ${queryCmd}
      mysql -h${masterIp} -u${masterSqlname} -p${masterSqlpass} -e "select Host, User, Password from mysql.user;"
      if [ $? -eq 0 ]; then
          echo "exec: <select *from mysql.user> success"
      else
          echo "exec: <select *from mysql.user> failure"
      fi

      #slave side
      #首先确保slave中的mysql 中止slave 
      startCmd="mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e \"slave stop;\""
      echo "start cmd:"${startCmd}
      mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e "slave stop;"
      if [ $? -eq 0 ]; then
          echo "exec: <slave stop> success"
          echo
      else
          echo "exec: <slave stop> failure"
          echo
      fi

     #change master
      changeCmd="change master to MASTER_HOST='${masterIp}',MASTER_PORT=${port},MASTER_USER='${slaveName}',MASTER_PASSWORD='${slavePass}',MASTER_LOG_FILE='${file}',MASTER_LOG_POS=${pos};"
      echo "change cmd:" ${changeCmd}

    #登陆slave的mysql进行 change操做
      remoteCmd="mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e \"${changeCmd}\""
      echo "remote cmd:" ${remoteCmd}
      mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e "${changeCmd}"
      if [ $? -eq 0 ]; then
        echo "exec: <change master...> success"
        echo
      else
          echo "exec: <change master...> failure"
          echo
      fi
      echo

     #启动slave
      startcmd="mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e \"slave start;\""
      echo "start cmd:" ${startcmd}
      mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e "slave start;"
      if [ $? -eq 0 ]; then
          echo "exec: <slave start> success"
          echo
      else
          echo "exec: <slave start> failure"
          echo
      fi

     #查看slave状态
      statusCmd="mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e \"show slave status\G\""
      echo "status cmd:" ${statusCmd}
      mysql -h${slaveIp} -u${slaveSqlname} -p${slaveSqlpass} -e "show slave status\G"
      if [ $? -eq 0 ]; then
          echo "exec: <show slave status> success"
          echo
      else
          echo "exec: <show slave status> failure"
          echo
      fi

done


同时配一个configsql

masterip msqlname msqlpass slavename slavepass slaveip ssqlname ssqlpass 3306


若是是直接source导入的话会方便点 举个例子shell

masterIp=xxx.xxx.xxx.xxx
masterSqlname=alpha
masterSqlpass=alpha
slaveName=slavename
slavePass=slavepass
slaveIp=xxx.xxx.xxx.xxx
slaveSqlname=root
slaveSqlpass=root
port=3306

执行的话数据库

./master_slave.sh config

遇到的一些问题bash

  • 在master登陆mysql数据库的帐号必须有Grant_priv权限
    也就是说你登陆mysql的帐号是可以给其余帐号开权限的
    我由于用了mysql -hip地址 登陆 没有发现这样登陆没有权限
    因此须要在mysql的database中的user表里面对Grant_priv进行修改ide

  • 主从数据库同步前的内容须要一致
    这个问题是在网上看到的,但奇怪的是我同步以前在master中就有数据,可是并无报错。只是没有将这一部分数据同步到slave中,只有配置好以后在master中添加数据的操做才会同步到slave中。 没有找到是什么缘由致使svg

  • slave中的数据库若是以前已经启动了slave 须要先将slave stop
    这一点我已经在代码中添加,以前没有发现slave这台机子已经作过主从 因此直接change master 会报错学习

还有什么其余问题会继续添加
我也还在学习shell中
但愿可以多与你们交流
有什么问题也能够一块儿讨论
谢谢ui