feat(deploy): 财务上线数据阶段编排与运维加固

- 新增 deploy/post-deploy.sh:回填 → 业务配置 → 同步 → 验收四阶段编排,支持 --only/--dry-run/窗口参数
- 新增 tools 镜像与 scripts/verify-finance-launch.sql(15 项上线验收)
- 验收口径:成本闸门二选一、要求已过账凭证、备用金支出关联、成本覆盖 WARN
- 加固:参数校验、工具镜像每次刷新、docker run 兜底超时、迁移前缀探测、验收失败退出码 2
- 工具镜像预建 /app/data,消除日志 EACCES
- 回填后与 restore-db 恢复后自动 VACUUM (ANALYZE),修复订单列表分页 COUNT 全表扫描(41 万单实测 27s → 0.17s)
- 文档:41 万单同步用 7 天窗 + 180s 超时;回填/恢复后刷新统计
This commit is contained in:
yml2213
2026-10-28 11:52:42 +08:00
parent 2ddc26091c
commit 08318ef8d9
8 changed files with 977 additions and 8 deletions
+22
View File
@@ -199,6 +199,26 @@ restore_configs() {
rm -rf -- "${staging}"
}
# pg_restore 不会带 pg_statistic,恢复后 planner 会按默认选择率选计划
# (41 万单实测会把订单列表 COUNT 走成 orders 全表扫描,冷缓存 20 秒以上)。
# 同时 VACUUM 重建可见性映射,让 index-only scan 真正只读索引。
refresh_stats() {
local database_url
database_url="$(read_env_value DATABASE_URL)"
log "刷新统计信息与可见性(VACUUM ANALYZE),恢复后首次查询才不会全表扫描"
if [[ -z "${database_url}" || "${database_url}" == *"@postgres:"* ]]; then
if ! docker compose exec -T postgres sh -c \
'psql -U "${POSTGRES_USER:-postgres}" -d "${POSTGRES_DB:-order_site}" -v ON_ERROR_STOP=1 -c "VACUUM (ANALYZE)"'; then
warn "VACUUM ANALYZE 失败。恢复已完成,但请手动执行后再开放后台,否则列表查询可能很慢。"
fi
else
if ! docker compose exec -T -e DB_RESTORE_URL="${database_url}" postgres sh -c \
'psql "$DB_RESTORE_URL" -v ON_ERROR_STOP=1 -c "VACUUM (ANALYZE)"'; then
warn "VACUUM ANALYZE 失败。恢复已完成,但请手动执行后再开放后台,否则列表查询可能很慢。"
fi
fi
}
restore_live_database() {
local key="$1" target="$2" config_target="${3:-}"
@@ -235,6 +255,8 @@ restore_live_database() {
fail "迁移失败。请查看日志;数据已恢复到备份时点。"
fi
refresh_stats
if [[ -n "${config_target}" ]]; then
restore_configs "${config_target}"
fi