只需几十秒即可在linux环境下部署一个完整的mysql服务【自动化部署脚本】

🍁博主简介
        🏅云计算领域优质创作者
        🏅2022年CSDN新星计划python赛道第一名

        🏅2022年CSDN原力计划优质作者
        🏅阿里云ACE认证高级工程师
        🏅阿里云开发者社区专家博主

💊交流社区:CSDN云计算交流社区欢迎您的加入!

目录

1、脚本执行过程展示

2、自动化部署脚本说明

2.1 auto_install.sh文件说明

2.2 install.ini文件说明

2.2 config_example目录说明

2.3 logs目录说明

2.4 packages目录说明

3、自动化部署脚本全部代码


1、脚本执行过程展示

 

2、自动化部署脚本说明

因为此脚本功能比较全面,完全做到了自动化部署且可以随意自定义任何参数,所以由五个部分组成:

2.1 auto_install.sh文件说明

auto_install.sh为自动化部署脚本,只需要./auto_install.sh执行脚本,然后等待几十秒mysql服务就部署成功并启动了

2.2 install.ini文件说明

install.ini为脚本的一个配置文件,脚本中所有需要的变量值都是通过此文件来调用

文件内容如下:

cat install.ini

[mysql]
#mysql服务安装路径,默认为/opt
base_dir = /opt
#mysql数据存放路径,默认为/fydata/mysql/data
datadir_mysql = /xpdata/mysql/data
#mysql日志文件存放路径,默认为/fydata/mysql/logs
logsdir_mysql = /xpdata/mysql/logs
#mysql服务root用户的新密码
root_newpwd = root_test
#数据库的普通用户和密码
user = xiaopeng
user_pwd = xiaopeng_passwd

由此可以看出,执行脚本之前我们可以先修改此文件里的参数,所有参数都可以自定义为自己所需的值,脚本执行过程中的变量值都是读取此文件内容

2.2 config_example目录说明

config_example为mysql的配置文件模板,我已写好放入此目录,无需更改

mysql部署完成后会字段将此模板引入到配置文件路径,并且进行内容替换,替换的内容为install.ini文件中自定义好的值

cat config_example/my.cnf 

[client]
port                                    = 3306
socket                                  = /tmp/mysql.sock
default-character-set                   = utf8

[mysql]
default-character-set                   = utf8

[mysqld]
port=3306
user=mysql
datadir=Datadir_Mysql
log_error=Logsdir_Mysql/error.log
socket                                  = /tmp/mysql.sock
pid_file                                = Logsdir_Mysql/mysql.pid
slow-query-log                          = ON
slow_query_log_file                     = Logsdir_Mysql/slow_query.log
innodb_buffer_pool_size                 = 4G
server-id                                 = 59173
log-bin                                 = Logsdir_Mysql/mysql-bin
relay-log                               = Logsdir_Mysql/mysql-relay-bin
lower_case_table_names=1

2.3 logs目录说明

此文件存放的是脚本安装过程的日志

脚本执行过程中每一步操作都会打印日志到此路径下的文件中,脚本执行过程报错了可以在此目录下的日志文件中查看 

此目录下默认是没有任何文件的,也不需要手动创建,脚本执行过程中会自动生成日志文件

2.4 packages目录说明

此目录下存放的是mysql服务的安装包,本来是想写成智能化的直接wget下载安装包然后直接部署的脚本,但是想了想服务部署环境大部分为离线环境,还是手动把安装包传上来吧。

此目录下存放的mysql安装包可以是任何版本的,也可使是多种压缩方式的,脚本会自动进行识别并解压安装,目前支持的压缩格式如下:

3、自动化部署脚本全部代码

#!/bin/bash

Script_Path=`pwd`

function readINI(){
    FILENAME=$1; SECTION=$2; KEY=$3
    RESULT=`awk -F '=' '/\['$SECTION'\]/{a=1}a==1&&$1~/'$KEY'/{print $2;exit}' $FILENAME`
    echo $RESULT
}

