MySQL自动安装脚本代码实例分享

2023-12-01 0 582
目录

    这里分享一个我写的MySQL自动安装脚本mysql_auto_install.sh,它的功能非常简单,就是自动化安装MySQL单实例,让DBA的工作更简单、轻松一些,不用去手工安装MySQL实例。从简单重复的工作中释放出来。

    下面是关于mysql_auto_install.sh脚本的一些说明:

    • 1:这个脚本运行在mysql用户下(注意,root用户下运行会报错,需要修改部分地方),主要原因是因为DBA没有root账号权限,只有mysql用户的权限。另外,我也写了一个mysql_auto_install_root.sh脚本,这个脚本是在root用户下面运行,功能更多一些。暂时还在测试当中。

    • 2:此脚本运行在mysql用户下,因为权限问题,不会禁用透明大页,卸载RPM包,调整内核参数、配置systemctl服务等操作,这些工作交给系统管理员处理。而且我们也假设这些都已经是设定好了的。

    • 3:此脚本只适用于Linux,不适用HP-UX等操作系统。

    • 4:my.cnf的模板中的参数要跟脚本中的参数一致。否则可能有问题。另外模板中参数设置请自己保证正确性与合理性。

    • 5:脚本经过多次测试验证,但是并不保证各种场景都没有bug。发现问题,欢迎反馈,我自己也在不断完善、改进这个脚本。

    • 6: 安装前,要准备好MySQL安装介质、mysql_auto_install.sh、alter_root_passwd.sql,my.cnf的模板(这里命名为mysql8_template.cnf)

    其中alter_root_passwd.sql是修改root密码的脚本,如下所示,根据实际情况输入密码,安装完成后,删除此脚本。

    ALTER USER \’root\’@\’localhost\’ IDENTIFIED BY \’********\’;
    flush privileges;

    mysql_auto_install.sh脚本的详情如下(格式可能因为代码插件展示问题,有所混乱,请自行调整。原始脚本格式不会有下面乱七八糟的缩进或不对齐问题)

    #!/bin/bash

    #########################################################################################
    #                                                                                       #
    # This script is used for auto install mysql 8.0.xx                                     #
    #                                                                                       #
    #########################################################################################
    #                                                                                       #
    # ScriptName            :    mysql_auto_install.sh                                      #
    # Author                :    潇湘隐者                                                   #
    # CreateDate            :    2019-09-06                                                 #
    # Blogs                 :    www.cnblogs.com/kerrycode                                  #
    # Email                 :    kerry2008code@qq.com                                       #
    #***************************************************************************************#
    # 参数配置                                                                              #
    #—————————————————————————————#
    # MYSQL_BASE_DIR        /opt/mysql                                                      #
    # MYSQL_DATA_DIR        /data/mysql                                                     #
    # MYSQL_PORT            3306                                                            #
    # LOG_OUT_TYPE          log                                                             #
    #—————————————————————————————#
    # 注意事项:                                                                            #
    #   1:如果维护的MySQL数据库都规范化安装、配置的化,下面很多参数都不需要修改            #
    #   2:my.cnf模板很重要,如果配置有问题,可能导致安装失败。脚本里面有些参数设定都是依赖 #
    #       my.cnf模板中的设置,请确保你的my.cnf模板中设定跟脚本参数一致                    #
    #   3:此脚本在mysql用户下安装,很多操作受限,例如禁用透明大页、卸载rpm包,调整内核参数 #
    #      如需处理这些 建议使用另外一个版本的脚本处理。此处设定系统管理员已经处理好这些事情#
    #      **注意**:此脚本只能在mysql用户下运行,root用户下需要修改部分地方才能成功        #
    #—————————————————————————————#
    #***************************************************************************************#
    # Version        Modified Date            Description                                   #
    #***************************************************************************************#
    # V.1.0          2019-09-06              创建此脚本                                     #
    # V.1.1          2019-10-26              按SHELL编程规范,重新命名规范各类对象          #
    # V.2.0          2023-06-16              重新改写该脚本,增加验证/优化步骤              #
    #########################################################################################

    # MySQL的安装路径:basedir的上层目录
    MYSQL_BASE_DIR=/opt/mysql
    # MySQL数据目录:datadir的上层目录
    MYSQL_DATA_DIR=/data/mysql
    # MySQL安装日志信息
    MYSQL_INSTALL_LOG=/tmp/soft/mysql_install.log
    # MySQL压缩包路径
    MYSQL_INSTALLER_DIR=/tmp/soft
    # MySQL安装介质
    # 注意事项,如果安装介质不是tar.xz ,请修改代码中tar.xz
    MYSQL_INSTALLER=$MYSQL_INSTALLER_DIR/mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz
    # MySQL的my.cnf模板
    MYSQL_CONFIG_FILE=$MYSQL_INSTALLER_DIR/mysql8_template.cnf
    # alter_root_passwd文件
    SQL_ALTER_USER_PWD=$MYSQL_INSTALLER_DIR/alter_root_passwd.sql
    # Log输出方式:log 或out或all
    LOG_OUT_TYPE=all
    # MySQL的端口号
    MYSQL_PORT=3306

    # 记录安装过程的日志信息
    function log_info()
    {
        #判断参数个数
        if [ $# -eq 1 ];then
            local log_msg=$1
        else
            echo \”[error]:`date \’+%Y%m%d %H:%M:%S\’`> the number of parameters is incorrect!\”
        fi
        
    :<<EOF
        if [ $LOG_OUT_TYPE = \”print\” ];then
            echo \”[info ]: `date`> $log_msg\”
        else
            echo \”[info ]: `date`> $log_msg\” >> $MYSQL_INSTALL_LOG
        fi
    EOF
        case $LOG_OUT_TYPE in
            out)
                echo \”[info ]: `date \’+%Y%m%d %H:%M:%S\’`> $log_msg\”
                ;;
            log)
                echo \”[info ]: `date \’+%Y%m%d %H:%M:%S\’`> $log_msg\” >> $MYSQL_INSTALL_LOG
                ;;
            all)
                echo \”[info ]: `date \’+%Y%m%d %H:%M:%S\’`> $log_msg\”
                echo \”[info ]: `date \’+%Y%m%d %H:%M:%S\’`> $log_msg\” >> $MYSQL_INSTALL_LOG
                ;;
            *)
        esac
            
    }

    # 记录安装过程的错误信息
    function log_error()
    {
        #判断参数个数
        if [ $# -eq 1 ];then
            local log_msg=$1
        else
            echo \”[error]:`date \’+%Y%m%d %H:%M:%S\’`> the number of parameters is incorrect!\”
        fi
        
    :<<EOF
        if [ $LOG_OUT_TYPE = \”print\” ];then
            echo \”[error]:`date`> $log_msg\”
        else
            echo \”[error]:`date`> $log_msg\” >> $MYSQL_INSTALL_LOG
        fi
    EOF
        case $LOG_OUT_TYPE in
            out)
                 echo  \”[error]:`date \’+%Y%m%d %H:%M:%S\’`> $log_msg\”
                 ;;
            log)
                 echo  \”[error]:`date \’+%Y%m%d %H:%M:%S\’`> $log_msg\” >> $MYSQL_INSTALL_LOG
                 ;;
            all)
                 echo  \”[error]:`date \’+%Y%m%d %H:%M:%S\’`> $log_msg\”
                 echo  \”[error]:`date \’+%Y%m%d %H:%M:%S\’`> $log_msg\” >> $MYSQL_INSTALL_LOG
                 ;;
            *)
        esac
    }

    # 卸载系统自带的MARIADB
    #rpm -qa|grep mariadb |xargs yum remove -y > /dev/null

    function check_env_setting()
    {
        # 检查操作系统是否Linux(此脚本不适用HP-UX/SunOS/AIX)
        if [ `uname -s`=\”Linux\” ];then
            log_info \”The os is linux,mysql auto install continue…\”
        else
            log_error \”the os is not linux, please check it.\”
            exit 1
        fi

        # 检查存放安装包目录是否存在
        if [ ! -d \”$MYSQL_INSTALLER_DIR\” ];then
            log_error \”the mysql installer directory $MYSQL_INSTALLER_DIR didn\’t exists, please check it\”
            exit 1
        else
            log_info \”the mysql installer directory $MYSQL_INSTALLER_DIR exist, mysql auto install continue…\”;
        fi
        
        # 检查MySQL安装文件是否存在
        if [ ! -f \”$MYSQL_INSTALLER\” ];then
            log_error \”the mysql installer file $MYSQL_INSTALLER didn\’t exist, please check it\”
            exit 1
        else
            log_info  \”the mysql installer file $MYSQL_INSTALLER exist, mysql auto install continue…\”
        fi
        
        # 检查MySQL的my.cnf的模板文件是否存在
        if [ ! -f $MYSQL_CONFIG_FILE ];then
            log_error \”the mysql configuration template file $MYSQL_CONFIG_FILE did\’nt exist, please check it\”
            exit 1
        else
            log_info \”the mysql configuration  template file $MYSQL_CONFIG_FILE exists,mysql auto install continue…\”
        fi
        
        # 检查修改mysql数据库用户root密码的SQL文件是否存在。
        if [ ! -f $SQL_ALTER_USER_PWD ];then
            log_error \”the sql file $SQL_ALTER_USER_PWD did\’nt exist, please check it\”
            exit 1
        else
            log_info \”the sql file $SQL_ALTER_USER_PWD exists,mysql auto install continue…\”
        fi
        
        
        # 检查MySQL安装目录的上层目录是否存在
        if [ ! -d \”$MYSQL_BASE_DIR\” ];then
            log_error \”the $MYSQL_BASE_DIR didn\’t exists, please check it\”
            exit 1
        else
            log_info \”the $MYSQL_BASE_DIR exists, mysql auto install continue…\”
        fi
        
        # 检查MYSQL_DATA_DIR对应的目录是否存在,此目录为datadir的上一层目录
        if [ ! -d \”$MYSQL_DATA_DIR\” ];then
            log_error \”the $MYSQL_DATA_DIR didn\’t exists, please check it\”
            exit 1
        else
            log_info \”the $MYSQL_DATA_DIR exists, mysql auto install continue…\”
        fi
        
        # 检查MYSQL_DATA_DIR目录下是否存在其目录,如果有其它目录,则退出安装(担心已经安装了MySQL实例)
        if [ -d ${MYSQL_DATA_DIR} -a \”`ls -A ${MYSQL_DATA_DIR}`\” != \”\” ];then
            log_error \”the $MYSQL_DATA_DIR directory have exists files,plese check it\”
            exit 1
        else 
            log_info \”the $MYSQL_DATA_DIR check is ok ,mysql auto install continue…\”
        fi
        
        # 验证MySQL安装介质的MD5
        
        
        # 检查是否存在MySQL实例
        mysql_status=`netstat -nl | awk \’NR>2{if ($4 ~ /.*:\’${MYSQL_PORT}\’/) {print \”Yes\”;exit 0}}\’`
        echo $mysql_status
        if [ \”$mysql_status\” = \”Yes\” ];then
            log_error \”MySQL instance exists. please check it\”
            exit 1
        else
            #只能作为一个依据,并不能完全保证。
            log_info \”MySQL instance didn\’t exists,mysql auto install continue…\”
        fi
        
        echo \”check_env_setting run successful.\”
        #read ANS
        read -n1 -p \”Do you want to continue [Y/N]?\” answer
        case $answer in
            Y | y)
                log_info \”mysql auto install continue…\”;;
            N | n)
                log_info \”mysql auto install exit.\”;;
            *)
                log_error \”your choice is wrong!\”;;
        esac

    }

    # 创建MySQL用户和用户组(此处注释,用户由系统管理员创建)
    #echo \'[info]: create the mysql user…\’
    #groupadd mysql
    #/usr/sbin/groupadd mysql
    #useradd -g mysql mysql
    #/usr/sbin/useradd -g mysql mysql

    # 创建MySQL的相关目录
    function create_mysql_dir()
    {
        cd $MYSQL_DATA_DIR
        mkdir conf data  logs  slow_logs  bin_logs  mysql_temp
        chmod 750  $MYSQL_DATA_DIR
        #对目录进行授权
        chmod -R 760  $MYSQL_DATA_DIR/bin_logs
        chmod -R 700  $MYSQL_DATA_DIR/logs
        chmod -R 760  $MYSQL_DATA_DIR/slow_logs
    }

    function mysql_cnf_setting()
    {
        # 拷贝my.cnf的模板配置文件,这里不打算直接写入生成my.cnf文件
        cp $MYSQL_CONFIG_FILE $MYSQL_DATA_DIR/conf/my.cnf
        if [ $? -ne 0 ];then
            log_error \’failed to cp the my.cnf,please check it\’
            exit 1
        else
            log_info  \”cp the $MYSQL_CONFIG_FILE to my.cnf success!\”
        fi
    }

    function mysql_env_setting()
    {
        # 设置环境变量
        local env_exist=`cat ~/.bash_profile |grep -E \”MYSQL_HISTFILE|$MYSQL_BASE_DIR/mysql8.0/bin\” | wc -l`
        if [ $env_exist -eq 0 ];then
            echo \”export PATH=\\$PATH:$MYSQL_BASE_DIR/mysql8.0/bin\” >> ~/.bash_profile
            echo \”export MYSQL_HISTFILE=/dev/null\” >> ~/.bash_profile
            source ~/.bash_profile
        else
            log_info \”the environment variable exists, please check it!\”
        fi
    }

    # 解压MySQL的二进制安装包
    function mysql_install()
    {
        echo \'[info]:unzip the mysql installation media….\’
        tar -xvf $MYSQL_INSTALLER -C $MYSQL_BASE_DIR
        if [ $? -ne 0 ];then
            log_error \”mysql media unzip failed,please check the detail.\”
            exit
        else
            log_info  \”mysql media unzip success,mysql auto install continue…\”
        fi
        
        # 创建软连接
        local MYSQL_MEDIA_DIR=$(basename ${MYSQL_INSTALLER} \’.tar.xz\’)
        #echo  $MYSQL_MEDIA_DIR
        ln -s $MYSQL_BASE_DIR/$MYSQL_MEDIA_DIR  $MYSQL_BASE_DIR/mysql8.0
        if [ $? -ne 0 ];then
            log_error \”create the mysql soft link failed, please check it\”
            exit 1
        else
            log_info \”create the mysql soft link success,mysql auto install continue…\”
        fi
        
        
        #  初始化MySQL
        cd $MYSQL_BASE_DIR/mysql8.0
        $MYSQL_BASE_DIR/mysql8.0/bin/mysqld \\
        –defaults-file=$MYSQL_DATA_DIR/conf/my.cnf \\
        –initialize \\
        –basedir=$MYSQL_BASE_DIR/mysql8.0 \\
        –datadir=$MYSQL_DATA_DIR/data  2>&1 | >> $MYSQL_INSTALL_LOG
        
        #
        $MYSQL_BASE_DIR/mysql8.0/bin/mysql_ssl_rsa_setup –datadir=$MYSQL_DATA_DIR/data
    }

    function mysql_startup()
    {
        $MYSQL_BASE_DIR/mysql8.0/bin/mysqld_safe –defaults-file=$MYSQL_DATA_DIR/conf/my.cnf &
        
        # 休眠几秒,等待MySQL服务启动
        sleep 15
        
        # 检查MySQL服务是否启动成功
        mysql_status=`netstat -nl | awk \’NR>2{if ($4 ~ /.*:\’${MYSQL_PORT}\’/) {print \”Yes\”;exit 0}}\’`
        echo $mysql_status
        if [ \”$mysql_status\” != \”Yes\” ];then
            log_error \”MySQL did not start. please check it\”
            exit 1
        else
            log_info \”MySQL start success,mysql auto install continue…\”
        fi
    }

    # 修改MySQL的root用户密码
    function change_mysql_root_pwd()
    {

        # 获取root初始密码
        mysql_root_init_passd=`grep \”temporary password\” $MYSQL_DATA_DIR/logs/mysql_error.log |awk \'{print $NF}\’`
        
        # 修改MySQL的root密码
        mysql -uroot -p\”$mysql_root_init_passd\” –connect-expired-password < $SQL_ALTER_USER_PWD 2> /dev/null
        
        if [ $? -ne 0 ];then
            log_error \’fail to perform MySQL operation!!!\’
            exit 1
        else
            log_info \”alter the mysql user root\’s password succeed!\”
        fi
    }

    # MySQL的安全设置,此脚本在mysql用户下运行,默认这些文件的属主为mysql
    function mysql_security_setting
    {
        #注意,此处写死mysql_error.log,是因为my.cnf模板中命名统一规范
        chmod 660  $MYSQL_DATA_DIR/logs/mysql_error.log
        #注意,此处写死mysql_binlog.*,是因为my.cnf模板中命名统一规范
        chmod 600 $MYSQL_DATA_DIR/bin_logs/mysql_binlog.*
        chmod 400 $MYSQL_DATA_DIR/data/*.pem
        #注意,此处写死mysql_slow.log,是因为my.cnf模板中命名统一规范
        chmod 660 $MYSQL_DATA_DIR/slow_logs/mysql_slow.log
        #plugin_dir的权限设置
        chmod 550 $MYSQL_BASE_DIR/mysql8.0/lib/plugin/ 

    }

    function main() {
            check_env_setting
            create_mysql_dir
            mysql_cnf_setting
            mysql_env_setting
            mysql_install
            mysql_startup
            change_mysql_root_pwd
        
            if [ $? -ne 0 ];then
                log_error \”change_mysql_root_pwd run failed!\”
            else    
                log_info \”the mysql auto install was successful!\”
            fi
            mysql_security_setting
    }
    # invoke main function
    main 

    下面是安装测试过程的截图

    MySQL自动安装脚本代码实例分享

    MySQL自动安装脚本代码实例分享

    下面是安装日志mysql_install.log的输出信息截图:

    MySQL自动安装脚本代码实例分享

    到此这篇关于MySQL自动安装脚本代码实例分享的文章就介绍到这了,更多相关MySQL自动安装脚本内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!

    收藏 (0) 打赏

    感谢您的支持,我会继续努力的!

    打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
    点赞 (0)

    悠久资源 Mysql MySQL自动安装脚本代码实例分享 https://www.u-9.cn/database/mysql/5270.html

    常见问题

    相关文章

    发表评论
    暂无评论
    官方客服团队

    为您解决烦忧 - 24小时在线 专业服务