【Shell脚本】一键自动化安装MySQL数据库详解

在日常的运维工作和开发环境搭建中,频繁的手动安装配置MySQL数据库既耗时又容易出错。本文介绍一个功能完整的Shell脚本,实现MySQL数据库的全自动安装和配置,支持主流的Linux发行版。

脚本功能概述

这个Shell脚本主要完成以下任务:

  • 自动检测系统类型(RHEL/CentOS/Ubuntu/Debian)
  • 清理旧版本MySQL(避免安装冲突)
  • 自动安装MySQL服务器
  • 配置MySQL安全设置(root密码、移除测试数据库等)
  • 设置防火墙规则(开放3306端口)
  • 验证安装结果

1. 环境检测机制

#!/bin/bash
# 指定脚本使用bash解释器执行

# 加载系统发行版信息
. /etc/os-release

详解

  • #!/bin/bash 告诉系统使用哪个解释器来执行脚本
  • . /etc/os-release 是source命令的简写,用于加载系统的发行版信息文件
  • /etc/os-release 文件包含了系统的ID、版本号等信息,这是Linux标准化组织制定的规范

执行过程
当脚本运行时,系统会首先读取/etc/os-release文件,将其中的变量(如IDVERSION_ID等)加载到当前shell环境中。这样我们就可以通过判断$ID变量的值来识别当前是哪种Linux发行版。

2. 变量定义与配置管理

# 定义变量
mysql_version="8.0"
mysql_root_password="123456"

详解

  • 在Shell脚本中,变量定义不需要声明类型,直接使用变量名=值的形式
  • 变量名通常使用小写,避免与系统环境变量冲突
  • 使用变量时要在前面加上$符号,如$mysql_root_password
  • 将配置信息提取为变量的好处是便于维护和修改

3. 彩色警告

# 颜色输出函数
tip() {
    GREEN="\033[32m"
    YELLOW="\033[33m"
    RED="\033[31m"
    NC="\033[0m"
    
    case $1 in
        "info") echo -e "${GREEN}[INFO]${NC} $2" ;;
        "warn") echo -e "${YELLOW}[WARN]${NC} $2" ;;
        "error") echo -e "${RED}[ERROR]${NC} $2" ;;
        *) exit 1 ;;
    esac
}