function install_mysql() {
    
    echo > $Script_Path/logs/install_mysql.log
    echo "===============================================================mysql=============================================================="
    Base_Dir=$(readINI $Script_Path/install.ini mysql base_dir)
    if [ ! -d "$Base_Dir" ];then
      mkdir -p $Base_Dir
    fi
    echo  "
    		    ┌────────────────────────────────────────────────────────────────??????????????????????????──────┐
    		    │                                                                                                │
    		    │                             ? Linux环境下一键部署MySQL服务 ?                                   │
    		    │                         (One-click deployment of MySQL services in Linux)                      │
    		    │                                                                                                │
    		    │                ? Description        :  基于Linux环境,实现MySQL一键式部署                      │
    		    │                ? Author             :  小鹏linux  		                             │
    		    │                ? E-Mail             :  axp_007@126.com                                         │
    		    │                ? Script Version     :  v1.0                                                    │
    		    │                                                                                                │
    		    └──────────────────────────────────────────────────────────────────────??????????????????????????┘
    "
    echo
    echo "--------------------------------------------------------------------------------------"
    echo "1、正在建立mysql用户和mysql用户组..."
    id mysql
    if [ `echo $?` -eq 0 ];then
      userdel mysql
      groupadd mysql
      useradd -r -g mysql mysql
      echo "已删除mysql用户和用户组并重新建立组!"
    else
      groupadd mysql
      useradd -r -g mysql mysql
      echo "mysql用户和组创建完成!"
    fi
    echo "--------------------------------------------------------------------------------------"
    sleep 1
    
    echo "--------------------------------------------------------------------------------------"
    echo "2、正在解压并安装mysql服务..."
    cd $Script_Path/packages/
    Mysql_Pag=`ls | grep mysql`
    case $Mysql_Pag in
      *.tar)       tar xvf  $Mysql_Pag -C $Base_Dir ;;
      *.tgz)       tar xvf  $Mysql_Pag -C $Base_Dir ;;
      *.tar.bz2)   tar xvf  $Mysql_Pag -C $Base_Dir ;;
      *.tar.gz)    tar zxf  $Mysql_Pag -C $Base_Dir ;;
      *.rar)       rar x    $Mysql_Pag -C $Base_Dir ;;
      *.zip)       unzip    $Mysql_Pag -C $Base_Dir ;;
      *.xz)        xz -d    $Mysql_Pag -C $Base_Dir ;;
      *.lzo)       lzo -dv  $Mysql_Pag -C $Base_Dir ;;
      *.7z)        7z x     $Mysql_Pag -C $Base_Dir ;;
      *)           echo  "请上传正确的mysql安装包到$Script_Path/packages目录下!"
    esac
    cd $Base_Dir && rm -rf mysql && mv `ls | grep mysql` mysql
    if [ `echo $?` -eq 0 ];then
      echo "mysql服务已解压并安装完成!"
    else
      echo "mysql服务安装失败!"
      exit 0
    fi
    echo "--------------------------------------------------------------------------------------"
    sleep 1
    
    echo "--------------------------------------------------------------------------------------"
    echo "3、正在创建mysql数据和日志目录及配置文件..."
    Datadir_Mysql=$(readINI $Script_Path/install.ini mysql datadir_mysql)
    Logsdir_Mysql=$(readINI $Script_Path/install.ini mysql logsdir_mysql)
    if [ ! -d $Datadir_Mysql ];then
      mkdir -p $Datadir_Mysql
    fi
    if [ ! -d $Logsdir_Mysql ];then
      mkdir -p $Logsdir_Mysql
    fi
    touch $Logsdir_Mysql/error.log
    #给目录递归赋予mysql所有者和所属组
    chown -R mysql:mysql $Datadir_Mysql/../
    if [ ! -d $Base_Dir/mysql/conf ];then
      mkdir -p $Base_Dir/mysql/conf
    fi
    \cp $Script_Path/config_example/my.cnf $Base_Dir/mysql/conf/
    sed -i "s!Datadir_Mysql!$Datadir_Mysql!g" $Base_Dir/mysql/conf/my.cnf
    sed -i "s!Logsdir_Mysql!$Logsdir_Mysql!g" $Base_Dir/mysql/conf/my.cnf
    echo "mysql数据和日志目录及配置文件已创建完成!"
    echo "--------------------------------------------------------------------------------------"
    sleep 1
    
    echo "--------------------------------------------------------------------------------------"
    echo "4、正在初始化mysql..."
    cd $Base_Dir/mysql/bin/
    echo >$Logsdir_Mysql/error.log
    ./mysqld --defaults-file=$Base_Dir/mysql/conf/my.cnf --initialize --basedir=$Base_Dir/mysql
    cat $Logsdir_Mysql/error.log
    Root_Oldpwd=`cat $Logsdir_Mysql/error.log | grep "A temporary password is generated for root@localhost" | awk '{print $NF}'`
    if [ -z "$Root_Oldpwd" ];then
      echo "mysql初始化失败!"
      exit 0
    else
      echo "mysql初始化完成!"
    fi
    echo "--------------------------------------------------------------------------------------"
    sleep 1
    
    echo "--------------------------------------------------------------------------------------"
    echo "5、正在启动mysql服务..."
    #配置环境变量:
    sed -i '/MYSQL_HOME/d' /etc/profile
    cat >>/etc/profile <<EOF
    export MYSQL_HOME=$Base_Dir/mysql
    export PATH=\$MYSQL_HOME/bin:\$PATH
