Files
happy-life-star/packages/emotion-museum-1.0.0-20250713_111829/init-database.sh
T

310 lines
8.8 KiB
Bash
Executable File

#!/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