ChatGPT脚本: 全自动部署jdk环境(自动判断系统架构部署)
脚本地址
https://dlk2qiw7lh.feishu.cn/docx/CxphdYsBrocrZmxSV0kca7dBnwg?from=from_copylink
脚本内容:
#!/bin/bash
# 设置脚本遇到错误时退出
set -e
# 设置 erase 字符以正确处理退格键
stty erase ^H 2>/dev/null || stty erase ^?
# 定义颜色和样式
BOLD=$(tput bold)
NORMAL=$(tput sgr0)
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
# 默认配置
MYSQL_USER="yanfaapp"
MYSQL_BASE_DIR="/home/$MYSQL_USER/rcs/app/mysql"
MYSQL_DATA_DIR="/home/$MYSQL_USER/rcs/data/mysql"
MYSQL_LOG_DIR="/home/$MYSQL_USER/rcs/log"
MYSQL_PORT=5060
MYSQL_PORT_TCP=33060
SYSTEMD_FILE="/etc/systemd/system/mysql.service"
BACKUP_BASE_DIR="/var/backups"
LOG_FILE="/var/log/mysql_install.log"
# 动态获取脚本路径
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
# 判断是否为 root 用户
is_root() {
[[ "$EUID" -eq 0 ]]
}
# 检查是否以 root 用户运行
check_root() {
if ! is_root; then
echo -e "${RED}[ERROR] 请使用 root 用户运行此脚本。${NORMAL}"
exit 1
fi
}
# 检测系统发行版
get_os() {
if [[ -f /etc/os-release ]]; then
. /etc/os-release
case "$ID" in
centos)
echo "centos"
;;
rhel)
echo "rhel"
;;
rocky)
echo "rocky"
;;
ubuntu)
echo "ubuntu"
;;
debian)
echo "debian"
;;
*)
echo "unsupported"
;;
esac
else
echo "unknown"
fi
}
# 检测系统架构
get_system_arch() {
arch=$(uname -m)
case "$arch" in
x86_64 | amd64 | x64)
echo "x86_64"
;;
armv7l | armv8l | aarch64)
echo "arm64"
;;
*)
echo "unsupported"
;;
esac
}
# 检查系统依赖
check_dependencies() {
echo -e "${GREEN}[INFO] 检查系统依赖...${NORMAL}"
local os_id=$(get_os)
local arch=$(get_system_arch)
local pkg_manager=""
local dependencies=()
local missing_deps=()
case "$os_id" in
centos)
pkg_manager="yum"
dependencies=("libaio" "net-tools" "wget" "tar" "systemd" "firewalld")
;;
rhel|rocky)
pkg_manager="dnf"
dependencies=("libaio" "net-tools" "wget" "tar" "systemd" "firewalld")
;;
ubuntu|debian)
pkg_manager="apt"
dependencies=("libaio1" "libnuma1" "libncurses5" "net-tools" "wget" "tar" "systemd" "firewalld")
;;
*)
echo -e "${RED}[ERROR] 不支持的发行版: $os_id。仅支持 CentOS、RHEL、Rocky、Ubuntu 和 Debian。${NORMAL}"
exit 1
;;
esac
# 检查依赖
for dep in "${dependencies[@]}"; do
case "$pkg_manager" in
yum|dnf)
if ! rpm -q "$dep" &>/dev/null; then
missing_deps+=("$dep")
fi
;;
apt)
if ! dpkg -l | grep -qw "$dep"; then
missing_deps+=("$dep")
fi
;;
esac
done
if [[ ${#missing_deps[@]} -gt 0 ]]; then
echo -e "${GREEN}[INFO] 开始安装以下缺失依赖: ${missing_deps[*]}...${NORMAL}"
case "$pkg_manager" in
dnf)
dnf install -y "${missing_deps[@]}" >> "$LOG_FILE" 2>&1 || {
echo -e "${RED}[ERROR] 安装依赖失败,请检查网络连接或包名是否正确。详细信息请查看 $LOG_FILE${NORMAL}"
exit 1
}
;;
yum)
yum install -y "${missing_deps[@]}" >> "$LOG_FILE" 2>&1 || {
echo -e "${RED}[ERROR] 安装依赖失败,请检查网络连接或包名是否正确。详细信息请查看 $LOG_FILE${NORMAL}"
exit 1
}
;;
apt)
apt-get update >> "$LOG_FILE" 2>&1
apt-get install -y "${missing_deps[@]}" >> "$LOG_FILE" 2>&1 || {
echo -e "${RED}[ERROR] 安装依赖失败,请检查网络连接或包名是否正确。详细信息请查看 $LOG_FILE${NORMAL}"
exit 1
}
;;
esac
echo -e "${GREEN}[INFO] 依赖安装完成。${NORMAL}"
else
echo -e "${GREEN}[INFO] 所有依赖已安装。${NORMAL}"
fi
}
# 检查并创建 MySQL 用户
create_mysql_user() {
if ! id -u "$MYSQL_USER" &>/dev/null; then
echo -e "${BLUE}[INFO] 创建 MySQL 用户: $MYSQL_USER${NORMAL}"
useradd -r -s /sbin/nologin "$MYSQL_USER" || {
echo -e "${RED}[ERROR] 创建用户失败。${NORMAL}"
exit 1
}
else
echo -e "${GREEN}[INFO] MySQL 用户已存在。${NORMAL}"
fi
}
# 检查 MySQL 是否已安装
check_mysql_installed() {
[[ -d "$MYSQL_BASE_DIR" || -L "$MYSQL_BASE_DIR" ]]
}
# 获取已安装 MySQL 的版本
get_mysql_version() {
if [[ -x "$MYSQL_BASE_DIR/bin/mysql" ]]; then
version_output=$("$MYSQL_BASE_DIR/bin/mysql" --version)
# Expected format: mysql Ver 8.4.2 for Linux on x86_64 (MySQL Community Server - GPL)
# Extract the version number after "Ver"
echo "$version_output" | awk '{for (i=1;i<=NF;i++) if ($i ~ /^Ver/) {print $(i+1); exit}}'
else
echo "Unknown"
fi
}
# 动态生成 MySQL 配置文件
generate_mysql_config() {
echo -e "${GREEN}[INFO] 生成 MySQL 配置文件...${NORMAL}"
local server_id
server_id=$(hostname -I | awk '{print $1}' | awk -F. '{print $NF}')
if [[ "$server_id" -eq 0 ]]; then
server_id=1
fi
mkdir -p "$MYSQL_BASE_DIR/etc" "$MYSQL_DATA_DIR" "$MYSQL_LOG_DIR" "$MYSQL_BASE_DIR/var/run"
cat > "$MYSQL_BASE_DIR/etc/my.cnf" << EOF
[mysqld]
skip-name-resolve
user=$MYSQL_USER
basedir=$MYSQL_BASE_DIR
datadir=$MYSQL_DATA_DIR
port=$MYSQL_PORT
log-error=$MYSQL_LOG_DIR/mysqld_error.log
pid-file=$MYSQL_BASE_DIR/var/run/mysqld.pid
socket=$MYSQL_BASE_DIR/mysql.sock
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
bind-address = 0.0.0.0
server-id=$server_id
replicate-wild-ignore-table=mysql.%
log-slave-updates
general_log=off
general_log_file=$MYSQL_LOG_DIR/mysql_general.log
innodb_buffer_pool_size=1G
innodb_log_file_size=100M
auto_increment_increment=2
auto_increment_offset=$((server_id % 2 + 1))
[client]
socket=$MYSQL_BASE_DIR/mysql.sock
port=$MYSQL_PORT
[mysql]
socket=$MYSQL_BASE_DIR/mysql.sock
port=$MYSQL_PORT
EOF
echo -e "${GREEN}[INFO] MySQL 配置文件生成完成。${NORMAL}"
}
# 备份 MySQL 数据目录
backup_mysql_data() {
local backup_dir
local default_backup_dir="${BACKUP_BASE_DIR}/mysql_backup_$(date +%Y%m%d%H%M%S)"
echo -e "${YELLOW}默认备份目录: $default_backup_dir${NORMAL}" >&2
echo -e "${YELLOW}输入自定义备份目录后按回车键,或直接按回车使用默认目录。${NORMAL}" >&2
read -rp "$(echo -e "${BLUE}请输入自定义备份目录 [回车] 使用默认: ${NORMAL}")" user_backup_dir
if [[ -n "$user_backup_dir" ]]; then
backup_dir="$user_backup_dir"
else
backup_dir="$default_backup_dir"
fi
echo -e "${GREEN}[INFO] 备份 MySQL 数据目录到: $backup_dir${NORMAL}" >&2
mkdir -p "$backup_dir"
cp -r "$MYSQL_DATA_DIR" "$backup_dir" || {
echo -e "${RED}[ERROR] 备份数据失败。${NORMAL}" >&2
exit 1
}
echo -e "${GREEN}[INFO] 数据备份完成。备份目录: $backup_dir${NORMAL}" >&2
}
# 卸载 MySQL
uninstall_mysql() {
echo -e "${GREEN}[INFO] 开始卸载 MySQL...${NORMAL}" >&2
if systemctl list-unit-files | grep -q "^mysql.service"; then
if systemctl is-active --quiet mysql; then
echo -e "${GREEN}[INFO] 停止 MySQL 服务...${NORMAL}" >&2
systemctl stop mysql || {
echo -e "${RED}[ERROR] 停止 MySQL 服务失败。${NORMAL}" >&2
exit 1
}
fi
echo -e "${GREEN}[INFO] 禁用并删除 MySQL systemd 服务...${NORMAL}" >&2
systemctl disable mysql || {
echo -e "${RED}[ERROR] 禁用 MySQL 服务失败。${NORMAL}" >&2
exit 1
}
rm -f "$SYSTEMD_FILE" || {
echo -e "${RED}[ERROR] 删除 systemd 服务文件失败。${NORMAL}" >&2
exit 1
}
systemctl daemon-reload || {
echo -e "${RED}[ERROR] 重新加载 systemd 守护进程失败。${NORMAL}" >&2
exit 1
}
fi
if [[ -d "$MYSQL_BASE_DIR" ]]; then
echo -e "${GREEN}[INFO] 删除 MySQL 基础目录...${NORMAL}" >&2
rm -rf "$MYSQL_BASE_DIR" || {
echo -e "${RED}[ERROR] 删除 MySQL 基础目录失败。${NORMAL}" >&2
exit 1
}
fi
if [[ -d "$MYSQL_DATA_DIR" ]]; then
echo -e "${GREEN}[INFO] 删除 MySQL 数据目录...${NORMAL}" >&2
rm -rf "$MYSQL_DATA_DIR" || {
echo -e "${RED}[ERROR] 删除 MySQL 数据目录失败。${NORMAL}" >&2
exit 1
}
fi
if [[ -d "$MYSQL_LOG_DIR" ]]; then
echo -e "${GREEN}[INFO] 删除 MySQL 日志目录...${NORMAL}" >&2
rm -rf "$MYSQL_LOG_DIR" || {
echo -e "${RED}[ERROR] 删除 MySQL 日志目录失败。${NORMAL}" >&2
exit 1
}
fi
# 清除环境变量
echo -e "${GREEN}[INFO] 清除环境变量...${NORMAL}" >&2
if [[ -f /home/$MYSQL_USER/.bashrc ]]; then
sed -i '/export PATH=.*\/mysql\/bin/d' /home/$MYSQL_USER/.bashrc
else
echo -e "${YELLOW}[WARNING] 未找到 /home/$MYSQL_USER/.bashrc 文件,跳过编辑。${NORMAL}" >&2
fi
if [[ -f /etc/profile ]]; then
sed -i '/export PATH=.*\/mysql\/bin/d' /etc/profile
else
echo -e "${YELLOW}[WARNING] 未找到 /etc/profile 文件,跳过编辑。${NORMAL}" >&2
fi
# 删除符号链接
echo -e "${GREEN}[INFO] 删除 mysql 命令的符号链接...${NORMAL}" >&2
rm -f /usr/local/bin/mysql /usr/local/bin/mysqladmin
# 删除环境变量脚本
echo -e "${GREEN}[INFO] 删除环境变量脚本...${NORMAL}" >&2
if [[ -f /etc/profile.d/mysql.sh ]]; then
rm -f /etc/profile.d/mysql.sh || {
echo -e "${RED}[ERROR] 删除 /etc/profile.d/mysql.sh 失败。${NORMAL}" >&2
exit 1
}
fi
# 删除 /tmp/mysql.sock 符号链接
echo -e "${GREEN}[INFO] 删除 /tmp/mysql.sock 符号链接...${NORMAL}" >&2
if [[ -L /tmp/mysql.sock ]]; then
rm -f /tmp/mysql.sock || {
echo -e "${RED}[ERROR] 删除 /tmp/mysql.sock 符号链接失败。${NORMAL}" >&2
exit 1
}
fi
echo -e "${GREEN}[INFO] MySQL 卸载完成。${NORMAL}" >&2
}
# 安装 MySQL
install_mysql() {
local mysql_archive="$1"
echo -e "${GREEN}[INFO] 即将安装的 MySQL 包是:$mysql_archive${NORMAL}" >&2
if [[ ! -f "$mysql_archive" ]]; then
echo -e "${RED}[ERROR] 错误:MySQL 压缩包 [$mysql_archive] 不存在。${NORMAL}" >&2
return 1
fi
echo -e "${GREEN}[INFO] 解压 MySQL 到标准路径...${NORMAL}" >&2
mkdir -p "$MYSQL_BASE_DIR" "$MYSQL_DATA_DIR" "$MYSQL_LOG_DIR" "$MYSQL_BASE_DIR/var/run" || {
echo -e "${RED}[ERROR] 创建必要的目录失败。${NORMAL}" >&2
exit 1
}
# 由于安装包包含顶级目录,使用 --strip-components=1
tar xf "$mysql_archive" -C "$MYSQL_BASE_DIR" --strip-components=1 || {
echo -e "${RED}[ERROR] 解压失败。${NORMAL}" >&2
return 1
}
# 验证解压是否成功
if [[ ! -d "$MYSQL_BASE_DIR/bin" ]]; then
echo -e "${RED}[ERROR] 错误:解压后的 MySQL 目录 [$MYSQL_BASE_DIR] 不存在或不完整。${NORMAL}" >&2
exit 1
fi
chown -R "$MYSQL_USER:$MYSQL_USER" "$MYSQL_BASE_DIR" "$MYSQL_DATA_DIR" "$MYSQL_LOG_DIR" || {
echo -e "${RED}[ERROR] 设置目录权限失败。${NORMAL}" >&2
exit 1
}
echo -e "${GREEN}[INFO] 初始化 MySQL 数据目录...${NORMAL}" >&2
# 初始化并捕获日志
"$MYSQL_BASE_DIR/bin/mysqld" --initialize --user="$MYSQL_USER" --basedir="$MYSQL_BASE_DIR" --datadir="$MYSQL_DATA_DIR" --log-error="$MYSQL_LOG_DIR/mysqld_error.log" &>> "$LOG_FILE" || {
echo -e "${RED}[ERROR] MySQL 数据目录初始化失败。详细信息请查看 $LOG_FILE${NORMAL}" >&2
exit 1
}
echo -e "${GREEN}[INFO] MySQL 初始化完成。${NORMAL}" >&2
}
# 配置 systemd 服务
configure_systemd() {
echo -e "${GREEN}[INFO] 配置 MySQL systemd 服务...${NORMAL}" >&2
cat > "$SYSTEMD_FILE" << EOF
[Unit]
Description=MySQL Server
After=network.target
[Service]
User=$MYSQL_USER
Group=$MYSQL_USER
ExecStart=$MYSQL_BASE_DIR/bin/mysqld --defaults-file=$MYSQL_BASE_DIR/etc/my.cnf
LimitNOFILE=65535
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload || {
echo -e "${RED}[ERROR] 重新加载 systemd 守护进程失败。${NORMAL}" >&2
exit 1
}
systemctl enable mysql || {
echo -e "${RED}[ERROR] 启用 MySQL 服务失败。${NORMAL}" >&2
exit 1
}
echo -e "${GREEN}[INFO] MySQL systemd 服务配置完成。${NORMAL}" >&2
}
# 配置环境变量和创建符号链接
configure_environment() {
echo -e "${GREEN}[INFO] 配置环境变量和符号链接...${NORMAL}" >&2
# 添加 MySQL bin 目录到全局 PATH
echo "export PATH=$MYSQL_BASE_DIR/bin:\$PATH" > /etc/profile.d/mysql.sh
chmod +x /etc/profile.d/mysql.sh
# 创建符号链接以确保 mysql 命令可用
ln -sf "$MYSQL_BASE_DIR/bin/mysql" /usr/local/bin/mysql
ln -sf "$MYSQL_BASE_DIR/bin/mysqladmin" /usr/local/bin/mysqladmin
# 创建 /tmp/mysql.sock 的符号链接
ln -sf "$MYSQL_BASE_DIR/mysql.sock" /tmp/mysql.sock
echo -e "${GREEN}[INFO] 环境变量配置完成。请重新登录或执行 'source /etc/profile' 以应用新的环境变量。${NORMAL}" >&2
}
# 启动并验证 MySQL 服务
start_and_verify_mysql() {
echo -e "${GREEN}[INFO] 启动 MySQL 服务...${NORMAL}" >&2
systemctl start mysql || {
echo -e "${RED}[ERROR] 启动 MySQL 服务失败。${NORMAL}" >&2
echo -e "${YELLOW}请查看日志文件以获取详细信息: $MYSQL_LOG_DIR/mysqld_error.log${NORMAL}" >&2
exit 1
}
echo -e "${GREEN}[INFO] 验证 MySQL 服务状态...${NORMAL}" >&2
sleep 5 # 等待 MySQL 启动
if systemctl is-active --quiet mysql; then
echo -e "${GREEN}[INFO] MySQL 服务已成功启动。${NORMAL}" >&2
else
echo -e "${RED}[ERROR] MySQL 服务未能成功启动。${NORMAL}" >&2
echo -e "${YELLOW}请查看日志文件以获取详细信息: $MYSQL_LOG_DIR/mysqld_error.log${NORMAL}" >&2
exit 1
fi
}
# 打印初始密码及提示信息
print_initial_password() {
local log_file="$MYSQL_LOG_DIR/mysqld_error.log"
local password_file="$MYSQL_LOG_DIR/initial_root_password.txt"
echo -e "${GREEN}[INFO] 检查初始密码...${NORMAL}" >&2
# 等待日志文件生成
local wait_time=0
local max_wait=30 # 最多等待30秒
while [[ ! -f "$log_file" && $wait_time -lt $max_wait ]]; do
sleep 1
wait_time=$((wait_time + 1))
done
if [[ ! -f "$log_file" ]]; then
echo -e "${RED}[ERROR] 未找到日志文件: $log_file。${NORMAL}" >&2
exit 1
fi
# 提取初始密码
local password
password=$(grep 'temporary password' "$log_file" | awk '{print $NF}')
if [[ -n "$password" ]]; then
echo "$password" > "$password_file"
chmod 600 "$password_file"
# echo -e "${YELLOW}${BOLD}[INFO] MySQL 安装完成。初始密码已保存到 $password_file${NORMAL}" >&2
else
echo -e "${YELLOW}[WARNING] 未在日志中找到初始密码,请手动检查日志文件。${NORMAL}" >&2
echo -e "日志文件路径: $log_file" >&2
fi
}
# 打印远程连接提示
print_remote_connection_info() {
echo -e "${GREEN}[INFO] 配置远程连接...${NORMAL}" >&2
echo -e "${YELLOW}要允许远程连接,请执行以下步骤:${NORMAL}" >&2
echo -e "${YELLOW}1. 确认 bind-address = 0.0.0.0 已在配置文件中设置。${NORMAL}" >&2
echo -e "${YELLOW} - 文件路径: $MYSQL_BASE_DIR/etc/my.cnf${NORMAL}" >&2
echo -e "${YELLOW}2. 重启 MySQL 服务:${NORMAL}" >&2
echo -e "${BLUE} systemctl restart mysql${NORMAL}" >&2
echo -e "${YELLOW}3. 配置防火墙,允许 MySQL 端口 ($MYSQL_PORT 和 $MYSQL_PORT_TCP):${NORMAL}" >&2
echo -e "${YELLOW} - 对于 CentOS/RHEL/Rocky 系统使用 firewalld:${NORMAL}" >&2
echo -e "${BLUE} firewall-cmd --permanent --add-port=$MYSQL_PORT/tcp${NORMAL}" >&2
echo -e "${BLUE} firewall-cmd --permanent --add-port=$MYSQL_PORT_TCP/tcp${NORMAL}" >&2
echo -e "${BLUE} firewall-cmd --reload${NORMAL}" >&2
echo -e "${YELLOW} - 对于 Ubuntu/Debian 系统使用 ufw:${NORMAL}" >&2
echo -e "${BLUE} ufw allow $MYSQL_PORT/tcp${NORMAL}" >&2
echo -e "${BLUE} ufw allow $MYSQL_PORT_TCP/tcp${NORMAL}" >&2
echo -e "${BLUE} ufw reload${NORMAL}" >&2
echo -e "${YELLOW}4. 创建远程访问的 MySQL 用户:${NORMAL}" >&2
echo -e "${YELLOW} 登录 MySQL:${NORMAL}" >&2
echo -e "${BLUE} mysql -u root -p${NORMAL}" >&2
echo -e "${YELLOW} 然后在 MySQL 中执行以下命令:${NORMAL}" >&2
echo -e "${BLUE} CREATE USER 'remote_user'@'%' IDENTIFIED BY 'RemoteUserPassword!';${NORMAL}" >&2
echo -e "${BLUE} GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;${NORMAL}" >&2
echo -e "${BLUE} FLUSH PRIVILEGES;${NORMAL}" >&2
echo -e "${YELLOW} 确保使用强密码并根据需要限制远程用户的权限。${NORMAL}" >&2
}
# 列出可用的 MySQL 版本
list_available_versions() {
local os_id=$(get_os)
local arch=$(get_system_arch)
mysql_archives=()
if [[ "$arch" == "unsupported" ]]; then
echo -e "${RED}[ERROR] 当前系统架构不受支持。仅支持 x86_64 和 arm64 架构。${NORMAL}" >&2
exit 1
fi
# 查找与系统架构和发行版匹配的 MySQL 安装包
if [[ "$os_id" == "centos" || "$os_id" == "rhel" || "$os_id" == "rocky" ]]; then
if [[ "$arch" == "x86_64" ]]; then
mapfile -t mysql_archives < <(find "$SCRIPT_DIR" -type f -name "mysql-*-linux-glibc2.*-x86_64.tar.xz")
elif [[ "$arch" == "arm64" ]]; then
mapfile -t mysql_archives < <(find "$SCRIPT_DIR" -type f -name "mysql-*-linux-glibc2.*-aarch64.tar.xz")
fi
elif [[ "$os_id" == "ubuntu" || "$os_id" == "debian" ]]; then
if [[ "$arch" == "x86_64" ]]; then
mapfile -t mysql_archives < <(find "$SCRIPT_DIR" -type f -name "mysql-*-linux-glibc2.*-x86_64.tar.xz")
elif [[ "$arch" == "arm64" ]]; then
mapfile -t mysql_archives < <(find "$SCRIPT_DIR" -type f -name "mysql-*-linux-glibc2.*-aarch64.tar.xz")
fi
fi
if [[ ${#mysql_archives[@]} -eq 0 ]]; then
echo -e "${RED}[ERROR] 未找到与当前系统架构和发行版匹配的 MySQL 安装包。${NORMAL}" >&2
exit 1
fi
}
# 选择并安装 MySQL
select_and_install_mysql() {
list_available_versions
local total=${#mysql_archives[@]}
while true; do
echo -e "${GREEN}请选择要安装的 MySQL 版本:${NORMAL}" >&2
count=1
for f in "${mysql_archives[@]}"; do
echo -e "${YELLOW}$count. $(basename "$f")${NORMAL}" >&2
((count++))
done
echo -e "${YELLOW}b. 返回上级${NORMAL}" >&2
echo -e "${YELLOW}q. 退出脚本${NORMAL}" >&2
# 使用 read -rp 确保输入在同一行
read -rp "$(echo -e "${BLUE}请输入版本编号或 'b' 返回上级,'q' 退出: ${NORMAL}")" choice
if [[ "$choice" =~ ^[0-9]+$ ]]; then
if (( choice >= 1 && choice <= total )); then
selected_file="${mysql_archives[$((choice-1))]}"
echo -e "${GREEN}[INFO] 选择安装包:$(basename "$selected_file")${NORMAL}" >&2
install_mysql "$selected_file"
generate_mysql_config
configure_systemd
configure_environment
start_and_verify_mysql
print_initial_password
print_remote_connection_info
echo -e "${YELLOW}${BOLD}[INFO] MySQL 安装完成。初始密码已保存到 $MYSQL_LOG_DIR/initial_root_password.txt${NORMAL}" >&2
exit 0
else
echo -e "${RED}[ERROR] 无效序号,请重新输入。${NORMAL}" >&2
fi
elif [[ "$choice" == "b" || "$choice" == "B" ]]; then
echo -e "${GREEN}[INFO] 返回上级菜单。${NORMAL}" >&2
return
elif [[ "$choice" == "q" || "$choice" == "Q" ]]; then
echo -e "${GREEN}[INFO] 退出脚本。${NORMAL}" >&2
exit 0
else
echo -e "${RED}[ERROR] 无效输入,请输入有效的序号、'b' 返回上级或 'q' 退出。${NORMAL}" >&2
fi
done
}
# 备份完成后的菜单
backup_done_menu() {
while true; do
echo -e "${BOLD}请选择操作:${NORMAL}" >&2
echo -e "1. 继续安装 MySQL"
echo -e "2. 返回主菜单"
echo -e "3. 退出脚本"
echo ""
read -rp "$(echo -e "${BLUE}请输入选项 (1/2/3): ${NORMAL}")" backup_option
case "$backup_option" in
1)
echo -e "${GREEN}[INFO] 选择:继续安装 MySQL${NORMAL}" >&2
select_and_install_mysql
;;
2)
echo -e "${GREEN}[INFO] 返回主菜单。${NORMAL}" >&2
return
;;
3)
echo -e "${GREEN}[INFO] 退出脚本。${NORMAL}" >&2
exit 0
;;
*)
echo -e "${RED}[ERROR] 无效选项,请重新输入。${NORMAL}" >&2
;;
esac
done
}
# 主菜单
main_menu() {
while true; do
echo -e "${BOLD}请选择操作:${NORMAL}" >&2
echo -e "${GREEN}1.${NORMAL} 部署 MySQL"
echo -e "${GREEN}2.${NORMAL} 退出脚本"
echo ""
read -rp "$(echo -e "${BLUE}请输入选项 (1/2): ${NORMAL}")" option
case "$option" in
1)
echo -e "${GREEN}[INFO] 选择:部署 MySQL${NORMAL}" >&2
if check_mysql_installed; then
installed_version=$(get_mysql_version)
echo -e "${YELLOW}[INFO] 已安装 MySQL 版本:$installed_version${NORMAL}" >&2
echo -e "${BOLD}请选择操作:${NORMAL}" >&2
echo -e "1. 卸载已经安装的(MySQL $installed_version)"
echo -e "2. 备份当前 MySQL"
echo -e "3. 返回上级"
echo ""
while true; do
read -rp "$(echo -e "${BLUE}请输入选项 (1/2/3): ${NORMAL}")" sub_option
case "$sub_option" in
1)
echo -e "${GREEN}[INFO] 选择:卸载已经安装的 MySQL(版本 $installed_version)${NORMAL}" >&2
uninstall_mysql
echo -e "${GREEN}[INFO] 卸载完成。${NORMAL}" >&2
# 进入安装流程
select_and_install_mysql
# 选择 'b' 会返回主菜单,需要退出子循环
break
;;
2)
echo -e "${GREEN}[INFO] 选择:备份当前 MySQL${NORMAL}" >&2
backup_mysql_data
backup_done_menu
break
;;
3)
echo -e "${GREEN}[INFO] 返回主菜单。${NORMAL}" >&2
break
;;
*)
echo -e "${RED}[ERROR] 无效选项,请重新输入。${NORMAL}" >&2
;;
esac
done
else
echo -e "${GREEN}[INFO] 未检测到 MySQL 安装,开始安装...${NORMAL}" >&2
select_and_install_mysql
fi
;;
2)
echo -e "${GREEN}[INFO] 退出脚本。${NORMAL}" >&2
exit 0
;;
*)
echo -e "${RED}[ERROR] 无效选项,请重新选择。${NORMAL}" >&2
;;
esac
echo "" >&2 # 添加空行以提高可读性
done
}
# 主逻辑
main_logic() {
check_root
create_mysql_user
check_dependencies
main_menu
}
# 执行主逻辑
main_logic "$1"
# 这个脚本支持 CentOS、RHEL、Rocky、Ubuntu 和 Debian 的 arm 和 x86 平台安装 MySQL

微信赞赏

支付宝赞赏

【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时