EOF
    source /etc/profile
    #创建软连接
    if [ -z `ls /etc/init.d | grep -w "mysql"` ];then
      ln -s $Base_Dir/mysql/support-files/mysql.server /etc/init.d/mysql
    else
      \rm /etc/init.d/mysql && ln -s $Base_Dir/mysql/support-files/mysql.server /etc/init.d/mysql
    fi
    if [ -z `ls /usr/bin | grep -w "mysql"` ];then
      ln -s $Base_Dir/mysql/bin/mysql /usr/bin/mysql
    else
      \rm /usr/bin/mysql && ln -s $Base_Dir/mysql/bin/mysql /usr/bin/mysql
    fi
    
    cd $Base_Dir/mysql/bin/
    if [ `ps axu | grep mysql | grep -v "grep" | grep -v "tee" | wc -l` -eq 0 ];then
      nohup ./mysqld_safe --defaults-file=$Base_Dir/mysql/conf/my.cnf >> $Logsdir_Mysql/error.log 2>&1 &
      sleep 3
      if [ `ps axu | grep mysql | grep -v "grep" | grep -v "tee" | wc -l` -eq 0 ];then
        echo "mysql服务启动失败!详情请查看$Logsdir_Mysql/error.log日志内容"
        exit 0
      else
        ps axu | grep mysql | grep -v "grep" | grep -v "tee"
        echo "mysql服务已启动!"
      fi
    else
      echo "已经有mysql进程存在..."
      echo "正在杀死已有的mysql进程..."
      ps axu | grep mysql | grep -v "grep" | grep -v "tee" | awk '{print $2}' | xargs kill -9
      echo "已杀死旧的mysql进程,正在启动新的mysql进程..."
      nohup ./mysqld_safe --defaults-file=$Base_Dir/mysql/conf/my.cnf >> $Logsdir_Mysql/error.log 2>&1 &
      sleep 3
      if [ `ps axu | grep mysql | grep -v "grep" | wc -l` -eq 0 ];then
        echo "新的mysql服务启动失败!详情请查看$Logsdir_Mysql/error.log日志内容"
        exit 0
      else
        echo "新的mysql服务已启动!"
      fi
    fi
    echo "--------------------------------------------------------------------------------------"
    sleep 1
    
    echo "--------------------------------------------------------------------------------------"
    echo "6、正在登录mysql修改密码..."
    Root_Newpwd=$(readINI $Script_Path/install.ini mysql root_newpwd)
    User=$(readINI $Script_Path/install.ini mysql user)
    User_Pwd=$(readINI $Script_Path/install.ini mysql user_pwd)
    mysql -uroot -p"$Root_Oldpwd" --connect-expired-password   -e  "
    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('$Root_Newpwd');
    create user $User@'%' identified by '$User_Pwd';
    grant all privileges on *.* to '$User'@'%' identified by '$User_Pwd';
    flush privileges;
    exit"
    
    echo "mysql密码已修改,新密码可通过$Script_Path/$Script_Path/install.ini文件内容查看!"
    echo "root用户新密码为:$Root_Newpwd"
    echo "$User 普通用户密码为:$User_Pwd"
    echo "--------------------------------------------------------------------------------------"
    sleep 1
    
    echo "--------------------------------------------------------------------------------------"
    echo "7、正在创建测试数据库..."
    mysql -u$User -p"$User_Pwd" --connect-expired-password -e  "
    create database xiaopeng001;
    create database xiaopeng002;
    create database xiaopeng003;
    exit"
    
    echo "已创建测试数据库"
    echo "--------------------------------------------------------------------------------------"
    sleep 1
}
install_mysql | tee -a $Script_Path/logs/install_mysql.log 2>&1

