Centos 6/7安装mysql8.0.19脚本(RPM包方式)

本文是基于此篇文章脚本基础之上的修改:https://www.cnblogs.com/abyn/p/12844689.html

公司同事使用我写的脚本说不能手动设置MySQL的数据目录,有的说mariadb内还有内容,稀里糊涂就卸载了,我心想有mariadb为什么还要有MySQL...,但是善良的我还是修改了相关内容,还有人说为什么压缩包只能放在/usr/local/src/下,我说你都用了我的脚本了,能不能让我舒服一点,因为我愿意放在这个目录!

下载MySQL压缩包详见:https://www.cnblogs.com/abyn/p/12844689.html

声明:此脚本最适合空环境,之前安装过MySQL可能会导致启动失败,但是我没测试,如果安装过mysql,yum装的用   yum remove mysql*  rpm装的用    rpm -e --nodeps `rpm -qa|grep mysql`   其他方式装的用: find / -name mysql  |xargs rm -rf 

声明:以上方法没有测试,不要在生产环境乱操作。

脚本内容: 

#!/bin/bash
echo '安装开始前请您详细阅读以下内容,否则可能会导致安装失败'
sleep 2
echo -e '此脚本安装MySQL-8.0版本MySQL \n如果您的系统版本使用CentOS 7 系统,所需安装包为mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar\n如果您的系统版本使用CentOS 6 系统,所需软件包为mysql-8.0.20-1.el6.x86_64.rpm-bundle.tar'
sleep 2
echo '安装开始前,请将压缩包放到/usr/local/src/目录,否则脚本不会继续运行'
sleep 5
#检测运行环境 非centos7系统不能运行此脚本
echo '正在检测运行环境...'
sleep 2
RHversion=`cat /etc/redhat-release |awk '{match($0,"release")
print substr($0,RSTART+RLENGTH)}'  | awk -F '.' '{print $1}'`
if [ $RHversion -eq 7 ];then        #判断当前用户是否为root,否则退出
    echo "您使用的系统版本为CentOS $RHversion"
    sleep 1
    #检测当前账户
    echo '正在检测用户是否为root'
    sleep 2
    user=${USER}
    if [ "$user" != root ];then
        echo "当前用户不为root,正在退出..."
        exit 1
    fi
    #卸载mariadb                    #判断用户输入yn确定是否卸载mariadb
    
    echo '请确定mariadb内是否有数据或确定是否需要使用mariadb' 
    sleep 2
    read -p "请输入是否需要卸载mariadb,[Yy/Nn]" yn
      case $yn in
        [Yy]*)
          rpm -e --nodeps `rpm -qa|grep mariadb`
          echo '正在卸载mariadb...'
          sleep 1
          echo '卸载成功';;
        [Nn]*)
          echo '正在退出...'
          sleep 1
          exit 1;;
        *) echo '输入错误'
      esac
    #sleep 2
    #echo '卸载完成'
    #检测libaio软件包
    echo '正在检测依赖环境...'            #检测当前环境是否有libaio
    libaio=`rpm -qa|grep libaio |wc -l`
    libaioverison=`rpm -qa|grep libaio|awk -F"-" '{print $1$2}'`
    if [ $libaio -eq 1 ];then
        echo "libaio版本为$libaioverison"
    else
        echo '没有找到libaio依赖包,正在尝试安装'
        yum install libaio -y
            if [ $? -eq 0 ];then
                echo "安装完成"
            else
                echo "安装失败,正在退出..."
                sleep 2
                exit 1
            fi
    fi
    #检测是否有mysql压缩包                     
    echo '检测是否有MySQL压缩包...'                    #判断安装文件是否在指定位置
    sleep 2
    if [ -f "/usr/local/src/mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar" ];then
        echo '文件存在'
        sleep 2
    else
        echo '您没有上传指定的MySQL压缩包或不在指定位置,文件上传位置为/usr/local/src/'
            exit 1
    fi
    echo '添加mysql账户...'                  #添加mysql账户
    if [ `grep 'mysql' /etc/passwd |wc -l ` -ge 1 ];then
        echo '用户已经存在'
    else
        groupadd mysql && useradd -r -g mysql -s /sbin/nologin -M mysql
        echo '用户添加成功'
    fi
    TAR_DIR=/usr/local/src/
    MYSQL_TAR='mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar'
    echo '开始安装MySQL,安装版本MySQL-8.0.19'
    sleep 1
    echo '正在解压...'
    cd $TAR_DIR && tar xf $TAR_DIR$MYSQL_TAR          #解压安装MySQL
    #安装MySQL
    echo '正在安装MySQL...'
    rpm -ivh mysql-community-common-8.0.19-1.el7.x86_64.rpm && rpm -ivh mysql-community-libs-8.0.19-1.el7.x86_64.rpm && rpm -ivh mysql-community-client-8.0.19-1.el7.x86_64.rpm  && rpm -ivh mysql-community-server-8.0.19-1.el7.x86_64.rpm --force --nodeps
    if [ $? -ne 0 ];then
        echo '安装异常,请检查是否安装过mysql,正在退出安装程序'
            exit 1
    fi
    #初始化MySQL
    echo '正在初始化MySQL...'
    mysqld --initialize 
    if [ $? -eq 0 ];then
        echo '初始化完成'
    else
        echo '初始化失败,请检查是否安装libaio依赖'
    fi
    #写入my.cnf