详解

  • \033[32m 是ANSI转义序列,用于控制终端文本颜色
  • 32m 表示绿色,31m表示红色,33m表示黄色
  • \033[0m 用于重置文本属性到默认值
  • -e 参数让echo命令能够解析转义序列
  • 函数接收两个参数:$1是消息类型,$2是消息内容

执行流程
当调用tip "info" "开始安装..."时:

  1. 函数根据第一个参数匹配到info分支
  2. 使用绿色输出[INFO] 开始安装...
  3. 用户通过颜色就能快速识别消息的重要程度

4. 清理旧版本 - 避免依赖冲突

# 1. 清理旧版本(可选)
clear_old_mysql() {
    tip "info" "清理旧版本MySQL..."
    
    if [ "$ID" == "rhel" ]; then
        dnf remove -y mysql mysql-server &>/dev/null
    elif [[ "$ID" == "debian" || "$ID" == "ubuntu" ]]; then
        apt remove -y mysql-server mysql-client &>/dev/null
    fi
    
    rm -rf /var/lib/mysql /etc/mysql
    tip "info" "清理完成"
}

详解

  • &>/dev/null 将标准输出和错误输出都重定向到空设备,实现静默执行
  • dnf 是RHEL/CentOS 8+的包管理器,apt是Debian/Ubuntu的包管理器
  • rm -rf 递归强制删除目录
  • /var/lib/mysql 是MySQL的数据文件目录
  • /etc/mysql 是MySQL的配置文件目录

为什么需要清理
不同版本的MySQL可能存在依赖冲突,残留的配置文件也可能影响新版本的正确安装。这一步确保安装环境的纯净。

5. 包管理器安装 - 自动化依赖解决

# 2. 安装MySQL
install_mysql() {
    tip "info" "开始安装MySQL..."
    
    if [ "$ID" == "rhel" ]; then
        dnf install -y mysql-server
    elif [[ "$ID" == "debian" || "$ID" == "ubuntu" ]]; then
        apt update
        apt install -y mysql-server
    fi
    
    tip "info" "MySQL安装完成"
}

详解

  • -y 参数自动确认安装,无需人工干预
  • apt update 更新软件包列表,确保获取到最新的版本信息
  • 包管理器会自动解决依赖关系,下载并安装所有必需的软件包

包管理器的工作原理

  1. 解析软件包的依赖关系
  2. 从配置的软件源下载所需的包文件
  3. 运行预安装、安装和后安装脚本
  4. 配置系统服务和环境变量

6. 服务管理 - systemd系统集成

# 3. 启动MySQL服务
start_mysql_service() {
    tip "info" "启动MySQL服务..."
    systemctl enable mysqld
    systemctl start mysqld
    tip "info" "MySQL服务已启动"
}

详解

  • systemctl enable 设置服务开机自启动
  • systemctl start 立即启动服务
  • mysqld 是MySQL的服务名称

systemd服务管理

  • systemd是现代Linux系统的初始化系统
  • 服务配置文件通常位于/usr/lib/systemd/system/
  • 使用systemctl status mysqld可以查看服务状态
  • 日志可以通过journalctl -u mysqld查看

7. 安全配置 - 数据库加固

# 4. 安全设置
secure_mysql() {
    tip "info" "进行MySQL安全设置..."
    
    mysql -u root <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$mysql_root_password';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
EOF
    
    tip "info" "安全设置完成"
}

详解

  • <<EOF 是here document语法,用于向命令传递多行输入
  • ALTER USER 修改root用户的密码
  • DELETE FROM mysql.user 删除匿名用户和远程root用户
  • DROP DATABASE 删除测试数据库
  • FLUSH PRIVILEGES 重新加载权限表

安全配置的重要性

  • 默认安装的MySQL存在安全风险
  • 匿名用户可能被利用进行未授权访问
  • 测试数据库在生产环境中没有用处
  • 强密码是数据库安全的第一道防线

8. 防火墙配置 - 网络访问控制

# 5. 配置防火墙
configure_firewall() {
    tip "info" "配置防火墙..."
    
    if [ "$ID" == "rhel" ]; then
        firewall-cmd --permanent --add-service=mysql
        firewall-cmd --reload
    elif [[ "$ID" == "debian" || "$ID" == "ubuntu" ]]; then
        ufw allow mysql
        ufw reload
    fi
    
    tip "info" "防火墙配置完成"
}

详解

  • firewall-cmd 是firewalld防火墙的管理工具
  • --permanent 将规则永久保存
  • --add-service=mysql 添加MySQL服务(默认端口3306)
  • ufw 是Ubuntu的简单防火墙工具

防火墙的作用

  • 控制网络访问,只允许必要的端口对外开放
  • 防止未授权的外部访问
  • 是纵深防御策略的重要组成部分

9. 连接测试 - 安装验证

# 6. 测试连接
test_mysql_connection() {
    tip "info" "测试MySQL连接..."
    mysql -u root -p$mysql_root_password -e "SHOW DATABASES;" &>/dev/null
    if [ $? -eq 0 ]; then
        tip "info" "MySQL连接测试成功"
    else
        tip "error" "MySQL连接测试失败"
    fi
}

详解

  • -e 参数让mysql客户端执行指定的SQL语句
  • $? 是特殊变量,存储上一条命令的退出状态
  • 0 表示成功,非零值表示失败
  • SHOW DATABASES 是一个简单的验证查询

测试的重要性

  • 验证安装是否真正成功
  • 确认服务可以正常响应请求
  • 检查认证配置是否正确

完整脚本代码

#!/bin/bash
# 指定脚本使用bash解释器执行

# 加载系统发行版信息
. /etc/os-release

# 定义变量
mysql_version="8.0"
mysql_root_password="MyNewPassword123!"

# 颜色输出函数
tip() {
    GREEN="\033[32m"
    YELLOW="\033[33m"
    RED="\033[31m"
    NC="\033[0m"
    
    case $1 in
        "info") echo -e "${GREEN}[INFO]${NC} $2" ;;
        "warn") echo -e "${YELLOW}[WARN]${NC} $2" ;;
        "error") echo -e "${RED}[ERROR]${NC} $2" ;;
        *) exit 1 ;;
    esac
}

