标签搜索

mysql_multi_instance_for_rocky9-mysql多实例脚本

lilymaxyz
2025-05-15 / 0 评论 / 21 阅读 / 正在检测是否收录...

mysql多实例脚本

#!/bin/bash
# *************************************
# * 功能: Shell脚本模板
# * 作者: 刘丹玉
# * 联系: v649352141@163.com
# * 版本: 2025-05-15
# *************************************

# 错误处理:如果命令执行失败,脚本将终止
set -e
# 调试处理
# set -x

MYSQL_6=mysql-5.6.50-linux-glibc2.12-x86_64
MYSQL_7=mysql-5.7.44-linux-glibc2.12-x86_64
MYSQL_8=mysql-8.4.0-linux-glibc2.28-x86_64
SINGLE_6=false
SINGLE_7=false
SINGLE_8=false
MORE_INSTANCE=false

# 颜色脚本,通用
color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}

# 查看属于Rocky、Ubuntu、openEuler系列
os_type () {
   awk -F'[ "]' '/^NAME/{print $2}' /etc/os-release
}

# 安装依赖
install_softs () {
  color "正在安装依赖环境" 0
  if [ "${MORE_INSTANCE}" == "true" ];then
    yum -y install libaio numactl-libs ncurses-compat-libs perl-Data-Dumper autoconf libaio perl-Sys-Hostname ncurses-compat-libs > /dev/null 2>&1
  elif [ "${SINGLE_6}" == "true" ];then
    yum install -y perl-Data-Dumper autoconf libaio  perl-Sys-Hostname ncurses-compat-libs > /dev/null 2>&1
  elif [ "${SINGLE_7}" == "true" ];then
    yum -y install libaio numactl-libs ncurses-compat-libs > /dev/null 2>&1
  elif [ "${SINGLE_8}" == "true" ];then
    yum -y install libaio numactl-libs ncurses-compat-libs > /dev/null 2>&1
  else
    exit 1
  fi
}

# 准备用户
add_user (){
  color "准备用户" 0
  groupadd -r mysql
  useradd -r -g mysql -s /sbin/nologin mysql
}

# 软件环境
prepare_install_package () {
  color "准备下载相关软件---请耐心等待" 0
  mkdir -p /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid,share}
  mkdir -p /data/softs
  cd /data/softs
  if [ "${SINGLE_6}" == "true" ];then
    wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_6}.tar.gz  > /dev/null 2>&1
    [ $? -ne 0 ] && { color "下载 ${MYSQL_6}.tar.gz 文件失败" 1; exit; }
    tar xf ${MYSQL_6}.tar.gz
    mv ${MYSQL_6} /usr/local/mysql3306
    chown -R mysql:mysql /usr/local/mysql3306
  fi

  if [ "${SINGLE_7}" == "true" ];then
    wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_7}.tar.gz  > /dev/null 2>&1
    [ $? -ne 0 ] && { color "下载 ${MYSQL_7}.tar.gz 文件失败" 1; exit; }
    tar xf ${MYSQL_7}.tar.gz
    mv ${MYSQL_7} /usr/local/mysql3307
    chown -R mysql:mysql /usr/local/mysql3307
  fi

  if [ "${SINGLE_8}" == "true" ];then
    wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_8}.tar.xz  > /dev/null 2>&1
    [ $? -ne 0 ] && { color "下载 ${MYSQL_8}.tar.xz 文件失败" 1; exit; }
    tar xf ${MYSQL_8}.tar.xz
    mv ${MYSQL_8} /usr/local/mysql3308
    chown -R mysql:mysql /usr/local/mysql3308
  fi

  if [ "${MORE_INSTANCE}" == "true" ];then
    wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_6}.tar.gz  > /dev/null 2>&1
    [ $? -ne 0 ] && { color "下载 ${MYSQL_6}.tar.gz 文件失败" 1; exit; }
    tar xf ${MYSQL_6}.tar.gz
    mv ${MYSQL_6} /usr/local/mysql3306

    wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_7}.tar.gz  > /dev/null 2>&1
    [ $? -ne 0 ] && { color "下载 ${MYSQL_7}.tar.gz 文件失败" 1; exit; }
    tar xf ${MYSQL_7}.tar.gz
    mv ${MYSQL_7} /usr/local/mysql3307

    wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_8}.tar.xz  > /dev/null 2>&1
    [ $? -ne 0 ] && { color "下载 ${MYSQL_8}.tar.xz 文件失败" 1; exit; }
    tar xf ${MYSQL_8}.tar.xz
    mv ${MYSQL_8} /usr/local/mysql3308

    chown -R mysql:mysql /usr/local/mysql3306
    chown -R mysql:mysql /usr/local/mysql3307
    chown -R mysql:mysql /usr/local/mysql3308
  fi

  chown -R mysql:mysql /mysql/
}