cat << EOF > /etc/my.cnf
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-name-resolve
default_password_lifetime=42  #密码默认42天过期
password_history=6 #存储最近的六次密码
password_reuse_interval=365 #最近六次密码一年内不得重复使用
EOF
def_data_dir=/usr/local/mysql/data               #MySQL数据目录默认路径
read -p "默认data目录为/usr/local/mysql/data,是否需要手动设置MySQL数据目录[yY/nN]" lastyn                      #根据用户输入yn判断数据库data目录位置
  case $lastyn in 
    [Yy]*)     #如果用户输入yY
        read -p "请输入data目录绝对路径,例/usr/local/mysql/data/,如果输入错误,请按Ctrl+Backspace(退格键):" mysql_data_dir_userset
          if [ ! -d $mysql_data_dir_userset ];then  #如果目录不存在则创建目录,修改目录属主为mysql.mysql,并修改my.cnf 
            echo "检测到目录不存在,正在创建目录..."
            mkdir -p $mysql_data_dir_userset
            if [ $? -eq 0 ];then
              echo "创建成功"
              sleep 1
            else 
              echo "创建失败,正在退出..."
            fi
          else                                      #如果目录存在,判断目录下是否有文件存在,如果存在则退出
           file_number_userset=`ls ${mysql_data_dir_userset} |wc -l`
             if [ $file_number_userset -ne 0 ];then         
               echo "检测该目录内存在文件,请重新设置数据目录,正在退出..."
               sleep 1
               exit 1 
             fi
          fi
            echo "正在修改修改目录权限及my.cnf..."       
            sleep 1
            chown -R mysql. $mysql_data_dir_userset
            sed -i 's/datadir=/#datadir=/g' /etc/my.cnf
            echo "datadir=$mysql_data_dir_userset" >> /etc/my.cnf;;
    [Nn]*)      #如果用户输入nN
        echo "将使用默认路径,正在创建目录..."
          if [ ! -d $def_data_dir ];then  #目录不存在则创建
            mkdir -p $def_data_dir
            if [ $? -eq 0 ];then
              echo '创建成功'
              echo "正在修改修改目录权限及my.cnf..."
              sleep 1
            else
              echo '创建失败,正在退出...'
              exit 1
            fi
          else 
            file_number_def=`ls ${def_data_dir}|wc -l`
              if [ $file_number_def -ne 0 ];then
              echo "检测该目录内存在文件,请重新设置数据目录,正在退出..."
              sleep 1
              exit 1
              fi
          fi
        chown -R mysql. $def_data_dir;;
    *) 
        echo '输入错误,正在退出...'
        sleep 1
        exit 1
  esac
    echo "正在启动MySQL..."
    systemctl start mysqld
    sleep 4 
    #检查MySQL进程是否启动
    MySQLpid=`ss -antlp|grep 3306|wc -l`
    if [ $MySQLpid -ne 0 ];then
        echo 'MySQL启动成功'
    else
        echo 'error,mysql is not running'
        tail -10f /var/log/mysqld.log
    fi
    #设置开机自启动
    echo '正在设置自启动...'
    systemctl enable mysqld
    if [ $? -eq 0 ];then
        echo '设置自启动成功'
    else
        echo '设置自启动失败'
    fi
    sleep 1
    #更改密码安全策略
    echo '正在设置密码策略...'
    sleep 2
    OLDPWD=`cat /var/log/mysqld.log |grep password|tail -1 |awk -F"host: " '{print $2}'`
    NEWPWD="ITwh@@$[RANDOM%900+100]"
    mysql  --connect-expired-password -uroot -p"$OLDPWD" -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '"$NEWPWD"'" > /dev/null
    mysql  -uroot -p"$NEWPWD" -e "set global validate_password.policy=1;" -e "set global validate_password.length=11;" -e "set global validate_password.mixed_case_count=4;" -e " set global validate_password.number_count=3;" -e "set global validate_password.special_char_count=2;" > /dev/null
    mysql  -uroot -p"$NEWPWD" -e "show variables like 'validate_password%';"
    sleep 2
    echo -e "当前密码策略为:\n 1.密码默认42天过期 \n 2.存储最近的六次密码 \n 3.最近六次密码一年内不得重复使用 \n 4.密码最小长度12位 \n 5.密码至少要包含的小写字母个数和大写字母4个 \n 6.密码至少要包含的数字个数4个 \n 7.密码至少要包含的特殊字符数2个\n"
    sleep 2
    echo -e "MySQL初始密码为: $NEWPWD \n"
    echo "修改密码:  ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';"
