27

2025Mar

Your greatest triumph is staying true to yourself.

忠于自我是最高成就。

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
posted @   陈雷雷  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
点击右上角即可分享
微信分享提示