脚本和调用的文件目录全部都打包成了一个压缩包,有需要的自提

对此脚本有疑惑或者优化建议的小伙伴欢迎交流

压缩包下载地址: https://download.csdn.net/download/qq_62294245/89119618

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/534972.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

植物大战僵尸Python版,附带源码注解

目录 一、实现功能 二、安装环境要求 三、如何开始游戏 四、怎么玩 五、演示 六、部分源码注释 6.1main.py 6.2map.py 6.3Menubar.py 七、自定义 7.1plant.json 7.2zombie.json 一、实现功能 实施植物&#xff1a;向日葵、豌豆射手、壁桃、雪豆射手、樱桃炸弹、三…

Oracle体系结构:聊聊session与process

提前声明&#xff1a;本篇文章讨论的是专用服务器模式下的session和process&#xff1b;不讨论共享服务器模式&#xff0c;因为共享服务器现在真的应用的很少了&#xff0c;独占才是主流。共享服务器往往都是用在资源紧张的场合 &#xff0c;而且独占服务器模式有独立的PGA&…

stable-diffusion-webui怎么样增加自己训练的LoRA模型?

不怕笑话,我曾经为了找这个功能,居然搞了半天时间,结果还没有搞定。 后来再不断地研究各种教程,就是没有发现这个功能,无意间发现有一个人贴了一张图片, 他只是介绍放到这个目录,他没有告诉我这个目录怎么样来的,因为我在同样的位置上没有这个目录。 这样我训练出来…

探究 ChatGPT 的心脏--Transformer(基础知识第一篇)

Transformer 是 ChatGPT 的核心部分&#xff0c;如果将 AI 看做一辆高速运转的汽车&#xff0c;那么 Transformer 就是最重要的引擎。它是谷歌于 2017 年发表的《Attention is All You Need》中提出的 Sequence-to-sequence 的模型&#xff0c;诞生之后便一统江湖&#xff0c;在…

Flutter学习11 - Future 与 FutureBuilder