elif [ $RHversion -eq 6 ];then
    echo "您使用的系统版本为CentOS $RHversion"
    sleep 1
    #检测当前账户
    echo '正在检测用户是否为root'
    sleep 2
    user=${USER}
    if [ "$user" != root ];then
        echo "当前用户不为root,正在退出..."
        exit 1
    fi
    #检测libaio软件包
    echo '正在检测依赖环境...'
    libaio=`rpm -qa|grep libaio |wc -l`
    libaioverison=`rpm -qa|grep libaio|awk -F"-" '{print $1$2}'`
    if [ $libaio -eq 1 ];then
        echo "libaio版本为$libaioverison"
    else
        echo '没有找到libaio依赖包,正在尝试安装'
        yum install libaio -y
            if [ $? -eq 0 ];then
                echo "安装完成"
            else
                echo "安装失败,正在退出..."
                sleep 2
                exit 1
            fi
    fi
    #检测numactl软件包
    numactl=`rpm -qa|grep numactl|wc -l`
    numactlversion=`rpm -qa|grep numactl|awk -F"-" '{print $1,$2}'`
    if [ $numactl -eq 1 ];then
        echo "numactl版本为$numactlversion"
    else
        echo '没有找到numactl依赖包,正在尝试安装'
        yum install numactl -y
            if [ $? -eq 0 ];then
                echo "安装完成"
            else
                echo "安装失败,正在退出..."
                sleep 2
                exit 1
            fi
    fi
    #检测是否有mysql压缩包
    echo '检测是否有MySQL压缩包...'
    sleep 2
    if [ -f "/usr/local/src/mysql-8.0.20-1.el6.x86_64.rpm-bundle.tar" ];then
        echo '文件存在'
        sleep 2
    else
        echo '您没有上传指定的MySQL压缩包或不在指定位置,文件上传位置为/usr/local/src/'
            exit 1
    fi
    
    echo '请确定mariadb内是否有数据或确定是否需要使用mariadb' 
    sleep 2
    read -p "请输入是否需要卸载mariadb,[Yy/Nn]" yn
      case $yn in
        [Yy]*)
          rpm -e --nodeps `rpm -qa|grep mariadb`
          echo '正在卸载mariadb...'
          sleep 1
          echo '卸载成功';;
        [Nn]*)
          echo '正在退出...'
          sleep 1
          exit 1;;
        *) echo '输入错误'
      esac
    TAR_DIR=/usr/local/src/
    MYSQL_TAR='mysql-8.0.20-1.el6.x86_64.rpm-bundle.tar'
    echo '开始安装MySQL,安装版本MySQL-8.0.19'
    sleep 1
    echo '添加mysql账户...'
    if [ `grep 'mysql' /etc/passwd |wc -l ` -ge 1 ];then
        echo '用户已经存在'
    else
        groupadd mysql && useradd -r -g mysql -s /sbin/nologin -M mysql
        echo '用户添加成功'
    fi
    #解压MySQL压缩包
    echo '正在解压...'
    cd $TAR_DIR && tar xf $TAR_DIR$MYSQL_TAR
    #安装MySQL
    echo '正在安装MySQL...'
    rpm -ivh mysql-community-common-8.0.20-1.el6.x86_64.rpm && rpm -ivh mysql-community-libs-8.0.20-1.el6.x86_64.rpm && rpm -ivh mysql-community-client-8.0.20-1.el6.x86_64.rpm  && rpm -ivh mysql-community-server-8.0.20-1.el6.x86_64.rpm --force --nodeps
    if [ $? -ne 0 ];then
        echo '安装异常,请检查是否安装过mysql,正在退出安装程序'
            exit 1
    fi
    #初始化MySQL
    echo '正在初始化MySQL...'
    mysqld --initialize 
    if [ $? -eq 0 ];then
        echo '初始化完成'
    else
        echo '初始化失败,请检查是否安装依赖环境'
    fi
        #写入my.cnf