# 1. 清理旧版本(可选)
clear_old_mysql() {
    tip "info" "清理旧版本MySQL..."
    
    if [ "$ID" == "rhel" ]; then
        dnf remove -y mysql mysql-server &>/dev/null
    elif [[ "$ID" == "debian" || "$ID" == "ubuntu" ]]; then
        apt remove -y mysql-server mysql-client &>/dev/null
    fi
    
    rm -rf /var/lib/mysql /etc/mysql
    tip "info" "清理完成"
}

# 2. 安装MySQL
install_mysql() {
    tip "info" "开始安装MySQL..."
    
    if [ "$ID" == "rhel" ]; then
        dnf install -y mysql-server
    elif [[ "$ID" == "debian" || "$ID" == "ubuntu" ]]; then
        apt update
        apt install -y mysql-server
    fi
    
    tip "info" "MySQL安装完成"
}

# 3. 启动MySQL服务
start_mysql_service() {
    tip "info" "启动MySQL服务..."
    systemctl enable mysqld
    systemctl start mysqld
    tip "info" "MySQL服务已启动"
}

# 4. 安全设置
secure_mysql() {
    tip "info" "进行MySQL安全设置..."
    
    mysql -u root <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$mysql_root_password';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
EOF
    
    tip "info" "安全设置完成"
}

# 5. 配置防火墙
configure_firewall() {
    tip "info" "配置防火墙..."
    
    if [ "$ID" == "rhel" ]; then
        firewall-cmd --permanent --add-service=mysql
        firewall-cmd --reload
    elif [[ "$ID" == "debian" || "$ID" == "ubuntu" ]]; then
        ufw allow mysql
        ufw reload
    fi
    
    tip "info" "防火墙配置完成"
}

# 6. 测试连接
test_mysql_connection() {
    tip "info" "测试MySQL连接..."
    mysql -u root -p$mysql_root_password -e "SHOW DATABASES;" &>/dev/null
    if [ $? -eq 0 ]; then
        tip "info" "MySQL连接测试成功"
    else
        tip "error" "MySQL连接测试失败"
    fi
}

# 主函数
main() {
    clear_old_mysql
    install_mysql
    start_mysql_service
    secure_mysql
    configure_firewall
    test_mysql_connection
}

main "$@"

使用教程

1. 保存脚本文件

# 创建脚本文件
vim install_mysql.sh

将上面的脚本内容复制到文件中。

2. 赋予执行权限

chmod +x install_mysql.sh

权限说明

  • chmod 修改文件权限
  • +x 添加执行权限
  • 没有执行权限的脚本需要使用bash 脚本名来执行

3. 执行安装脚本

# 使用root权限执行
sudo ./install_mysql.sh

4. 安装过程监控

执行脚本后,你会看到彩色的输出信息,显示每个步骤的执行情况:
在这里插入图片描述
详解

  • ALREADY_ENABLED = “已经启用”,意思是:MySQL 服务(端口3306)已经在防火墙中允许通过了

5. 验证安装

安装完成后,可以通过以下方式验证:

# 登录MySQL
mysql -u root -p123456

# 查看MySQL版本
mysql -u root -p$mysql_root_password -e "SELECT VERSION();"

# 查看运行状态
systemctl status mysqld

在这里插入图片描述

总结

通过这个脚本,我们不仅实现了一键安装MySQL的功能,更重要的是展示了Shell脚本在自动化运维中的强大能力。从环境检测、包管理、服务配置到安全加固,每个环节都体现了Linux系统管理的核心概念。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值