翼度科技»论坛 编程开发 mysql 查看内容

MySQL自动安装脚本分享

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
这里分享一个我写的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 '********';
  2. flush privileges;
复制代码
mysql_auto_install.sh脚本的详情如下(格式可能因为代码插件展示问题,有所混乱,请自行调整。原始脚本格式不会有下面乱七八糟的缩进或不对齐问题)
  1. #!/bin/bash

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

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

  55. # 记录安装过程的日志信息
  56. function log_info()
  57. {
  58.     #判断参数个数
  59.     if [ $# -eq 1 ];then
  60.         local log_msg=$1
  61.     else
  62.         echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"
  63.     fi
  64.     
  65. :<<EOF
  66.     if [ $LOG_OUT_TYPE = "print" ];then
  67.         echo "[info ]: `date`> $log_msg"
  68.     else
  69.         echo "[info ]: `date`> $log_msg" >> $MYSQL_INSTALL_LOG
  70.     fi
  71. EOF
  72.     case $LOG_OUT_TYPE in
  73.         out)
  74.             echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"
  75.             ;;
  76.         log)
  77.             echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
  78.             ;;
  79.         all)
  80.             echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg"
  81.             echo "[info ]: `date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
  82.             ;;
  83.         *)
  84.     esac
  85.         
  86. }

  87. # 记录安装过程的错误信息
  88. function log_error()
  89. {
  90.     #判断参数个数
  91.     if [ $# -eq 1 ];then
  92.         local log_msg=$1
  93.     else
  94.         echo "[error]:`date '+%Y%m%d %H:%M:%S'`> the number of parameters is incorrect!"
  95.     fi
  96.     
  97. :<<EOF
  98.     if [ $LOG_OUT_TYPE = "print" ];then
  99.         echo "[error]:`date`> $log_msg"
  100.     else
  101.         echo "[error]:`date`> $log_msg" >> $MYSQL_INSTALL_LOG
  102.     fi
  103. EOF
  104.     case $LOG_OUT_TYPE in
  105.         out)
  106.              echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"
  107.              ;;
  108.         log)
  109.              echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
  110.              ;;
  111.         all)
  112.              echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg"
  113.              echo  "[error]:`date '+%Y%m%d %H:%M:%S'`> $log_msg" >> $MYSQL_INSTALL_LOG
  114.              ;;
  115.         *)
  116.     esac
  117. }

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

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

  129.     # 检查存放安装包目录是否存在
  130.     if [ ! -d "$MYSQL_INSTALLER_DIR" ];then
  131.         log_error "the mysql installer directory $MYSQL_INSTALLER_DIR didn't exists, please check it"
  132.         exit 1
  133.     else
  134.         log_info "the mysql installer directory $MYSQL_INSTALLER_DIR exist, mysql auto install continue...";
  135.     fi
  136.     
  137.     # 检查MySQL安装文件是否存在
  138.     if [ ! -f "$MYSQL_INSTALLER" ];then
  139.         log_error "the mysql installer file $MYSQL_INSTALLER didn't exist, please check it"
  140.         exit 1
  141.     else
  142.         log_info  "the mysql installer file $MYSQL_INSTALLER exist, mysql auto install continue..."
  143.     fi
  144.     
  145.     # 检查MySQL的my.cnf的模板文件是否存在
  146.     if [ ! -f $MYSQL_CONFIG_FILE ];then
  147.         log_error "the mysql configuration template file $MYSQL_CONFIG_FILE did'nt exist, please check it"
  148.         exit 1
  149.     else
  150.         log_info "the mysql configuration  template file $MYSQL_CONFIG_FILE exists,mysql auto install continue..."
  151.     fi
  152.     
  153.     # 检查修改mysql数据库用户root密码的SQL文件是否存在。
  154.     if [ ! -f $SQL_ALTER_USER_PWD ];then
  155.         log_error "the sql file $SQL_ALTER_USER_PWD did'nt exist, please check it"
  156.         exit 1
  157.     else
  158.         log_info "the sql file $SQL_ALTER_USER_PWD exists,mysql auto install continue..."
  159.     fi
  160.     
  161.     
  162.     # 检查MySQL安装目录的上层目录是否存在
  163.     if [ ! -d "$MYSQL_BASE_DIR" ];then
  164.         log_error "the $MYSQL_BASE_DIR didn't exists, please check it"
  165.         exit 1
  166.     else
  167.         log_info "the $MYSQL_BASE_DIR exists, mysql auto install continue..."
  168.     fi
  169.     
  170.     # 检查MYSQL_DATA_DIR对应的目录是否存在,此目录为datadir的上一层目录
  171.     if [ ! -d "$MYSQL_DATA_DIR" ];then
  172.         log_error "the $MYSQL_DATA_DIR didn't exists, please check it"
  173.         exit 1
  174.     else
  175.         log_info "the $MYSQL_DATA_DIR exists, mysql auto install continue..."
  176.     fi
  177.     
  178.     # 检查MYSQL_DATA_DIR目录下是否存在其目录,如果有其它目录,则退出安装(担心已经安装了MySQL实例)
  179.     if [ -d ${MYSQL_DATA_DIR} -a "`ls -A ${MYSQL_DATA_DIR}`" != "" ];then
  180.         log_error "the $MYSQL_DATA_DIR directory have exists files,plese check it"
  181.         exit 1
  182.     else 
  183.         log_info "the $MYSQL_DATA_DIR check is ok ,mysql auto install continue..."
  184.     fi
  185.     
  186.     # 验证MySQL安装介质的MD5
  187.     
  188.     
  189.     # 检查是否存在MySQL实例
  190.     mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:'${MYSQL_PORT}'/) {print "Yes";exit 0}}'`
  191.     echo $mysql_status
  192.     if [ "$mysql_status" = "Yes" ];then
  193.         log_error "MySQL instance exists. please check it"
  194.         exit 1
  195.     else
  196.         #只能作为一个依据,并不能完全保证。
  197.         log_info "MySQL instance didn't exists,mysql auto install continue..."
  198.     fi
  199.     
  200.     echo "check_env_setting run successful."
  201.     #read ANS
  202.     read -n1 -p "Do you want to continue [Y/N]?" answer
  203.     case $answer in
  204.         Y | y)
  205.             log_info "mysql auto install continue...";;
  206.         N | n)
  207.             log_info "mysql auto install exit.";;
  208.         *)
  209.             log_error "your choice is wrong!";;
  210.     esac

  211. }

  212. # 创建MySQL用户和用户组(此处注释,用户由系统管理员创建)
  213. #echo '[info]: create the mysql user...'
  214. #groupadd mysql
  215. #/usr/sbin/groupadd mysql
  216. #useradd -g mysql mysql
  217. #/usr/sbin/useradd -g mysql mysql


  218. # 创建MySQL的相关目录
  219. function create_mysql_dir()
  220. {
  221.     cd $MYSQL_DATA_DIR
  222.     mkdir conf data  logs  slow_logs  bin_logs  mysql_temp
  223.     chmod 750  $MYSQL_DATA_DIR
  224.     #对目录进行授权
  225.     chmod -R 760  $MYSQL_DATA_DIR/bin_logs
  226.     chmod -R 700  $MYSQL_DATA_DIR/logs
  227.     chmod -R 760  $MYSQL_DATA_DIR/slow_logs
  228. }

  229. function mysql_cnf_setting()
  230. {
  231.     # 拷贝my.cnf的模板配置文件,这里不打算直接写入生成my.cnf文件
  232.     cp $MYSQL_CONFIG_FILE $MYSQL_DATA_DIR/conf/my.cnf
  233.     if [ $? -ne 0 ];then
  234.         log_error 'failed to cp the my.cnf,please check it'
  235.         exit 1
  236.     else
  237.         log_info  "cp the $MYSQL_CONFIG_FILE to my.cnf success!"
  238.     fi
  239. }

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



  252. # 解压MySQL的二进制安装包
  253. function mysql_install()
  254. {
  255.     echo '[info]:unzip the mysql installation media....'
  256.     tar -xvf $MYSQL_INSTALLER -C $MYSQL_BASE_DIR
  257.     if [ $? -ne 0 ];then
  258.         log_error "mysql media unzip failed,please check the detail."
  259.         exit
  260.     else
  261.         log_info  "mysql media unzip success,mysql auto install continue..."
  262.     fi
  263.     
  264.     # 创建软连接
  265.     local MYSQL_MEDIA_DIR=$(basename ${MYSQL_INSTALLER} '.tar.xz')
  266.     #echo  $MYSQL_MEDIA_DIR
  267.     ln -s $MYSQL_BASE_DIR/$MYSQL_MEDIA_DIR  $MYSQL_BASE_DIR/mysql8.0
  268.     if [ $? -ne 0 ];then
  269.         log_error "create the mysql soft link failed, please check it"
  270.         exit 1
  271.     else
  272.         log_info "create the mysql soft link success,mysql auto install continue..."
  273.     fi
  274.     
  275.     
  276.     #  初始化MySQL
  277.     cd $MYSQL_BASE_DIR/mysql8.0
  278.     $MYSQL_BASE_DIR/mysql8.0/bin/mysqld \
  279.     --defaults-file=$MYSQL_DATA_DIR/conf/my.cnf \
  280.     --initialize \
  281.     --basedir=$MYSQL_BASE_DIR/mysql8.0 \
  282.     --datadir=$MYSQL_DATA_DIR/data  2>&1 | >> $MYSQL_INSTALL_LOG
  283.     
  284.     #
  285.     $MYSQL_BASE_DIR/mysql8.0/bin/mysql_ssl_rsa_setup --datadir=$MYSQL_DATA_DIR/data
  286. }


  287. function mysql_startup()
  288. {
  289.     $MYSQL_BASE_DIR/mysql8.0/bin/mysqld_safe --defaults-file=$MYSQL_DATA_DIR/conf/my.cnf &
  290.     
  291.     # 休眠几秒,等待MySQL服务启动
  292.     sleep 15
  293.     
  294.     # 检查MySQL服务是否启动成功
  295.     mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:'${MYSQL_PORT}'/) {print "Yes";exit 0}}'`
  296.     echo $mysql_status
  297.     if [ "$mysql_status" != "Yes" ];then
  298.         log_error "MySQL did not start. please check it"
  299.         exit 1
  300.     else
  301.         log_info "MySQL start success,mysql auto install continue..."
  302.     fi
  303. }

  304. # 修改MySQL的root用户密码
  305. function change_mysql_root_pwd()
  306. {

  307.     # 获取root初始密码
  308.     mysql_root_init_passd=`grep "temporary password" $MYSQL_DATA_DIR/logs/mysql_error.log |awk '{print $NF}'`
  309.     
  310.     # 修改MySQL的root密码
  311.     mysql -uroot -p"$mysql_root_init_passd" --connect-expired-password < $SQL_ALTER_USER_PWD 2> /dev/null
  312.     
  313.     if [ $? -ne 0 ];then
  314.         log_error 'fail to perform MySQL operation!!!'
  315.         exit 1
  316.     else
  317.         log_info "alter the mysql user root's password succeed!"
  318.     fi
  319. }


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

  332. }

  333. function main() {
  334.         check_env_setting
  335.         create_mysql_dir
  336.         mysql_cnf_setting
  337.         mysql_env_setting
  338.         mysql_install
  339.         mysql_startup
  340.         change_mysql_root_pwd
  341.     
  342.         if [ $? -ne 0 ];then
  343.             log_error "change_mysql_root_pwd run failed!"
  344.         else    
  345.             log_info "the mysql auto install was successful!"
  346.         fi
  347.         mysql_security_setting
  348. }
  349. # invoke main function
  350. main 
复制代码
下面是安装测试过程的截图
下面是安装日志mysql_install.log的输出信息截图:
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:https://www.cnblogs.com/kerrycode/p/17524379.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x

举报 回复 使用道具