cat << EOF > /etc/my.cnf
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-name-resolve
default_password_lifetime=42  #密码默认42天过期
password_history=6 #存储最近的六次密码
password_reuse_interval=365 #最近六次密码一年内不得重复使用
EOF
def_data_dir=/usr/local/mysql/data               #MySQL数据目录默认路径
read -p "默认data目录为/usr/local/mysql/data,是否需要手动设置MySQL数据目录[yY/nN]" lastyn                      #根据用户输入yn判断数据库data目录位置
  case $lastyn in 
    [Yy]*)     #如果用户输入yY
        read -p "请输入data目录绝对路径,例/usr/local/mysql/data/ 如果输入错误,请按Ctrl+Backspace(退格键):" mysql_data_dir_userset
          if [ ! -d $mysql_data_dir_userset ];then  #如果目录不存在则创建目录,修改目录属主为mysql.mysql,并修改my.cnf 
            echo "检测到目录不存在,正在创建目录..."
            mkdir -p $mysql_data_dir_userset
            if [ $? -eq 0 ];then
              echo "创建成功"
              sleep 1
            else 
              echo "创建失败,正在退出..."
            fi
          else                                      #如果目录存在,判断目录下是否有文件存在,如果存在则退出
           file_number_userset=`ls ${mysql_data_dir_userset} |wc -l`
             if [ $file_number_userset -ne 0 ];then         
               echo "检测该目录内存在文件,请重新设置数据目录,正在退出..."
               sleep 1
               exit 1 
             fi
          fi
            echo "正在修改修改目录权限及my.cnf..."       
            sleep 1
            chown -R mysql. $mysql_data_dir_userset
            sed -i 's/datadir=/#datadir=/g' /etc/my.cnf
            echo "datadir=$mysql_data_dir_userset" >> /etc/my.cnf;;
    [Nn]*)      #如果用户输入nN
        echo "将使用默认路径,正在创建目录..."
          if [ ! -d $def_data_dir ];then  #目录不存在则创建
            mkdir -p $def_data_dir
            if [ $? -eq 0 ];then
              echo '创建成功'
              echo "正在修改修改目录权限及my.cnf..."
              sleep 1
            else
              echo '创建失败,正在退出...'
              exit 1
            fi
          else 
            file_number_def=`ls ${def_data_dir}|wc -l`
              if [ $file_number_def -ne 0 ];then
              echo "检测该目录内存在文件,请重新设置数据目录,正在退出..."
              sleep 1
              exit 1
              fi
          fi
        chown -R mysql. $def_data_dir;;
    *) 
        echo '输入错误,正在退出...'
        sleep 1
        exit 1
  esac
  echo "正在启动MySQL..."
  service mysqld start 
  sleep 4 
  #检查MySQL进程是否启动
  MySQLpid=`ss -antlp|grep 3306|wc -l`
  if [ $MySQLpid -ne 0 ];then
      echo 'MySQL启动成功'
  else
      echo 'error,mysql is not running'
      tail -10f /var/log/mysqld.log
  fi
  #设置开机自启动
  echo '正在设置自启动...'
  chkconfig --add mysqld
  chkconfig mysqld on
  if [ $? -eq 0 ];then
      echo '设置自启动成功'
  else
      echo '设置自启动失败'
  fi
  sleep 1
  #更改密码安全策略
  echo '正在设置密码策略...'
  sleep 2
  OLDPWD6=`cat /var/log/mysqld.log |grep password|tail -1 |awk -F"host: " '{print $2}'`
  NEWPWD6="ITwh@@$[RANDOM%900+100]"
  mysql  --connect-expired-password -uroot -p"$OLDPWD6" -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '"$NEWPWD6"'" > /dev/null
  mysql  -uroot -p"$NEWPWD6" -e "set global validate_password.policy=1;" -e "set global validate_password.length=11;" -e "set global validate_password.mixed_case_count=4;" -e " set global validate_password.number_count=3;" -e "set global validate_password.special_char_count=2;" > /dev/null
  mysql  -uroot -p"$NEWPWD6" -e "show variables like 'validate_password%';"
  sleep 2
  echo -e "当前密码策略为:\n 1.密码默认42天过期 \n 2.存储最近的六次密码 \n 3.最近六次密码一年内不得重复使用 \n 4.密码最小长度12位 \n 5.密码至少要包含的小写字母个数和大写字母4个 \n 6.密码至少要包含的数字个数4个 \n 7.密码至少要包含的特殊字符数2个\n"
  sleep 2
  echo -e "MySQL初始密码为: $NEWPWD6 \n"
  echo "修改密码:  ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';"
else 
   echo "此脚本仅适用于Redhat CentOS 6 及 CentOS 7 ,当前环境无法执行脚本"
fi

 

posted @ 2020-05-22 17:02  bk菜鸟  阅读(299)  评论(0)    收藏  举报