#!/bin/bash

# 检查并卸载 MySQL 和 MariaDB 历史版本
echo -e "\033[34m检查是否存在 MySQL 或 MariaDB 历史版本...\033[0m"
mysql_packages=$(rpm -qa | grep -E 'mysql|mariadb')

if [ -n "$mysql_packages" ]; then
    echo -e "\033[33m发现 MySQL/MariaDB 历史版本，开始卸载...\033[0m"
    yum -y remove $mysql_packages
fi

# 下载 MySQL 8.0 的 repo 源（优先使用阿里云镜像，兼容 DNS 解析问题）
echo -e "\033[34m下载 MySQL 8.0 的 repo 源（使用阿里云镜像，国内更快）...\033[0m"
wget -4 https://mirrors.aliyun.com/mysql/redhat/mysql80-community-release-el7-3.noarch.rpm || {
    echo -e "\033[31m镜像站下载失败，尝试官方源...\033[0m"
    wget -4 https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm || {
        echo -e "\033[31m下载失败，请检查网络连接或手动下载后上传。\033[0m"
        exit 1
    }
}

echo -e "\033[32m下载成功，开始安装 repo 源...\033[0m"
rpm -ivh mysql80-community-release-el7-3.noarch.rpm

# 更新 yum 缓存
echo -e "\033[34m更新 yum 缓存...\033[0m"
yum clean all
yum makecache

# 导入 MySQL GPG 密钥
echo -e "\033[34m导入 MySQL GPG 密钥...\033[0m"
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023

# 检查系统类型，如果是 CentOS Stream 则禁用 MySQL 模块
if grep -q "CentOS Stream" /etc/os-release; then
    echo -e "\033[33m检测到 CentOS Stream 系统，禁用 MySQL 模块...\033[0m"
    dnf module disable mysql -y
fi

# 安装 MySQL 服务器
echo -e "\033[34m开始安装 MySQL 服务器...\033[0m"
if ! yum install mysql-community-server -y; then
    echo -e "\033[33m安装过程中可能出现 GPG 验证问题，尝试禁用 GPG 检查进行安装...\033[0m"
    yum install mysql-community-server --nogpgcheck -y || {
        echo -e "\033[31mMySQL 安装失败，请检查错误信息。\033[0m"
        exit 1
    }
fi

# 查看当前安装的 MySQL 版本
echo -e "\033[32mMySQL 安装成功，当前版本信息：\033[0m"
mysql -V

# 启动 MySQL 服务并设置开机自启
echo -e "\033[34m启动 MySQL 服务并设置开机自启...\033[0m"
systemctl enable --now mysqld

# 检查 MySQL 服务状态
echo -e "\033[34m检查 MySQL 服务状态：\033[0m"
systemctl status mysqld --no-pager

# 获取初始密码（增加容错处理）
echo -e "\033[34m获取 MySQL 初始密码...\033[0m"
initial_password=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
if [ -z "$initial_password" ]; then
    echo -e "\033[31m未找到初始密码，请手动检查 /var/log/mysqld.log 文件。\033[0m"
    exit 1
fi
echo -e "\033[32m初始密码为: ${initial_password}\033[0m"

# 设置新密码（可在这里修改为你想要的密码）
new_password="MySql@Secure456!"  # 可改为交互式输入，如：read -s -p "输入新密码: " new_password

max_retries=3
retry_count=0

while [ $retry_count -lt $max_retries ]; do
    echo -e "\033[34m正在使用初始密码登录 MySQL 并修改密码...\033[0m"
    mysql -u root -p"$initial_password" --connect-expired-password <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$new_password';
FLUSH PRIVILEGES;
EXIT;
EOF

    # 验证密码修改是否成功
    echo -e "\033[34m验证新密码登录...\033[0m"
    if mysql -u root -p"$new_password" -e "SELECT 1;" &> /dev/null; then
        echo -e "\033[32m√ 密码修改成功！\033[0m"
        
        # 写入环境变量到 .bashrc（Bash 用户）
        echo -e "\033[34m将新密码写入用户环境变量（永久生效）...\033[0m"
        echo "export MYSQL_ROOT_PASS=\"$new_password\"" >> ~/.bashrc
        echo "export REDIS_PASSWORD=\"$new_password\"" >> ~/.bashrc  # 示例：Redis 密码与 MySQL 一致，可单独修改
        echo -e "\033[32m√ 环境变量已写入 ~/.bashrc，下次登录生效。\033[0m"
        echo -e "\033[32m立即生效命令：source ~/.bashrc\033[0m"
        
        # 提示新密码
        echo -e "\n\033[32m=== 重要信息 ===\033[0m"
        echo -e "  MySQL 新密码：\033[31m$new_password\033[0m"
        echo -e "  已写入环境变量 MYSQL_ROOT_PASS，读取方法：\033[34mecho \$MYSQL_ROOT_PASS\033[0m"
        break
    else
        retry_count=$((retry_count + 1))
        if [ $retry_count -lt $max_retries ]; then
            echo -e "\033[31m× 密码修改失败，第 $retry_count 次重试...\033[0m"
            read -p "请输入新的密码: " new_password
        else
            echo -e "\033[31m× 多次尝试后密码修改仍失败，请手动修改。\033[0m"
            echo "手动修改命令：mysql -u root -p'$initial_password' --connect-expired-password"
            echo "ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';"
            exit 1
        fi
    fi
done

echo -e "\n\033[32m=== MySQL 安装和配置完成 ===\033[0m"
echo -e "\033[32m常用命令：\033[0m"
echo "启动服务：systemctl start mysqld"
echo "停止服务：systemctl stop mysqld"
echo "查看状态：systemctl status mysqld"
echo "登录数据库：mysql -u root -p"
echo "读取密码：echo \$MYSQL_ROOT_PASS"  # 新增：提示读取环境变量的方法