# 生成三个实例的初始数据
initialize_data_6(){
  if [ "${MORE_INSTANCE}" == "true" ];then
    echo 'PATH=/usr/local/mysql3306/bin:$PATH' > /etc/profile.d/mysql3306.sh
    source /etc/profile.d/mysql3306.sh
    /usr/local/mysql3306/scripts/mysql_install_db --basedir=/usr/local/mysql3306 --datadir=/mysql/3306/data > /dev/null 2>&1
    PATH="/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
  elif [ "${SINGLE_6}" == "true" ];then
    echo 'PATH=/usr/local/mysql3306/bin:$PATH' > /etc/profile.d/mysql3306.sh
    source /etc/profile.d/mysql3306.sh
    for i in 6 7 8
    do
      /usr/local/mysql3306/scripts/mysql_install_db --basedir=/usr/local/mysql3306 --datadir=/mysql/330$i/data > /dev/null 2>&1
    done
  else
    printf ""
  fi
}

initialize_data_7(){
  if [ "${MORE_INSTANCE}" == "true" ];then
    echo 'PATH=/usr/local/mysql3307/bin:$PATH' > /etc/profile.d/mysql3307.sh
    source /etc/profile.d/mysql3307.sh
    /usr/local/mysql3307/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql3307 --datadir=/mysql/3307/data > /dev/null 2>&1
    PATH="/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
  elif [ "${SINGLE_7}" == "true" ];then
    echo 'PATH=/usr/local/mysql3307/bin:$PATH' > /etc/profile.d/mysql3307.sh
    source /etc/profile.d/mysql3307.sh
    for i in 6 7 8
    do
      /usr/local/mysql3307/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql3307 --datadir=/mysql/330$i/data > /dev/null 2>&1
    done
  else
    printf ""
  fi
}

initialize_data_8(){
  if [ "${MORE_INSTANCE}" == "true" ];then
    echo 'PATH=/usr/local/mysql3308/bin:$PATH' > /etc/profile.d/mysql3308.sh
    source /etc/profile.d/mysql3308.sh
    /usr/local/mysql3308/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql3308 --datadir=/mysql/3308/data > /dev/null 2>&1
    PATH="/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
  elif [ "${SINGLE_8}" == "true" ];then
    echo 'PATH=/usr/local/mysql3308/bin:$PATH' > /etc/profile.d/mysql3308.sh
    source /etc/profile.d/mysql3308.sh
    for i in 6 7 8
    do
      /usr/local/mysql3308/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql3308 --datadir=/mysql/330$i/data > /dev/null 2>&1
    done
  else
    printf ""
  fi
}



# 创建主配置文件
configuration_file_6 (){
  if [ "${MORE_INSTANCE}" == "true" ];then
cat > /mysql/3306/etc/my.cnf <<-eof
[mysqld]
port=3306
user=mysql
socket = /mysql/3306/socket/mysql.sock
basedir = /usr/local/mysql3306
datadir = /mysql/3306/data
innodb_file_per_table=on
skip_name_resolve = on
symbolic-links=0

[client]
socket = /mysql/3306/socket/mysql.sock

[mysqld_safe]
pid-file = /mysql/3306/pid/mysqld.pid
log-error = /mysql/3306/log/error.log
eof
  elif [ "${SINGLE_6}" == "true" ];then
    for i in 6 7 8
    do
cat > /mysql/330$i/etc/my.cnf <<-eof
[mysqld]
port=330$i
user=mysql
socket = /mysql/330$i/socket/mysql.sock
basedir = /usr/local/mysql3306
datadir = /mysql/330$i/data
innodb_file_per_table=on
skip_name_resolve = on
symbolic-links=0

[client]
socket = /mysql/330$i/socket/mysql.sock

[mysqld_safe]
pid-file = /mysql/330$i/pid/mysqld.pid
log-error = /mysql/330$i/log/error.log
eof

    done
  else
    printf ""
  fi
}

