Files
happy-life-star/cleanup-and-install-mysql.sh
T
peanut 48df1d68d7 🎉 完成情感博物馆单体架构迁移和数据库集成
 主要完成内容:
- 完整的微服务到单体架构迁移
- 数据库实体类和服务层实现
- 用户认证和管理功能
- AI对话功能集成
- WebSocket实时通信
- 情绪记录管理
- 数据库初始化脚本
- 生产环境部署配置

🏗️ 技术栈:
- Spring Boot 2.7.18 单体架构
- MySQL数据库集成
- JWT认证机制
- WebSocket支持
- Coze AI API集成
- 完整的REST API接口

📊 性能优化:
- 内存使用降低82% (2GB → 363MB)
- 启动时间缩短83% (5分钟 → 30秒)
- 服务数量减少90% (10个 → 1个)
- 部署复杂度大幅简化

🌐 API接口:
- 26个REST API接口
- 3个WebSocket端点
- 完整的CRUD操作
- 数据库读写功能

🚀 部署状态:
- 服务器: 47.111.10.27:8080
- 数据库: emotion (MySQL)
- 前端: http://47.111.10.27/emotion/happy/
- 健康检查: /api/health
2025-07-22 20:29:29 +08:00

421 lines
13 KiB
Bash
Executable File

#!/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 "$@"