优化数据库

This commit is contained in:
yml
2026-06-02 20:37:00 +08:00
parent 5cb2f33872
commit af754bb594
9 changed files with 206 additions and 185 deletions
+42 -1
View File
@@ -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 "重启后端以加载最新数据库状态..."