一键安装Mysql主从数据库脚本

2021-11-01   


一键安装Mysql主从数据库脚本

写在前面:此脚本适用于已经安装好了mysql数据库,并将服务使用了systemd管理。

如果没有安装Mysql数据库,可以搭配上一篇写到的自动安装二进制mysql数据库SHELL脚本一起使用即可。Mysql二进制安装包可以去清华大学开源软件镜像站里下载自己需要的版本,版本选择在第15~24行。下面是shell脚本代码:

#!/bin/bash
# 一键配置MYSQL主从

# 信息提示函数
function loginfo(){
   if [ $? -eq 0 ];then
      echo -e "\e[32m[INFO][$(date +"%F %T")] $1 成功! \e[0m"
   else
      echo -e "\e[31m[ERROR][$(date +"%F %T")] $1 失败! \e[0m"
      echo -e "\e[31m因为配置失败,已为你退出脚本\e[0m"
      exit
   fi
}

<<注释
配置说明 :
修改主配置文件,开启binlog日志
指定server_id号,配置成和IP地址的主机位相同
指定binlog日志名,日志文件在/usr/local/mysql/data/目录下
server_id=2 
log_bin=master2
注释

echo -e "\e[33m本机所有网卡对应的IP如下所示\n`ifconfig | grep -A 1 '='`\e[0m"
read -p "请输入配置主从的网卡名 :" IFNAME
GET_MASTER_IP=`ifconfig $IFNAME | awk '{if($1=="inet"){print $2}}'`
MASTER_ID=${GET_MASTER_IP##*.}
sed -i "/mysqld/a server_id=$MASTER_ID \nlog_bin=master$MASTER_ID" /etc/my.cnf
# 提示信息
loginfo "配置主数据库的my.cnf文件"

# 重启mysql服务
systemctl restart mysqld.service
# 提示信息
loginfo "重启主数据库的MYSQL服务"

# 读取命令行的数据库密码
read -s -p "请输入主数据库密码 (密码不会显示): " MASTER_MYSQL_PASSWD 
# 读取命令行的授权用户、授权用户的密码
read -p "请输入授权用户 :" USER
read -s -p  "请输入授权用户的密码(密码不会显示) :" USER_PASSWD

result=`mysql -uroot -p$MASTER_MYSQL_PASSWD -e \
"grant replication slave on *.* to $USER@'%' identified by "$USER_PASSWD";
show master status;"
loginfo "配置主数据库授权用户"

#配置从服务器
#server_id=3
# 如果EOF加引号,即 <<'EOF' ,这样可以确保参数扩展发生在被远程的主机上,而不是本机上,
# 但是这样的弊端是不能使用本机的变量,因为ssh从数据库后需要进入到从数据库指定主数据库的信息,
# 所以下面不适用EOF加引号这种方式

# 获取主服务器binlog日志文件
MASTER_BINLOG=`echo $result | awk '{print $6}'` 
# 获取主服务器binlog日志偏移量
MASTER_BINLOG_OFFSET=`echo $result | awk '{print $NF}'`

# 获取需要配置多少台从数据库
while :
do
  read -p "请输入需要配置多少台从数据库(至少一台) :" SLAVE_AMOUNT
  if [[ ! $SLAVE_AMOUNT =~ ^[0-9]+$ ]];then
    echo "该值不是数字,请重新输入!" && continue 
  elif [ $SLAVE_AMOUNT -eq 0 ];then
    echo "该值不能为零,请重新输入!" && continue
  else
    exit
  fi
done
  echo

# 判读配置的从数据库数量,就调用函数获取从数据库IP和密码
function GET_SLAVE() {
# 获取远程配置从数据库
read -p "请输入要远程配置从数据库IP :" $1
# 获取从数据库的密码
read -s -p "请输入远程数据库的密码 :" $2
echo -e "\e[5;33m正在远程从数据库进行配置.......\e[0m"
}

function Config_SLAVE() {
   ssh -T root@$1 'bash -s' <<EOF
      
   if sed -i "/mysqld/a server_id=${1##*.}" /etc/my.cnf ;then
     echo -e "\e[36m配置从数据库的my.cnf文件成功~\e[0m"
   fi
   
   if systemctl restart mysqld.service ;then
    echo -e "\e[36m重启主数据库的MYSQL服务成功~\e[0m"
   fi
   
   if mysql -uroot -p$2 &> /dev/null <<SET
   change master to master_host="$GET_MASTER_IP", 
   master_USER="$USER",master_password="$USER_PASSWD",
   master_log_file="$MASTER_BINLOG",
   master_log_pos=$MASTER_BINLOG_OFFSET;
   start slave;
   SET
   then
     echo -e "\e[36m连接从数据库指定主数据库的信息,并启动从数据库成功~\033[0m"
   fi
   
   sleep 5
   
   echo -e "\e[36m正在查看从服务器的状态信息...\033[0m"
   mysql -uroot -p$2 <<SHOW
     show slave status\G;
   SHOW
   EOF
}

#做成函数 多从? 多个IP 多个从的密码
#比如说要配置3台从数据库,就要调用3次函数

# 假如 输入1 i=0 --> 0<1 执行一次--> i=1 --> 1<1 不成立 所以就执行一次
# 假如 输入2 i=0 --> 0<2 执行一次--> i=1 --> 1<2 执行一次 i=2
# 假如 输入3 i=0 --> 0<3 执行一次--> i=1 --> 1<3 执行一次 i=2 --> 2<3 执行一次
# 根据需要配置的从数据库数量,用循环调用获取从数据库的信息的函数
for ((i=0;i<$SLAVE_AMOUNT;i++)) do
   GET_SLAVE "SLAVE${i}_IP" "SLAVE${i}_MYSQL_PASSWD"
   eval slave_ip=$(echo \$SLAVE${i}_IP)
   # 测试输出读取的从数据库IP
   # echo $slave_ip
   eval slave_mysql_passwd=$(echo \$SLAVE${i}_MYSQL_PASSWD)
   # 测试输出读取的从数据库密码
   #echo $slave_mysql_passwd

   Config_SLAVE  $slave_ip  $slave_mysql_passwd
done

Q.E.D.