1、Future 可以利用 Future 实现异步调用 1.1、Future 的两种形式 自定义一个结果类 class Response {String _data;Response(this._data); }自定义方法实现 Future Future<Response> testFuture() {var random Random();int randomNumber random.nextInt(10);if …

DHCP抓包分析

DHCP动态路由配置协议&#xff0c;是C/S架构&#xff0c;由DHCP服务器为客户端动态分配IP信息。 DHCP客户端首次接入网络数据交互过程&#xff1a; 如何解决IP地址的冲突&#xff1a; ▫ DHCP服务器端&#xff1a;收到DHCP DISCOVER报文时&#xff0c;给客户端分配IP地址前会发…

智能运维场景 | 科技风险预警,能实现到什么程度?

[ 原作者&#xff1a;擎创夏洛克&#xff0c;本文略做了节选和改编 ] 每次一说到“风险预警”&#xff0c;就会有客户问我们能做怎样的风险预警。实际上在智能运维厂商来说&#xff0c;此风险非彼风险&#xff0c;不是能做银行的业务上的风险预警&#xff08;比如贷款风险等&a…

自动化测试框架 Selenium(3)

目录 1.前言 2.等待方式 2.1死等 2.2智能等待 3.游览器操作 3.1游览器最大化 3.2设置游览器的宽 高 3.3 游览器的前进和后退 3.4游览器滚动条 1.前言 本篇博客,我们将继续Selenium自动化测试的学习.在前面的章节中,俺介绍了Selenium是怎么回事,和键盘鼠标操作.还有url和…

2024年第十七届 认证杯 网络挑战赛 (A题)| 保暖纤维的保暖能力 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看认证杯 网络挑战赛 (A题&#xff09;&#xff01…

ruoyi-nbcio-plus基于vue3的flowable的支持自定义业务流程处理页面detail.vue的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Qt | 信号与槽 原理、连接、断开(面试无忧)

1、信号和槽是用于对象之间的通信的,这是 Qt 的核心。为此 Qt 引入了一些关键字,他们是slots、signals、emit,这些都不是 C++关键字,是 Qt 特有的,这些关键字会被 Qt 的 moc转换为标准的 C++语句。 2、Qt 的部件类中有一些已经定义好了的信号和槽,通常的作法是子类化部件…

2023年上半年信息系统项目管理师——综合知识真题与答案解释(1)

2023年上半年信息系统项目管理师 ——综合知识真题与答案解释(1) 零、00时光宝盒 1009 Rejections 1009 拒绝 Once, there was an old man, who was broke, living in a tiny house and owned a beat-up car. 有一次&#xff0c;有一个老人&#xff0c;他破产了&#…

谷歌google浏览器无法更新Chrome至最新版本怎么办?浏览器Chrome无法更新至最新版本

打开谷歌google浏览器提示&#xff1a;无法更新Chrome&#xff0c;Chrome无法更新至最新版本&#xff0c;因此您未能获得最新的功能和安全修复程序。点击「重新安装Chrome」后无法访问此网站&#xff0c;造成谷歌浏览器每天提示却无法更新Chrome至最新版本。 谷歌google浏览器无…

Netty源码解析-服务启动过程

文章目录 前言简单Netty服务器启动代码示例主线NioEventLoopGroup初始化关键代码 前言 Netty是一个高性能、异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。它的服务启动过程涉及多个组件和步骤&#xff0c;下面我将对Netty的服务启动…

OpenAI推出GPTBot网络爬虫:提升AI模型同时引发道德法律争议

文章目录 一、GPTBot 简介二、功能特点三、技术细节3.1、用户代理标识3.2、数据采集规则3.3、数据使用目的3.4、网站屏蔽方法3.5、数据过滤 四、GPTBot 的道德和法律问题五、GPTBot 的使用方法和限制六、总结 一、GPTBot 简介 OpenAI 推出的网络爬虫GPTBot旨在通过从互联网上收…

腾讯云向量数据库——RAG七天入门课笔记

目录 前言一、RAG介绍1-0、引言-大语言模型的不足1-1、向量数据库定义1-2、工作原理1-3、优点1-4、与传统数据库的区别1-5、RAG应用痛点 二、数据处理的难点——解析和拆分2-1、复杂文档格式-解析过程中的问题2-2、复杂文档解决流程2-3、Chunk拆分的问题以及如何改进 三、相似性…

【GitHub技术全面解析及游戏开发者的应用】

GitHub技术全面解析及游戏开发者的应用 GitHub作为全球最大的开源代码托管平台&#xff0c;不仅为软件开发者提供了一个强大的工具&#xff0c;也为游戏开发者带来了前所未有的便利。在游戏开发领域&#xff0c;GitHub的技术可以帮助开发者更高效地管理代码、协作开发、分享资…

10 - 镜像管理之:部署高可用harbor

之前介绍了部署单点harbor&#xff0c;这里重点说下Harbor高可用集群方案的部署&#xff0c;目前主要有两种主流的Harbor高可用集群方案&#xff1a; 1&#xff09;双主复制 2&#xff09;多harbor实例共享后端存储 1 Harbor双主复制高可用集群 1.1 主从同步 harbor官方默认提供…

arm64位系统中编译ffmpeg

大致过程仍然和x86平台一致&#xff1a; ./configure xxxxmakemake install 所需要变化的是需要在 ./configure xxxx 后面多加几个编译选项 cd ffmpeg ./configure (x64下的依赖配置&#xff1a;......)--prefixbin --archaarch64 --target-oslinux --enable-cross-compile …

redis的客户端操作

文章目录 前言Java客户端Jedis准备工作引入JedisJedis的基本使用方法String类型的操作List类型操作Hash类型操作Set类型操作Zet类型的操作 JavaSpring客户端创建项目引入SpringDataRedis配置 redis 服务地址创建 Controller具体实例 前言 Redis是用单线程来处理多个客户端的访…