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

浙公网安备 33010602011771号