MySQL自动安装脚本分享

打印 上一主题 下一主题

主题 875|帖子 875|积分 2625

这里分享一个我写的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密码的脚本,如下所示,根据实际情况输入密码,安装完成后,删除此脚本。
  1. ALTER USER 'root'@'localhost' IDENTIFIED BY '********';<br>flush privileges;<br>
复制代码
mysql_auto_install.sh脚本的详情如下(格式可能因为代码插件展示问题,有所混乱,请自行调整。原始脚本格式不会有下面乱七八糟的缩进或不对齐问题)
  1. #!/bin/bash<br><br>#########################################################################################<br>#                                                                                       #<br># This script is used for auto install mysql 8.0.xx                                     #<br>#                                                                                       #<br>#########################################################################################<br>#                                                                                       #<br># ScriptName            :    mysql_auto_install.sh                                      #<br># Author                :    潇湘隐者                                                   #<br># CreateDate            :    2019-09-06                                                 #<br># Blogs                 :    www.cnblogs.com/kerrycode                                  #<br># Email                 :    kerry2008code@qq.com                                       #<br>#***************************************************************************************#<br># 参数配置                                                                              #<br>#---------------------------------------------------------------------------------------#<br># MYSQL_BASE_DIR        /opt/mysql                                                      #<br># MYSQL_DATA_DIR        /data/mysql                                                     #<br># MYSQL_PORT            3306                                                            #<br># LOG_OUT_TYPE          log                                                             #<br>#---------------------------------------------------------------------------------------#<br># 注意事项:                                                                            #<br>#   1:如果维护的MySQL数据库都规范化安装、配置的化,下面很多参数都不需要修改            #<br>#   2:my.cnf模板很重要,如果配置有问题,可能导致安装失败。脚本里面有些参数设定都是依赖 #<br>#       my.cnf模板中的设置,请确保你的my.cnf模板中设定跟脚本参数一致                    #<br>#   3:此脚本在mysql用户下安装,很多操作受限,例如禁用透明大页、卸载rpm包,调整内核参数 #<br>#      如需处理这些 建议使用另外一个版本的脚本处理。此处设定系统管理员已经处理好这些事情#<br>#      **注意**:此脚本只能在mysql用户下运行,root用户下需要修改部分地方才能成功        #<br>#---------------------------------------------------------------------------------------#<br>#***************************************************************************************#<br># Version        Modified Date            Description                                   #<br>#***************************************************************************************#<br># V.1.0          2019-09-06              创建此脚本                                     #<br># V.1.1          2019-10-26              按SHELL编程规范,重新命名规范各类对象          #<br># V.2.0          2023-06-16              重新改写该脚本,增加验证/优化步骤              #<br>#########################################################################################<br><br># MySQL的安装路径:basedir的上层目录<br>MYSQL_BASE_DIR=/opt/mysql<br># MySQL数据目录:datadir的上层目录<br>MYSQL_DATA_DIR=/data/mysql<br># MySQL安装日志信息<br>MYSQL_INSTALL_LOG=/tmp/soft/mysql_install.log<br># MySQL压缩包路径<br>MYSQL_INSTALLER_DIR=/tmp/soft<br># MySQL安装介质<br># 注意事项,如果安装介质不是tar.xz ,请修改代码中tar.xz<br>MYSQL_INSTALLER=$MYSQL_INSTALLER_DIR/mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz<br># MySQL的my.cnf模板<br>MYSQL_CONFIG_FILE=$MYSQL_INSTALLER_DIR/mysql8_template.cnf<br># alter_root_passwd文件<br>SQL_ALTER_USER_PWD=$MYSQL_INSTALLER_DIR/alter_root_passwd.sql<br># Log输出方式:log 或out或all<br>LOG_OUT_TYPE=all<br># MySQL的端口号<br>MYSQL_PORT=3306<br><br># 记录安装过程的日志信息<br>function log_info()<br>{<br>    #判断参数个数<br>    if [ $# -eq 1 ];then<br>        local log_msg=$1<br>    else<br>        echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"<br>    fi<br>    <br>:<<EOF<br>    if [ $LOG_OUT_TYPE = "print" ];then<br>        echo "[info ]: `date`> $log_msg"<br>    else<br>        echo "[info ]: `date`> $log_msg" >> $MYSQL_INSTALL_LOG<br>    fi<br>EOF<br>    case $LOG_OUT_TYPE in<br>        out)<br>            echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"<br>            ;;<br>        log)<br>            echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG<br>            ;;<br>        all)<br>            echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"<br>            echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG<br>            ;;<br>        *)<br>    esac<br>        <br>}<br><br># 记录安装过程的错误信息<br>function log_error()<br>{<br>    #判断参数个数<br>    if [ $# -eq 1 ];then<br>        local log_msg=$1<br>    else<br>        echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"<br>    fi<br>    <br>:<<EOF<br>    if [ $LOG_OUT_TYPE = "print" ];then<br>        echo "[error]:`date`> $log_msg"<br>    else<br>        echo "[error]:`date`> $log_msg" >> $MYSQL_INSTALL_LOG<br>    fi<br>EOF<br>    case $LOG_OUT_TYPE in<br>        out)<br>             echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"<br>             ;;<br>        log)<br>             echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG<br>             ;;<br>        all)<br>             echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"<br>             echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG<br>             ;;<br>        *)<br>    esac<br>}<br><br># 卸载系统自带的MARIADB<br>#rpm -qa|grep mariadb |xargs yum remove -y > /dev/null<br><br>function check_env_setting()<br>{<br>    # 检查操作系统是否Linux(此脚本不适用HP-UX/SunOS/AIX)<br>    if [ `uname -s`="Linux" ];then<br>        log_info "The os is linux,mysql auto install continue..."<br>    else<br>        log_error "the os is not linux, please check it."<br>        exit 1<br>    fi<br><br>    # 检查存放安装包目录是否存在<br>    if [ ! -d "$MYSQL_INSTALLER_DIR" ];then<br>        log_error "the mysql installer directory $MYSQL_INSTALLER_DIR didn't exists, please check it"<br>        exit 1<br>    else<br>        log_info "the mysql installer directory $MYSQL_INSTALLER_DIR exist, mysql auto install continue...";<br>    fi<br>    <br>    # 检查MySQL安装文件是否存在<br>    if [ ! -f "$MYSQL_INSTALLER" ];then<br>        log_error "the mysql installer file $MYSQL_INSTALLER didn't exist, please check it"<br>        exit 1<br>    else<br>        log_info  "the mysql installer file $MYSQL_INSTALLER exist, mysql auto install continue..."<br>    fi<br>    <br>    # 检查MySQL的my.cnf的模板文件是否存在<br>    if [ ! -f $MYSQL_CONFIG_FILE ];then<br>        log_error "the mysql configuration template file $MYSQL_CONFIG_FILE did'nt exist, please check it"<br>        exit 1<br>    else<br>        log_info "the mysql configuration  template file $MYSQL_CONFIG_FILE exists,mysql auto install continue..."<br>    fi<br>    <br>    # 检查修改mysql数据库用户root密码的SQL文件是否存在。<br>    if [ ! -f $SQL_ALTER_USER_PWD ];then<br>        log_error "the sql file $SQL_ALTER_USER_PWD did'nt exist, please check it"<br>        exit 1<br>    else<br>        log_info "the sql file $SQL_ALTER_USER_PWD exists,mysql auto install continue..."<br>    fi<br>    <br>    <br>    # 检查MySQL安装目录的上层目录是否存在<br>    if [ ! -d "$MYSQL_BASE_DIR" ];then<br>        log_error "the $MYSQL_BASE_DIR didn't exists, please check it"<br>        exit 1<br>    else<br>        log_info "the $MYSQL_BASE_DIR exists, mysql auto install continue..."<br>    fi<br>    <br>    # 检查MYSQL_DATA_DIR对应的目录是否存在,此目录为datadir的上一层目录<br>    if [ ! -d "$MYSQL_DATA_DIR" ];then<br>        log_error "the $MYSQL_DATA_DIR didn't exists, please check it"<br>        exit 1<br>    else<br>        log_info "the $MYSQL_DATA_DIR exists, mysql auto install continue..."<br>    fi<br>    <br>    # 检查MYSQL_DATA_DIR目录下是否存在其目录,如果有其它目录,则退出安装(担心已经安装了MySQL实例)<br>    if [ -d ${MYSQL_DATA_DIR} -a "`ls -A ${MYSQL_DATA_DIR}`" != "" ];then<br>        log_error "the $MYSQL_DATA_DIR directory have exists files,plese check it"<br>        exit 1<br>    else <br>        log_info "the $MYSQL_DATA_DIR check is ok ,mysql auto install continue..."<br>    fi<br>    <br>    # 验证MySQL安装介质的MD5<br>    <br>    <br>    # 检查是否存在MySQL实例<br>    mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:'${MYSQL_PORT}'/) {print "Yes";exit 0}}'`<br>    echo $mysql_status<br>    if [ "$mysql_status" = "Yes" ];then<br>        log_error "MySQL instance exists. please check it"<br>        exit 1<br>    else<br>        #只能作为一个依据,并不能完全保证。<br>        log_info "MySQL instance didn't exists,mysql auto install continue..."<br>    fi<br>    <br>    echo "check_env_setting run successful."<br>    #read ANS<br>    read -n1 -p "Do you want to continue [Y/N]?" answer<br>    case $answer in<br>        Y | y)<br>            log_info "mysql auto install continue...";;<br>        N | n)<br>            log_info "mysql auto install exit.";;<br>        *)<br>            log_error "your choice is wrong!";;<br>    esac<br><br>}<br><br># 创建MySQL用户和用户组(此处注释,用户由系统管理员创建)<br>#echo '[info]: create the mysql user...'<br>#groupadd mysql<br>#/usr/sbin/groupadd mysql<br>#useradd -g mysql mysql<br>#/usr/sbin/useradd -g mysql mysql<br><br><br># 创建MySQL的相关目录<br>function create_mysql_dir()<br>{<br>    cd $MYSQL_DATA_DIR<br>    mkdir conf data  logs  slow_logs  bin_logs  mysql_temp<br>    chmod 750  $MYSQL_DATA_DIR<br>    #对目录进行授权<br>    chmod -R 760  $MYSQL_DATA_DIR/bin_logs<br>    chmod -R 700  $MYSQL_DATA_DIR/logs<br>    chmod -R 760  $MYSQL_DATA_DIR/slow_logs<br>}<br><br>function mysql_cnf_setting()<br>{<br>    # 拷贝my.cnf的模板配置文件,这里不打算直接写入生成my.cnf文件<br>    cp $MYSQL_CONFIG_FILE $MYSQL_DATA_DIR/conf/my.cnf<br>    if [ $? -ne 0 ];then<br>        log_error 'failed to cp the my.cnf,please check it'<br>        exit 1<br>    else<br>        log_info  "cp the $MYSQL_CONFIG_FILE to my.cnf success!"<br>    fi<br>}<br><br>function mysql_env_setting()<br>{<br>    # 设置环境变量<br>    local env_exist=`cat ~/.bash_profile |grep -E "MYSQL_HISTFILE|$MYSQL_BASE_DIR/mysql8.0/bin" | wc -l`<br>    if [ $env_exist -eq 0 ];then<br>        echo "export PATH=\$PATH:$MYSQL_BASE_DIR/mysql8.0/bin" >> ~/.bash_profile<br>        echo "export MYSQL_HISTFILE=/dev/null" >> ~/.bash_profile<br>        source ~/.bash_profile<br>    else<br>        log_info "the environment variable exists, please check it!"<br>    fi<br>}<br><br><br><br># 解压MySQL的二进制安装包<br>function mysql_install()<br>{<br>    echo '[info]:unzip the mysql installation media....'<br>    tar -xvf $MYSQL_INSTALLER -C $MYSQL_BASE_DIR<br>    if [ $? -ne 0 ];then<br>        log_error "mysql media unzip failed,please check the detail."<br>        exit<br>    else<br>        log_info  "mysql media unzip success,mysql auto install continue..."<br>    fi<br>    <br>    # 创建软连接<br>    local MYSQL_MEDIA_DIR=$(basename ${MYSQL_INSTALLER} '.tar.xz')<br>    #echo  $MYSQL_MEDIA_DIR<br>    ln -s $MYSQL_BASE_DIR/$MYSQL_MEDIA_DIR  $MYSQL_BASE_DIR/mysql8.0<br>    if [ $? -ne 0 ];then<br>        log_error "create the mysql soft link failed, please check it"<br>        exit 1<br>    else<br>        log_info "create the mysql soft link success,mysql auto install continue..."<br>    fi<br>    <br>    <br>    #  初始化MySQL<br>    cd $MYSQL_BASE_DIR/mysql8.0<br>    $MYSQL_BASE_DIR/mysql8.0/bin/mysqld \<br>    --defaults-file=$MYSQL_DATA_DIR/conf/my.cnf \<br>    --initialize \<br>    --basedir=$MYSQL_BASE_DIR/mysql8.0 \<br>    --datadir=$MYSQL_DATA_DIR/data  2>&1 | >> $MYSQL_INSTALL_LOG<br>    <br>    #<br>    $MYSQL_BASE_DIR/mysql8.0/bin/mysql_ssl_rsa_setup --datadir=$MYSQL_DATA_DIR/data<br>}<br><br><br>function mysql_startup()<br>{<br>    $MYSQL_BASE_DIR/mysql8.0/bin/mysqld_safe --defaults-file=$MYSQL_DATA_DIR/conf/my.cnf &<br>    <br>    # 休眠几秒,等待MySQL服务启动<br>    sleep 15<br>    <br>    # 检查MySQL服务是否启动成功<br>    mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:'${MYSQL_PORT}'/) {print "Yes";exit 0}}'`<br>    echo $mysql_status<br>    if [ "$mysql_status" != "Yes" ];then<br>        log_error "MySQL did not start. please check it"<br>        exit 1<br>    else<br>        log_info "MySQL start success,mysql auto install continue..."<br>    fi<br>}<br><br># 修改MySQL的root用户密码<br>function change_mysql_root_pwd()<br>{<br><br>    # 获取root初始密码<br>    mysql_root_init_passd=`grep "temporary password" $MYSQL_DATA_DIR/logs/mysql_error.log |awk '{print $NF}'`<br>    <br>    # 修改MySQL的root密码<br>    mysql -uroot -p"$mysql_root_init_passd" --connect-expired-password < $SQL_ALTER_USER_PWD 2> /dev/null<br>    <br>    if [ $? -ne 0 ];then<br>        log_error 'fail to perform MySQL operation!!!'<br>        exit 1<br>    else<br>        log_info "alter the mysql user root's password succeed!"<br>    fi<br>}<br><br><br># MySQL的安全设置,此脚本在mysql用户下运行,默认这些文件的属主为mysql<br>function mysql_security_setting<br>{<br>    #注意,此处写死mysql_error.log,是因为my.cnf模板中命名统一规范<br>    chmod 660  $MYSQL_DATA_DIR/logs/mysql_error.log<br>    #注意,此处写死mysql_binlog.*,是因为my.cnf模板中命名统一规范<br>    chmod 600 $MYSQL_DATA_DIR/bin_logs/mysql_binlog.*<br>    chmod 400 $MYSQL_DATA_DIR/data/*.pem<br>    #注意,此处写死mysql_slow.log,是因为my.cnf模板中命名统一规范<br>    chmod 660 $MYSQL_DATA_DIR/slow_logs/mysql_slow.log<br>    #plugin_dir的权限设置<br>    chmod 550 $MYSQL_BASE_DIR/mysql8.0/lib/plugin/ <br><br>}<br><br>function main() {<br>        check_env_setting<br>        create_mysql_dir<br>        mysql_cnf_setting<br>        mysql_env_setting<br>        mysql_install<br>        mysql_startup<br>        change_mysql_root_pwd<br>    <br>        if [ $? -ne 0 ];then<br>            log_error "change_mysql_root_pwd run failed!"<br>        else    <br>            log_info "the mysql auto install was successful!"<br>        fi<br>        mysql_security_setting<br>}<br># invoke main function<br>main <br>
复制代码
下面是安装测试过程的截图
下面是安装日志mysql_install.log的输出信息截图:
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表