在日常的运维工作和开发环境搭建中,频繁的手动安装配置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文件,将其中的变量(如ID、VERSION_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" "开始安装..."时:
- 函数根据第一个参数匹配到
info分支 - 使用绿色输出
[INFO] 开始安装... - 用户通过颜色就能快速识别消息的重要程度
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更新软件包列表,确保获取到最新的版本信息- 包管理器会自动解决依赖关系,下载并安装所有必需的软件包
包管理器的工作原理:
- 解析软件包的依赖关系
- 从配置的软件源下载所需的包文件
- 运行预安装、安装和后安装脚本
- 配置系统服务和环境变量
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系统管理的核心概念。
499

被折叠的 条评论
为什么被折叠?



