#!/bin/bash # 情绪博物馆数据库初始化脚本 # 作者: EmotionMuseum Team # 版本: 1.0.0 # 日期: 2025-07-13 # 说明: 初始化MySQL数据库和Nacos配置数据库 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 日志函数 log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "${BLUE}[STEP]${NC} $1" } # 配置变量 MYSQL_ROOT_PASSWORD="123456" MYSQL_HOST="localhost" MYSQL_PORT="3306" EMOTION_DB_NAME="emotion_museum" NACOS_DB_NAME="nacos_config" EMOTION_USER="emotion" EMOTION_PASSWORD="emotion123" # 检查Docker是否运行 check_docker() { log_step "检查Docker服务..." if ! command -v docker &> /dev/null; then log_error "Docker未安装,请先运行 ./install-environment.sh" exit 1 fi if ! docker info &> /dev/null; then log_error "Docker服务未启动,请启动Docker服务" exit 1 fi log_info "Docker服务正常" } # 启动MySQL容器 start_mysql_container() { log_step "启动MySQL容器..." # 检查是否已有MySQL容器运行 if docker ps -a | grep -q "emotion-mysql"; then log_info "检测到已存在的MySQL容器" if docker ps | grep -q "emotion-mysql"; then log_info "MySQL容器已在运行" return else log_info "启动已存在的MySQL容器" docker start emotion-mysql sleep 10 return fi fi # 创建数据目录 mkdir -p ./data/mysql # 启动新的MySQL容器 log_info "创建新的MySQL容器..." docker run -d \ --name emotion-mysql \ --restart unless-stopped \ -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \ -e TZ=Asia/Shanghai \ -p $MYSQL_PORT:3306 \ -v $(pwd)/data/mysql:/var/lib/mysql \ mysql:8.0 \ --default-authentication-plugin=mysql_native_password \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci \ --default-time-zone='+8:00' log_info "等待MySQL容器启动..." sleep 30 # 等待MySQL服务就绪 local retry_count=0 local max_retries=30 while [ $retry_count -lt $max_retries ]; do if docker exec emotion-mysql mysqladmin ping -h localhost -u root -p$MYSQL_ROOT_PASSWORD &> /dev/null; then log_info "MySQL服务已就绪" break fi retry_count=$((retry_count + 1)) log_info "等待MySQL服务就绪... ($retry_count/$max_retries)" sleep 2 done if [ $retry_count -eq $max_retries ]; then log_error "MySQL服务启动超时" exit 1 fi } # 创建数据库和用户 create_databases() { log_step "创建数据库和用户..." # 创建情绪博物馆数据库 log_info "创建情绪博物馆数据库..." docker exec emotion-mysql mysql -u root -p$MYSQL_ROOT_PASSWORD -e " CREATE DATABASE IF NOT EXISTS $EMOTION_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER IF NOT EXISTS '$EMOTION_USER'@'%' IDENTIFIED BY '$EMOTION_PASSWORD'; GRANT ALL PRIVILEGES ON $EMOTION_DB_NAME.* TO '$EMOTION_USER'@'%'; FLUSH PRIVILEGES; " # 创建Nacos配置数据库 log_info "创建Nacos配置数据库..." docker exec emotion-mysql mysql -u root -p$MYSQL_ROOT_PASSWORD -e " CREATE DATABASE IF NOT EXISTS $NACOS_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON $NACOS_DB_NAME.* TO '$EMOTION_USER'@'%'; FLUSH PRIVILEGES; " log_info "数据库创建完成" } # 初始化情绪博物馆数据库表结构 init_emotion_database() { log_step "初始化情绪博物馆数据库表结构..." if [ ! -f "./database/mysql_emotion_museum_final.sql" ]; then log_error "数据库初始化脚本不存在: ./database/mysql_emotion_museum_final.sql" exit 1 fi log_info "执行数据库初始化脚本..." docker exec -i emotion-mysql mysql -u root -p$MYSQL_ROOT_PASSWORD $EMOTION_DB_NAME < ./database/mysql_emotion_museum_final.sql log_info "情绪博物馆数据库初始化完成" } # 初始化Nacos配置数据库 init_nacos_database() { log_step "初始化Nacos配置数据库..." # 下载Nacos数据库初始化脚本 local nacos_sql_url="https://raw.githubusercontent.com/alibaba/nacos/2.2.0/distribution/conf/nacos-mysql.sql" local nacos_sql_file="./database/nacos-mysql.sql" if [ ! -f "$nacos_sql_file" ]; then log_info "下载Nacos数据库初始化脚本..." mkdir -p ./database curl -fsSL $nacos_sql_url -o $nacos_sql_file fi log_info "执行Nacos数据库初始化脚本..." docker exec -i emotion-mysql mysql -u root -p$MYSQL_ROOT_PASSWORD $NACOS_DB_NAME < $nacos_sql_file log_info "Nacos配置数据库初始化完成" } # 验证数据库初始化 verify_database() { log_step "验证数据库初始化..." echo "" echo "=== 数据库验证结果 ===" # 验证情绪博物馆数据库 log_info "验证情绪博物馆数据库..." local emotion_tables=$(docker exec emotion-mysql mysql -u root -p$MYSQL_ROOT_PASSWORD -e "USE $EMOTION_DB_NAME; SHOW TABLES;" | wc -l) if [ $emotion_tables -gt 1 ]; then log_info "✅ 情绪博物馆数据库表数量: $((emotion_tables - 1))" else log_error "❌ 情绪博物馆数据库初始化失败" fi # 验证Nacos配置数据库 log_info "验证Nacos配置数据库..." local nacos_tables=$(docker exec emotion-mysql mysql -u root -p$MYSQL_ROOT_PASSWORD -e "USE $NACOS_DB_NAME; SHOW TABLES;" | wc -l) if [ $nacos_tables -gt 1 ]; then log_info "✅ Nacos配置数据库表数量: $((nacos_tables - 1))" else log_error "❌ Nacos配置数据库初始化失败" fi # 验证用户权限 log_info "验证数据库用户权限..." if docker exec emotion-mysql mysql -u $EMOTION_USER -p$EMOTION_PASSWORD -e "USE $EMOTION_DB_NAME; SELECT 1;" &> /dev/null; then log_info "✅ 情绪博物馆数据库用户权限正常" else log_error "❌ 情绪博物馆数据库用户权限异常" fi if docker exec emotion-mysql mysql -u $EMOTION_USER -p$EMOTION_PASSWORD -e "USE $NACOS_DB_NAME; SELECT 1;" &> /dev/null; then log_info "✅ Nacos数据库用户权限正常" else log_error "❌ Nacos数据库用户权限异常" fi echo "" log_info "数据库验证完成" } # 显示数据库连接信息 show_database_info() { log_step "数据库连接信息" echo "" echo "🗄️ 数据库连接信息:" echo " MySQL主机: $MYSQL_HOST:$MYSQL_PORT" echo " Root密码: $MYSQL_ROOT_PASSWORD" echo " 情绪博物馆数据库: $EMOTION_DB_NAME" echo " Nacos配置数据库: $NACOS_DB_NAME" echo " 应用用户: $EMOTION_USER" echo " 应用密码: $EMOTION_PASSWORD" echo "" echo "🔧 管理命令:" echo " 连接MySQL: docker exec -it emotion-mysql mysql -u root -p$MYSQL_ROOT_PASSWORD" echo " 查看日志: docker logs emotion-mysql" echo " 停止容器: docker stop emotion-mysql" echo " 启动容器: docker start emotion-mysql" echo "" } # 清理数据库(危险操作) clean_database() { log_warn "⚠️ 这将删除所有数据库数据,此操作不可逆!" read -p "确认删除所有数据库数据? (输入 'YES' 确认): " -r if [ "$REPLY" = "YES" ]; then log_step "清理数据库..." # 停止并删除MySQL容器 docker stop emotion-mysql 2>/dev/null || true docker rm emotion-mysql 2>/dev/null || true # 删除数据目录 sudo rm -rf ./data/mysql log_info "数据库清理完成" else log_info "清理操作已取消" fi } # 主函数 main() { echo "🗄️ 开始初始化情绪博物馆数据库..." echo "" check_docker start_mysql_container create_databases init_emotion_database init_nacos_database verify_database show_database_info echo "" log_info "🎉 数据库初始化完成!" } # 处理命令行参数 case "${1:-}" in "start") check_docker start_mysql_container show_database_info ;; "init") check_docker start_mysql_container create_databases init_emotion_database init_nacos_database verify_database ;; "verify") verify_database ;; "clean") clean_database ;; "info") show_database_info ;; *) main ;; esac