configuration_file_7 (){
  if [ "${MORE_INSTANCE}" == "true" ];then
cat > /mysql/3307/etc/my.cnf <<-eof
[mysqld]
user=mysql
port=3307
socket = /mysql/3307/socket/mysql.sock
basedir = /usr/local/mysql3307
datadir = /mysql/3307/data
skip_name_resolve = 1
pid-file = /mysql/3307/pid/mysqld.pid
log-error = /mysql/3307/log/error.log
lc-messages-dir = /usr/local/mysql3307/share/english
lc-messages = en_US

[client]
socket = /mysql/3307/socket/mysql.sock
eof
  elif [ "${SINGLE_7}" == "true" ];then
    for i in 6 7 8
    do
cat > /mysql/330$i/etc/my.cnf <<-eof
[mysqld]
user=mysql
port=330$i
socket = /mysql/330$i/socket/mysql.sock
basedir = /usr/local/mysql3307
datadir = /mysql/330$i/data
skip_name_resolve = 1
pid-file = /mysql/330$i/pid/mysqld.pid
log-error = /mysql/330$i/log/error.log
lc-messages-dir = /usr/local/mysql330$i/share/english
lc-messages = en_US

[client]
socket = /mysql/330$i/socket/mysql.sock
eof
    done
  else
    printf ""
  fi
}

configuration_file_8 (){
  if [ "${MORE_INSTANCE}" == "true" ];then
cat > /mysql/3308/etc/my.cnf <<-eof
[mysql]
port = 3308
socket = /mysql/3308/socket/mysql.sock

[mysqld]
port = 3308
mysqlx_port = 33080
mysqlx_socket = /mysql/3308/socket/mysqlx.sock
basedir = /usr/local/mysql3308
datadir = /mysql/3308/data
socket = /mysql/3308/socket/mysql.sock
pid-file = /mysql/3308/pid/mysqld.pid
log-error = /mysql/3308/log/error.log
eof
  elif [ "${SINGLE_8}" == "true" ];then
    for i in 6 7 8
    do
cat > /mysql/330$i/etc/my.cnf <<-eof
[mysql]
port = 330$i
socket = /mysql/330$i/socket/mysql.sock

[mysqld]
port = 330$i
mysqlx_port = 330$i0
mysqlx_socket = /mysql/330$i/socket/mysqlx.sock
basedir = /usr/local/mysql3308
datadir = /mysql/330$i/data
socket = /mysql/330$i/socket/mysql.sock
pid-file = /mysql/330$i/pid/mysqld.pid
log-error = /mysql/330$i/log/error.log
eof
    done
  else
    printf ""
  fi
}

# 定制服务管理文件
systemctl_mysql(){
  color "定制服务管理文件" 0
  if [ "${MORE_INSTANCE}" == "true" ];then
  for i in 6 7 8
do
cat >/usr/lib/systemd/system/mysqld330$i.service<<EOF
[Unit]
Description=MySQL Community Server
Documentation=https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql330$i/bin/mysqld --defaults-file=/mysql/330$i/etc/my.cnf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE = 10000
EOF
done
  elif [ "${SINGLE_6}" == "true" ];then
  for i in 6 7 8
do
cat >/usr/lib/systemd/system/mysqld330$i.service<<EOF
[Unit]
Description=MySQL Community Server
Documentation=https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql3306/bin/mysqld --defaults-file=/mysql/330$i/etc/my.cnf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE = 10000
EOF
done
  elif [ "${SINGLE_7}" == "true" ];then
  for i in 6 7 8
do
cat >/usr/lib/systemd/system/mysqld330$i.service<<EOF
[Unit]
Description=MySQL Community Server
Documentation=https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql3307/bin/mysqld --defaults-file=/mysql/330$i/etc/my.cnf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE = 10000
EOF
done
  elif [ "${SINGLE_8}" == "true" ];then
  for i in 6 7 8
do
cat >/usr/lib/systemd/system/mysqld330$i.service<<EOF
[Unit]
Description=MySQL Community Server
Documentation=https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql3308/bin/mysqld --defaults-file=/mysql/330$i/etc/my.cnf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE = 10000
EOF
done
  else
    exit 1
  fi
}

# 启动服务
start_mysql(){
  color "开机服务自启" 0
  # 重载配置
  systemctl daemon-reload

  for i in 6 7 8
  do
    systemctl enable --now mysqld330$i > /dev/null 2>&1
  done
}

