shell脚本自动安装MySQL8

  • 环境:centos7
  • 版本:8.0.28
  • 安装包:mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz 二进制包
  • 要求:安装包和shell脚本在同一目录下
  • 执行方式:sudo ./install_mysql8.sh
shell 复制代码
#!/bin/bash


# 定义MySQL安装目录和压缩包名称

MYSQL_DIR="/usr/local/mysql-8.0.28-linux-glibc2.12-x86_64"

MYSQL_TAR="mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz"

  

# 检查MySQL目录是否存在,不存在则解压并创建符号链接

if [ ! -d "$MYSQL_DIR" ]; then

    echo "正在解压MySQL安装包..."

    tar -xvf "$MYSQL_TAR" -C /usr/local/

    ln -s "$MYSQL_DIR" /usr/local/mysql

else

    echo "MySQL安装包已存在,跳过解压。"

fi

  

# 检查MySQL用户是否存在,不存在则创建

if ! id -u mysql >/dev/null 2>&1; then

    echo "正在创建MySQL用户和组..."

    groupadd mysql

    useradd -r -g mysql -s /bin/false mysql

else

    echo "MySQL用户已存在,跳过创建。"

fi

  

# 检查MySQL配置文件是否存在,不存在则创建

if [ ! -f /etc/mysql/my.cnf ]; then

    echo "正在创建MySQL配置文件..."

    mkdir -p /etc/mysql

    cat > /etc/mysql/my.cnf <<EOF

[client]

socket=/var/lib/mysql/mysql.sock

  

[mysql]

prompt=(\\u@\\h) [\\d]>\\_    # 更改MySQL客户端命令>前面显示内容

  

[mysqld]

port=3306

user=mysql

socket=/var/lib/mysql/mysql.sock

datadir=/usr/local/mysql/data

log_error=error.log

EOF

else

    echo "MySQL配置文件已存在,跳过创建。"

fi

  

# 检查MySQL数据目录是否存在,不存在则初始化数据库

if [ ! -d /usr/local/mysql/data ]; then

    echo "正在初始化MySQL数据库..."

    cd /usr/local/mysql

    mkdir -p mysql-files

    chown mysql:mysql mysql-files

    chmod 750 mysql-files

    bin/mysqld --initialize --user=mysql

  

    # 获取临时root密码

    echo "等待MySQL生成临时密码..."

    for i in {1..30}; do

        if [ -f /usr/local/mysql/data/error.log ]; then

            temp_password=$(grep 'temporary password' /usr/local/mysql/data/error.log | awk '{print $NF}')

            if [ -n "$temp_password" ]; then

                echo "MySQL临时密码: $temp_password"

                break

            fi

        fi

        sleep 1

    done

  

    if [ -z "$temp_password" ]; then

        echo "无法获取MySQL临时密码,请检查/usr/local/mysql/data/error.log"

        exit 1

    fi

else

    echo "MySQL数据目录已存在,跳过初始化。"

fi

  

# 检查systemd服务文件是否存在,不存在则创建

if [ ! -f /etc/systemd/system/mysqld.service ]; then

    echo "正在创建systemd服务文件..."

    cat > /etc/systemd/system/mysqld.service <<EOF

[Unit]

Description=MySQL Server

After=network.target

  

[Service]

User=mysql

Group=mysql

ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/mysql/my.cnf

ExecStop=/usr/local/mysql/bin/mysqladmin shutdown

Restart=on-failure

  

[Install]

WantedBy=multi-user.target

EOF

else

    echo "systemd服务文件已存在,跳过创建。"

fi

  

if [ ! -d /var/lib/mysql/ ]; then

    mkdir /var/lib/mysql/

    chown -R mysql:mysql /var/lib/mysql

    chmod 750 /var/lib/mysql

else

    echo "/var/lib/mysql目录已存在,跳过创建。"

fi

  

# 启动并启用MySQL服务

systemctl daemon-reload

systemctl start mysqld

systemctl enable mysqld

  

# 配置环境变量

if ! grep -q '/usr/local/mysql/bin' /etc/profile; then

    echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile

    # 直接修改当前 Shell 的环境变量

    export PATH=$PATH:/usr/local/mysql/bin

    echo "环境变量已添加到 /etc/profile 并立即生效。"

    echo "如需全局生效,请手动执行以下命令:"

    echo "source /etc/profile"

else

    echo "环境变量已配置,跳过。"

fi

  

# 检查MySQL是否安装成功

if mysql --version >/dev/null 2>&1; then

    echo "MySQL 8 安装成功!"

else

    echo "MySQL 安装失败,请检查日志。"

    exit 1

fi
相关推荐
lightqjx1 小时前
【Linux系统】基础 IO
linux·c语言·重定向·缓冲区·文件io·文件的系统调用
我星期八休息1 小时前
扩展— TCP 全连接队列与 tcpdump 抓包
linux·服务器·开发语言·前端·网络·tcp/ip·tcpdump
RisunJan1 小时前
Linux命令-skill(发送信号给进程)
linux·运维·服务器
潘正翔1 小时前
k8s基础_kubeadm搭建k8s集群
linux·运维·docker·云原生·容器·kubernetes
【心态好不摆烂】2 小时前
MySQL——复合查询
数据库·mysql
孪生质数-2 小时前
AI 应用实践篇——让大模型真正开始工作
linux·运维·服务器·人工智能·深度学习·语言模型·llama
2301_777998342 小时前
Linux线程同步与互斥(三):信号量与环形队列实现生产者消费者模型
linux·c语言·c++
瞬间&永恒~2 小时前
【MySQL】 InnoDB 锁等待排查与并发压测实验
运维·数据库·mysql
烟漠河洛2 小时前
俄罗斯电商3200亿卢布疯长:跨境支付与多平台订单系统架构解析
mysql·php
实心儿儿3 小时前
Linux —— 应用层协议HTTP
linux·网络·http