优化数据库
This commit is contained in:
+42
-1
@@ -61,6 +61,7 @@ show_help() {
|
||||
选项:
|
||||
--no-build 不重新构建镜像,仅启动已有镜像
|
||||
--no-migrate 不执行数据库迁移
|
||||
--reset-db 重置数据库(测试阶段使用,会删除并重建)
|
||||
--logs 部署完成后跟随查看后端日志
|
||||
-h, --help 显示帮助信息
|
||||
|
||||
@@ -75,12 +76,14 @@ show_help() {
|
||||
示例:
|
||||
./scripts/deploy-prod.sh
|
||||
./scripts/deploy-prod.sh --no-build
|
||||
./scripts/deploy-prod.sh --reset-db
|
||||
./scripts/deploy-prod.sh --logs
|
||||
EOF
|
||||
}
|
||||
|
||||
NO_BUILD=0
|
||||
NO_MIGRATE=0
|
||||
RESET_DB=0
|
||||
FOLLOW_LOGS=0
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
@@ -93,6 +96,10 @@ while [[ $# -gt 0 ]]; do
|
||||
NO_MIGRATE=1
|
||||
shift
|
||||
;;
|
||||
--reset-db)
|
||||
RESET_DB=1
|
||||
shift
|
||||
;;
|
||||
--logs)
|
||||
FOLLOW_LOGS=1
|
||||
shift
|
||||
@@ -109,6 +116,11 @@ while [[ $# -gt 0 ]]; do
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "${RESET_DB}" == "1" && "${NO_MIGRATE}" == "1" ]]; then
|
||||
log_error "--reset-db 会清空数据库,不能和 --no-migrate 同时使用"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
validate_env() {
|
||||
if [[ ! -f "${BACKEND_ENV}" ]]; then
|
||||
log_error "未找到 backend/.env,请先执行:cp backend/.env.prod.example backend/.env 并填写生产配置"
|
||||
@@ -121,6 +133,7 @@ validate_env() {
|
||||
redis_addr="$(require_env REDIS_ADDR)"
|
||||
storage_endpoint="$(require_env STORAGE_ENDPOINT)"
|
||||
require_env MYSQL_DATABASE >/dev/null
|
||||
require_env MYSQL_ROOT_PASSWORD >/dev/null
|
||||
require_env MYSQL_USER >/dev/null
|
||||
require_env MYSQL_PASSWORD >/dev/null
|
||||
require_env JWT_SECRET >/dev/null
|
||||
@@ -182,6 +195,10 @@ mysql_exec() {
|
||||
compose exec -T mysql sh -c 'MYSQL_PWD="$MYSQL_PASSWORD" mysql -u"$MYSQL_USER" "$@"' sh "$@"
|
||||
}
|
||||
|
||||
mysql_root_exec() {
|
||||
compose exec -T mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -uroot "$@"' sh "$@"
|
||||
}
|
||||
|
||||
mysql_scalar() {
|
||||
mysql_exec -N -s "$(require_env MYSQL_DATABASE)" -e "$1"
|
||||
}
|
||||
@@ -212,6 +229,24 @@ bootstrap_existing_schema_history() {
|
||||
fi
|
||||
}
|
||||
|
||||
reset_database() {
|
||||
if [[ "${RESET_DB}" != "1" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
local database
|
||||
database="$(require_env MYSQL_DATABASE)"
|
||||
if [[ ! "${database}" =~ ^[A-Za-z0-9_]+$ ]]; then
|
||||
log_error "MYSQL_DATABASE 只能包含字母、数字和下划线,当前值:${database}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_warn "重置数据库 ${database}..."
|
||||
mysql_root_exec -e \
|
||||
"DROP DATABASE IF EXISTS \`${database}\`; CREATE DATABASE \`${database}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
||||
log_success "数据库已重建"
|
||||
}
|
||||
|
||||
run_migrations() {
|
||||
if [[ "${NO_MIGRATE}" == "1" ]]; then
|
||||
log_warn "已跳过数据库迁移"
|
||||
@@ -228,7 +263,12 @@ run_migrations() {
|
||||
version="$(basename "${file}" .sql)"
|
||||
applied="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations WHERE version = '${version}';")"
|
||||
if [[ "${applied}" != "0" ]]; then
|
||||
log "跳过已应用迁移:${version}"
|
||||
if [[ "${version}" == "000001_init" ]]; then
|
||||
log "同步初始化脚本:${version}"
|
||||
mysql_exec "$(require_env MYSQL_DATABASE)" < "${file}"
|
||||
else
|
||||
log "跳过已应用迁移:${version}"
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
|
||||
@@ -277,6 +317,7 @@ main() {
|
||||
wait_service_healthy mysql "MySQL"
|
||||
wait_service_healthy redis "Redis"
|
||||
wait_service_healthy minio "MinIO"
|
||||
reset_database
|
||||
run_migrations
|
||||
|
||||
log "重启后端以加载最新数据库状态..."
|
||||
|
||||
+9
-12
@@ -5,6 +5,7 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
COMPOSE_FILE="${ROOT_DIR}/deploy/docker-compose.dev.yml"
|
||||
BACKEND_ENV="${ROOT_DIR}/backend/.env"
|
||||
BACKEND_ENV_EXAMPLE="${ROOT_DIR}/backend/.env.example"
|
||||
INIT_SQL="${ROOT_DIR}/backend/migrations/000001_init.sql"
|
||||
BACKEND_PORT="${DEV_BACKEND_PORT:-8080}"
|
||||
FRONTEND_PORT="${DEV_FRONTEND_PORT:-5173}"
|
||||
BACKEND_HEALTH_URL="${DEV_BACKEND_HEALTH_URL:-http://127.0.0.1:${BACKEND_PORT}/health}"
|
||||
@@ -51,7 +52,7 @@ show_help() {
|
||||
|
||||
选项:
|
||||
--reset-db 重置数据库(删除并重建)
|
||||
--seed-only 仅重新加载种子数据
|
||||
--seed-only 仅重新同步基础数据
|
||||
--no-frontend 不启动前端
|
||||
--no-backend 不启动后端
|
||||
-h, --help 显示帮助信息
|
||||
@@ -72,7 +73,7 @@ show_help() {
|
||||
示例:
|
||||
./scripts/dev.sh # 正常启动
|
||||
./scripts/dev.sh --reset-db # 重置数据库后启动
|
||||
./scripts/dev.sh --seed-only # 重新加载种子数据
|
||||
./scripts/dev.sh --seed-only # 重新同步基础数据
|
||||
EOF
|
||||
exit 0
|
||||
}
|
||||
@@ -222,16 +223,12 @@ init_database() {
|
||||
|
||||
if [[ "${table_count}" == "0" ]]; then
|
||||
log "首次启动,初始化数据库..."
|
||||
local migration
|
||||
for migration in "${ROOT_DIR}"/backend/migrations/*.sql; do
|
||||
log "执行迁移:$(basename "${migration}")"
|
||||
mysql_hfb --default-character-set=utf8mb4 hfb_sys < "${migration}"
|
||||
done
|
||||
log "执行初始化脚本:$(basename "${INIT_SQL}")"
|
||||
mysql_hfb --default-character-set=utf8mb4 hfb_sys < "${INIT_SQL}"
|
||||
log_success "数据库初始化完成"
|
||||
elif [[ "${SEED_ONLY}" == "1" ]]; then
|
||||
log "重新加载种子数据..."
|
||||
mysql_hfb --default-character-set=utf8mb4 hfb_sys < "${ROOT_DIR}/backend/migrations/000002_seed.sql"
|
||||
log_success "种子数据加载完成"
|
||||
log "重新同步基础数据..."
|
||||
mysql_hfb --default-character-set=utf8mb4 hfb_sys < "${INIT_SQL}"
|
||||
else
|
||||
log "数据库已存在,跳过迁移(使用 --reset-db 重建)"
|
||||
fi
|
||||
@@ -320,9 +317,9 @@ main() {
|
||||
|
||||
init_database
|
||||
|
||||
# 仅加载种子数据模式
|
||||
# 仅同步基础数据模式
|
||||
if [[ "${SEED_ONLY}" == "1" ]]; then
|
||||
log_success "种子数据加载完成,退出"
|
||||
log_success "基础数据同步完成,退出"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user