# 测试是否存活
test_success(){
  color "测试mysql是否启动" 0
  if [ "${MORE_INSTANCE}" == "true" ];then
    for i in 6 7 8
    do
      systemctl status mysqld330$i | grep active > /dev/null 2>&1
      if [ $? -eq  0 ];then
        color "330$i 启动成功" 0
      else
        color "330$i 启动失败" 2
      fi
    done
  elif [ "${SINGLE_6}" == "true" ];then
    for i in 6 7 8
    do
      systemctl status mysqld330$i | grep active > /dev/null 2>&1
      if [ $? -eq  0 ];then
        color "330$i 启动成功" 0
      else
        color "330$i 启动失败" 2
      fi
    done
  elif [ "${SINGLE_7}" == "true" ];then
    for i in 6 7 8
    do
      systemctl status mysqld330$i | grep active > /dev/null 2>&1
      if [ $? -eq  0 ];then
        color "330$i 启动成功" 0
      else
        color "330$i 启动失败" 2
      fi
    done
  elif [ "${SINGLE_8}" == "true" ];then
    for i in 6 7 8
    do
      systemctl status mysqld330$i | grep active > /dev/null 2>&1
      if [ $? -eq  0 ];then
        color "330$i 启动成功" 0
      else
        color "330$i 启动失败" 2
      fi
    done
  else
    exit 1
  fi

}

install_mysql (){

# 安装依赖
install_softs
# 准备用户
add_user
# 软件环境
prepare_install_package

# 生成三个实例的初始数据
chown -R mysql:mysql /mysql/
color "正在实例数据初始化" 0
initialize_data_6
initialize_data_7
initialize_data_8
chown -R mysql:mysql /mysql/
# 创建主配置文件
color "正在创建主配置文件" 0
configuration_file_6
configuration_file_7
configuration_file_8

# 定制服务管理文件
systemctl_mysql

# 启动服务
start_mysql
# 测试是否存活
test_success

}

# 用户选择函数
select_mysql_version() {
    echo "========================================="
    echo "       MySQL多实例安装选择菜单"
    echo "========================================="
    echo "请选择要安装的MySQL版本(可多选,用空格分隔):"
    echo "1) 单实例 MySQL 5.6(每个版本多个实例)"
    echo "2) 单实例 MySQL 5.7(每个版本多个实例)"
    echo "3) 单实例 MySQL 8.4(每个版本多个实例)"
    echo "4) 多实例 MySQL 5.6、5.7、8.4 多个版本 "
    echo "0) 退出"
    echo "-----------------------------------------"
    
    read -p "请输入选项编号: " choices
    
    # 重置选择变量
    SINGLE_6=false
    SINGLE_7=false
    SINGLE_8=false
    MORE_INSTANCE=false
    
    for choice in $choices; do
        case $choice in
            1) SINGLE_6=true ;;
            2) SINGLE_7=true ;;
            3) SINGLE_8=true ;;
            4) MORE_INSTANCE=true;;
            0) 
               echo "已取消安装,退出脚本。"
               exit 0
               ;;
            *) 
               echo "无效选项: $choice"
               select_mysql_version  # 递归重新选择
               return
               ;;
        esac
    done

    # 显示选择结果
    echo "-----------------------------------------"
    echo "已选择的配置:"
    [ "$SINGLE_6" = "true" ] && echo "- MySQL 5.6: 启用" || echo "- MySQL 5.6: 禁用"
    [ "$SINGLE_7" = "true" ] && echo "- MySQL 5.7: 启用" || echo "- MySQL 5.7: 禁用"
    [ "$SINGLE_8" = "true" ] && echo "- MySQL 8.4: 启用" || echo "- MySQL 8.4: 禁用"
    [ "$MORE_INSTANCE" = "true" ] && echo "- 安装类型: 多实例" || echo "- 安装类型: 单实例"
    echo "-----------------------------------------"
    
    read -p "确认安装此配置吗?(y/n): " confirm
    if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
        echo "已取消安装,退出脚本。"
        exit 0
    elif [ $(os_type) == "Rocky" ];then
        install_mysql
    else
        color "不支持 $os_type " 2
    fi
}

select_mysql_version

image-20250515192056449
image-20250515192123751

endl

0

评论

博主关闭了所有页面的评论