310 lines
8.8 KiB
Bash
Executable File
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
|