#!/bin/bash # 清理并重新安装MySQL二进制包脚本 # 作者: emotion-museum # 日期: 2025-07-21 # 功能: 清理失败的安装,重新安装MySQL并恢复数据 set -e REMOTE_HOST="root@47.111.10.27" MYSQL_PACKAGE="/data/package/mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz" MYSQL_INSTALL_DIR="/usr/local/mysql" MYSQL_DATA_DIR="/data/programs/mysql" MYSQL_ROOT_PASSWORD="EmotionMuseum2025*#" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } # 检查SSH连接 check_connection() { log_info "检查远程服务器连接..." if ssh -o ConnectTimeout=10 "$REMOTE_HOST" "echo 'SSH连接成功'" > /dev/null 2>&1; then log_success "远程服务器连接正常" else log_error "无法连接到远程服务器: $REMOTE_HOST" exit 1 fi } # 清理失败的安装文件 cleanup_failed_installation() { log_info "清理失败的安装文件..." ssh "$REMOTE_HOST" " echo '🧹 清理失败的安装文件...' # 停止所有MySQL相关进程 pkill -f mysqld 2>/dev/null || echo '没有MySQL进程需要停止' # 清理临时文件 rm -rf /tmp/mysql-8.0.24-linux-glibc2.12-x86_64* 2>/dev/null || true # 清理安装目录 if [ -d '$MYSQL_INSTALL_DIR' ]; then echo '删除现有安装目录...' rm -rf $MYSQL_INSTALL_DIR fi # 清理符号链接 rm -f /usr/local/bin/mysql /usr/local/bin/mysqld /usr/local/bin/mysqladmin /usr/local/bin/mysqldump 2>/dev/null || true # 清理配置文件 rm -f /etc/my.cnf /etc/systemd/system/mysqld.service 2>/dev/null || true # 清理日志文件 rm -f /var/log/mysqld.log /var/log/mysql-slow.log 2>/dev/null || true # 清理运行时目录 rm -rf /var/run/mysqld 2>/dev/null || true echo '✅ 清理完成' " log_success "失败安装文件清理完成" } # 安装MySQL二进制包 install_mysql_binary() { log_info "安装MySQL二进制包..." ssh "$REMOTE_HOST" " echo '📦 解压MySQL二进制包...' cd /tmp # 解压MySQL包 tar -xJf $MYSQL_PACKAGE # 检查解压结果 if [ -d 'mysql-8.0.24-linux-glibc2.12-x86_64' ]; then echo '✅ MySQL包解压成功' ls -la mysql-8.0.24-linux-glibc2.12-x86_64/ | head -5 else echo '❌ MySQL包解压失败' exit 1 fi echo '📁 移动到安装目录...' mv mysql-8.0.24-linux-glibc2.12-x86_64 $MYSQL_INSTALL_DIR echo '👤 创建mysql用户...' # 创建mysql用户和组 groupadd mysql 2>/dev/null || echo 'mysql组已存在' useradd -r -g mysql -s /bin/false mysql 2>/dev/null || echo 'mysql用户已存在' echo '🔗 创建符号链接...' ln -sf $MYSQL_INSTALL_DIR/bin/mysql /usr/local/bin/mysql ln -sf $MYSQL_INSTALL_DIR/bin/mysqld /usr/local/bin/mysqld ln -sf $MYSQL_INSTALL_DIR/bin/mysqladmin /usr/local/bin/mysqladmin ln -sf $MYSQL_INSTALL_DIR/bin/mysqldump /usr/local/bin/mysqldump echo '📁 设置安装目录权限...' chown -R root:root $MYSQL_INSTALL_DIR chmod -R 755 $MYSQL_INSTALL_DIR echo '✅ MySQL二进制包安装完成' " log_success "MySQL二进制包安装完成" } # 配置MySQL configure_mysql() { log_info "配置MySQL..." ssh "$REMOTE_HOST" " echo '⚙️ 创建MySQL配置文件...' cat > /etc/my.cnf << 'EOF' [mysqld] # 基本设置 user = mysql port = 3306 basedir = /usr/local/mysql datadir = /data/programs/mysql socket = /tmp/mysql.sock pid-file = /var/run/mysqld/mysqld.pid # 网络配置 bind-address = 0.0.0.0 max_connections = 200 # 字符集配置 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # 认证插件 default-authentication-plugin = mysql_native_password # 日志配置 log-error = /var/log/mysqld.log slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 2 # InnoDB配置 innodb_buffer_pool_size = 512M innodb_log_file_size = 128M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 # 二进制日志 log-bin = mysql-bin binlog_format = ROW expire_logs_days = 7 # 安全配置 skip-name-resolve sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO [mysql] default-character-set = utf8mb4 socket = /tmp/mysql.sock [client] default-character-set = utf8mb4 socket = /tmp/mysql.sock EOF echo '📁 设置数据目录权限...' # 设置数据目录权限 chown -R mysql:mysql $MYSQL_DATA_DIR chmod -R 750 $MYSQL_DATA_DIR # 创建必要的目录 mkdir -p /var/run/mysqld mkdir -p /var/log chown mysql:mysql /var/run/mysqld touch /var/log/mysqld.log chown mysql:mysql /var/log/mysqld.log echo '✅ MySQL配置完成' " log_success "MySQL配置完成" } # 启动MySQL服务 start_mysql_service() { log_info "启动MySQL服务..." ssh "$REMOTE_HOST" " echo '🚀 启动MySQL服务...' # 直接启动mysqld nohup $MYSQL_INSTALL_DIR/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql > /var/log/mysqld.log 2>&1 & # 等待MySQL启动 echo '⏳ 等待MySQL启动...' sleep 20 # 检查MySQL进程 if pgrep -f mysqld > /dev/null; then echo '✅ MySQL进程启动成功' ps aux | grep mysqld | grep -v grep | head -1 else echo '❌ MySQL进程启动失败' echo '查看错误日志:' tail -20 /var/log/mysqld.log exit 1 fi # 检查端口监听 echo '🔍 检查端口监听...' sleep 5 if netstat -tlnp | grep :3306 > /dev/null; then echo '✅ MySQL端口3306正在监听' else echo '⚠️ MySQL端口3306未监听,查看日志...' tail -10 /var/log/mysqld.log fi " log_success "MySQL服务启动完成" } # 恢复数据和设置密码 restore_data_and_setup() { log_info "恢复数据和设置密码..." ssh "$REMOTE_HOST" " echo '🔍 等待MySQL完全启动...' sleep 15 echo '🔍 尝试连接MySQL...' # 首先尝试无密码连接 if $MYSQL_INSTALL_DIR/bin/mysql -u root -e 'SELECT VERSION();' > /dev/null 2>&1; then echo '✅ 无密码连接成功,设置密码和权限...' $MYSQL_INSTALL_DIR/bin/mysql -u root << 'EOSQL' -- 设置root密码 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$MYSQL_ROOT_PASSWORD'; -- 创建远程root用户 CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED WITH mysql_native_password BY '$MYSQL_ROOT_PASSWORD'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; -- 创建emotion用户 CREATE USER IF NOT EXISTS 'emotion'@'localhost' IDENTIFIED WITH mysql_native_password BY 'EmotionDB2024!'; CREATE USER IF NOT EXISTS 'emotion'@'%' IDENTIFIED WITH mysql_native_password BY 'EmotionDB2024!'; GRANT ALL PRIVILEGES ON emotion_museum.* TO 'emotion'@'localhost'; GRANT ALL PRIVILEGES ON emotion_museum.* TO 'emotion'@'%'; FLUSH PRIVILEGES; EOSQL echo '✅ 密码和权限设置完成' elif $MYSQL_INSTALL_DIR/bin/mysql -u root -p'$MYSQL_ROOT_PASSWORD' -e 'SELECT VERSION();' > /dev/null 2>&1; then echo '✅ 使用现有密码连接成功' else echo '⚠️ 连接失败,尝试获取临时密码...' TEMP_PASSWORD=\$(grep 'temporary password' /var/log/mysqld.log | tail -1 | awk '{print \$NF}' 2>/dev/null || echo '') if [ -n \"\$TEMP_PASSWORD\" ]; then echo \"发现临时密码: \$TEMP_PASSWORD\" $MYSQL_INSTALL_DIR/bin/mysql -u root -p\"\$TEMP_PASSWORD\" --connect-expired-password << 'EOSQL' ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD'; FLUSH PRIVILEGES; EOSQL echo '✅ 密码重置完成' else echo '❌ 无法连接MySQL' tail -20 /var/log/mysqld.log exit 1 fi fi echo '🔍 验证数据库连接...' $MYSQL_INSTALL_DIR/bin/mysql -u root -p'$MYSQL_ROOT_PASSWORD' -e 'SHOW DATABASES;' echo '🔍 检查emotion_museum数据库...' if $MYSQL_INSTALL_DIR/bin/mysql -u root -p'$MYSQL_ROOT_PASSWORD' -e 'USE emotion_museum; SHOW TABLES;' > /dev/null 2>&1; then echo '✅ emotion_museum数据库存在' $MYSQL_INSTALL_DIR/bin/mysql -u root -p'$MYSQL_ROOT_PASSWORD' -e 'USE emotion_museum; SHOW TABLES;' echo '🔍 检查用户表数据...' $MYSQL_INSTALL_DIR/bin/mysql -u root -p'$MYSQL_ROOT_PASSWORD' -e 'USE emotion_museum; SELECT COUNT(*) as user_count FROM user;' || echo '用户表检查失败' else echo '⚠️ emotion_museum数据库不存在,可能需要从备份恢复' # 查找最新的备份 LATEST_BACKUP=\$(ls -t /data/backups/mysql_*/all_databases.sql 2>/dev/null | head -1) if [ -n \"\$LATEST_BACKUP\" ]; then echo \"发现备份文件: \$LATEST_BACKUP\" echo '📤 恢复数据库...' $MYSQL_INSTALL_DIR/bin/mysql -u root -p'$MYSQL_ROOT_PASSWORD' < \"\$LATEST_BACKUP\" echo '✅ 数据库恢复完成' else echo '⚠️ 没有找到数据库备份文件' fi fi " log_success "数据恢复和设置完成" } # 检查最终状态 check_final_status() { log_info "检查最终状态..." ssh "$REMOTE_HOST" " echo '📊 MySQL服务状态:' echo '==================' # 检查进程 echo -n 'MySQL进程: ' if pgrep -f mysqld > /dev/null; then echo '✅ 运行中' else echo '❌ 未运行' fi # 检查端口监听 echo -n 'MySQL端口(3306): ' if netstat -tlnp | grep :3306 > /dev/null; then echo '✅ 监听中' else echo '❌ 未监听' fi # 检查连接 echo -n 'MySQL连接: ' if $MYSQL_INSTALL_DIR/bin/mysql -u root -p'$MYSQL_ROOT_PASSWORD' -e 'SELECT 1;' > /dev/null 2>&1; then echo '✅ 正常' else echo '❌ 失败' fi echo '' echo '🔍 安装信息:' echo \"安装目录: $MYSQL_INSTALL_DIR\" echo \"数据目录: $MYSQL_DATA_DIR\" echo \"配置文件: /etc/my.cnf\" echo '' echo '🔍 数据库列表:' $MYSQL_INSTALL_DIR/bin/mysql -u root -p'$MYSQL_ROOT_PASSWORD' -e 'SHOW DATABASES;' 2>/dev/null || echo '数据库列表获取失败' " log_success "状态检查完成" } # 主函数 main() { log_info "🚀 开始清理并重新安装MySQL..." echo "⚠️ 此操作将:" echo " 1. 清理失败的安装文件" echo " 2. 重新解压并安装MySQL二进制包" echo " 3. 配置MySQL使用现有数据" echo " 4. 启动MySQL服务" echo " 5. 恢复数据和设置密码" echo " 6. 验证最终状态" echo "" echo "⚠️ 现有数据文件将被保留" echo "" echo "是否继续?(y/N)" read -r confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then log_warning "操作已取消" exit 0 fi check_connection cleanup_failed_installation install_mysql_binary configure_mysql start_mysql_service restore_data_and_setup check_final_status log_success "🎉 MySQL安装和数据恢复完成!" echo "" echo "📋 安装结果:" echo " ✅ MySQL 8.0.24已成功安装" echo " ✅ 数据已恢复" echo " ✅ 服务正常运行" echo "" echo "📋 连接信息:" echo " 主机: localhost 或 47.111.10.27" echo " 端口: 3306" echo " root密码: $MYSQL_ROOT_PASSWORD" echo " emotion密码: EmotionDB2024!" echo " 数据库: emotion_museum" echo "" echo "🔧 下一步:" echo " 1. 测试应用连接" echo " 2. 重启微服务" } # 执行主函数 main "$@"