# 备份恢复 **本文引用的文件** - [backend/app/core/config.py](file://backend/app/core/config.py) - [backend/app/core/database.py](file://backend/app/core/database.py) - [backend/init_db.py](file://backend/init_db.py) - [backend/alembic/env.py](file://backend/alembic/env.py) - [backend/alembic.ini](file://backend/alembic.ini) - [backend/app/models/models.py](file://backend/app/models/models.py) - [backend/.env.example](file://backend/.env.example) - [backend/requirements.txt](file://backend/requirements.txt) - [backend/app/main.py](file://backend/app/main.py) - [docs/database.md](file://docs/database.md) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本指南面向“医院绩效系统”的数据库备份与恢复,结合现有代码库中的数据库配置、迁移机制与模型定义,提供覆盖全量备份、增量/差异备份思路、自动化脚本编写、调度与存储管理、数据恢复与灾难恢复流程、业务连续性保障、备份验证与完整性检查、恢复测试方法,以及多环境(开发/测试/生产)数据同步与安全(加密传输、异地容灾)建议。由于当前仓库未包含数据库备份脚本与运维配置,本指南在不虚构实现的前提下,给出可落地的策略与流程。 ## 项目结构 系统采用 FastAPI + SQLAlchemy 异步 ORM + Alembic 迁移的后端架构,数据库连接与配置集中在核心模块,模型定义位于 models,迁移配置位于 alembic。整体结构清晰,便于扩展备份与恢复能力。 ```mermaid graph TB subgraph "后端" CFG["配置模块
backend/app/core/config.py"] DB["数据库连接模块
backend/app/core/database.py"] MODELS["数据模型
backend/app/models/models.py"] ALEMBIC_ENV["迁移环境
backend/alembic/env.py"] ALEMBIC_INI["迁移配置
backend/alembic.ini"] INIT_DB["初始化脚本
backend/init_db.py"] MAIN["应用入口
backend/app/main.py"] end CFG --> DB DB --> MODELS ALEMBIC_ENV --> MODELS ALEMBIC_INI --> ALEMBIC_ENV INIT_DB --> DB INIT_DB --> MODELS MAIN --> CFG ``` 图表来源 - [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47) - [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39) - [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438) - [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66) - [backend/alembic.ini](file://backend/alembic.ini#L1-L44) - [backend/init_db.py](file://backend/init_db.py#L1-L83) - [backend/app/main.py](file://backend/app/main.py#L1-L92) 章节来源 - [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47) - [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39) - [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438) - [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66) - [backend/alembic.ini](file://backend/alembic.ini#L1-L44) - [backend/init_db.py](file://backend/init_db.py#L1-L83) - [backend/app/main.py](file://backend/app/main.py#L1-L92) ## 核心组件 - 配置模块:集中管理数据库连接串、池大小、调试开关等,是备份与恢复策略的配置依据。 - 数据库连接模块:提供异步引擎与会话工厂,确保备份/恢复过程中的事务一致性。 - 模型定义:明确表结构、索引与约束,为备份范围与恢复顺序提供依据。 - 迁移环境与配置:Alembic 提供结构变更的版本化管理,备份策略需考虑结构与数据的协同。 - 初始化脚本:演示了建表与初始数据插入流程,可作为恢复后验证的基础。 章节来源 - [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26) - [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20) - [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85) - [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18) - [backend/alembic.ini](file://backend/alembic.ini#L7-L7) - [backend/init_db.py](file://backend/init_db.py#L11-L18) ## 架构总览 系统数据库连接通过异步引擎与会话工厂实现,模型层定义了完整的业务表结构。Alembic 提供结构迁移能力;初始化脚本用于快速搭建测试环境。备份与恢复应围绕这些组件展开,确保结构与数据的一致性。 ```mermaid sequenceDiagram participant App as "应用入口
app/main.py" participant Cfg as "配置模块
app/core/config.py" participant Db as "数据库连接
app/core/database.py" participant Alembic as "迁移环境
alembic/env.py" participant Models as "数据模型
models/models.py" App->>Cfg : 读取配置 Cfg-->>App : 返回数据库URL/池参数 App->>Db : 创建异步引擎与会话工厂 Db->>Models : 使用Base元数据 App->>Alembic : 执行迁移(结构) Alembic->>Models : 读取metadata App->>Db : 初始化/写入数据 ``` 图表来源 - [backend/app/main.py](file://backend/app/main.py#L15-L77) - [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26) - [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20) - [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18) - [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25) ## 详细组件分析 ### 数据库连接与备份影响面 - 异步引擎与会话工厂:备份应在数据库空闲时段执行,避免长事务阻塞;恢复后需重启应用以重新建立连接。 - 事务语义:备份期间的写入可能被截断,需结合 WAL/逻辑复制实现近零停机。 ```mermaid flowchart TD Start(["开始备份"]) --> CheckConn["检查数据库连接与可用性"] CheckConn --> TxnCheck{"是否存在长事务?"} TxnCheck --> |是| WaitIdle["等待事务结束或选择快照级别"] TxnCheck --> |否| ChooseMethod["选择备份方法
物理/逻辑/快照"] WaitIdle --> ChooseMethod ChooseMethod --> ExecBackup["执行备份"] ExecBackup --> Verify["校验备份完整性"] Verify --> End(["结束"]) ``` 图表来源 - [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20) 章节来源 - [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20) ### 模型与索引对备份的影响 - 索引与约束:备份需保证索引与约束在恢复后一致,避免后续查询异常。 - 关系与级联:恢复后需验证外键关系与级联行为。 ```mermaid erDiagram DEPARTMENTS ||--o{ STAFF : "1:N" STAFF ||--o{ ASSESSMENTS : "1:N" INDICATORS ||--o{ ASSESSMENT_DETAILS : "1:N" ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "1:N" STAFF ||--o{ SALARY_RECORDS : "1:N" USERS ||--o{ ASSESSMENTS : "1:N(assessor)" USERS ||--o{ ASSESSMENTS : "1:N(reviewer)" ``` 图表来源 - [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85) - [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114) - [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146) - [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178) - [backend/app/models/models.py](file://backend/app/models/models.py#L181-L202) - [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230) - [backend/app/models/models.py](file://backend/app/models/models.py#L244-L260) - [backend/app/models/models.py](file://backend/app/models/models.py#L270-L311) - [backend/app/models/models.py](file://backend/app/models/models.py#L314-L338) 章节来源 - [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85) - [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114) - [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146) - [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178) - [backend/app/models/models.py](file://backend/app/models/models.py#L181-L202) - [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230) - [backend/app/models/models.py](file://backend/app/models/models.py#L244-L260) - [backend/app/models/models.py](file://backend/app/models/models.py#L270-L311) - [backend/app/models/models.py](file://backend/app/models/models.py#L314-L338) ### Alembic 迁移与备份的关系 - 结构变更:迁移文件记录了数据库结构演进,备份时需同时备份迁移历史与当前结构,确保恢复后能正确升级。 - 版本控制:备份应包含 Alembic 配置与版本目录,以便在新环境中按版本回放。 ```mermaid sequenceDiagram participant Dev as "开发者" participant Alembic as "Alembic" participant Repo as "版本库" participant Prod as "生产数据库" Dev->>Alembic : 生成迁移文件 Alembic->>Repo : 提交迁移文件 Dev->>Prod : 执行迁移(结构变更) Prod-->>Dev : 升级完成 ``` 图表来源 - [docs/database.md](file://docs/database.md#L272-L285) - [backend/alembic/env.py](file://backend/alembic/env.py#L21-L32) - [backend/alembic/env.py](file://backend/alembic/env.py#L56-L65) 章节来源 - [docs/database.md](file://docs/database.md#L272-L285) - [backend/alembic/env.py](file://backend/alembic/env.py#L21-L32) - [backend/alembic/env.py](file://backend/alembic/env.py#L56-L65) ### 初始化脚本与恢复验证 - 初始化脚本展示了建表与插入初始数据的流程,可用于恢复后的基础数据验证。 章节来源 - [backend/init_db.py](file://backend/init_db.py#L11-L18) - [backend/init_db.py](file://backend/init_db.py#L19-L79) ## 依赖关系分析 - 配置模块驱动数据库连接模块,后者依赖模型基类;迁移环境读取配置与模型元数据;应用入口加载配置与路由。 - 备份策略需考虑这些依赖链路的连通性与一致性。 ```mermaid graph LR CFG["config.py"] --> DB["database.py"] DB --> MODELS["models.py"] ALEMBIC_ENV["alembic/env.py"] --> MODELS ALEMBIC_INI["alembic.ini"] --> ALEMBIC_ENV MAIN["app/main.py"] --> CFG INIT_DB["init_db.py"] --> DB INIT_DB --> MODELS ``` 图表来源 - [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47) - [backend/app/core/database.py](file://backend/app/core/database.py#L4-L25) - [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25) - [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18) - [backend/alembic.ini](file://backend/alembic.ini#L7-L7) - [backend/app/main.py](file://backend/app/main.py#L10-L12) - [backend/init_db.py](file://backend/init_db.py#L6-L8) 章节来源 - [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47) - [backend/app/core/database.py](file://backend/app/core/database.py#L4-L25) - [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25) - [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18) - [backend/alembic.ini](file://backend/alembic.ini#L7-L7) - [backend/app/main.py](file://backend/app/main.py#L10-L12) - [backend/init_db.py](file://backend/init_db.py#L6-L8) ## 性能考量 - 备份窗口:选择业务低峰时段,避免与长事务冲突。 - 连接池:备份期间可临时降低最大连接数,减少资源竞争。 - 并发策略:逻辑备份支持并发,但需注意锁与一致性;物理备份需确保一致性快照。 - 恢复速度:索引重建与约束检查是恢复耗时的关键环节,建议在专用实例上进行恢复演练。 ## 故障排查指南 - 连接失败:检查数据库 URL、凭据与网络连通性;确认配置模块的环境变量加载。 - 迁移异常:核对 Alembic 配置与版本目录;确保模型元数据与迁移目标一致。 - 恢复不完整:核对备份集是否包含结构与数据;确认恢复顺序与外键约束满足条件。 - 权限问题:确保备份/恢复账户具备必要权限;遵循最小权限原则。 章节来源 - [backend/.env.example](file://backend/.env.example#L3-L10) - [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26) - [backend/alembic/env.py](file://backend/alembic/env.py#L21-L32) - [backend/alembic/env.py](file://backend/alembic/env.py#L56-L65) ## 结论 本指南基于现有代码库的数据库配置、模型与迁移机制,提出了备份与恢复的整体策略与流程。建议在现有基础上补充自动化脚本、调度任务与存储管理规范,并定期开展恢复测试与演练,以确保业务连续性与灾难恢复的有效性。 ## 附录 ### 备份策略与配置方法 - 全量备份 - 逻辑备份:适用于 PostgreSQL,支持跨平台与增量点定位;建议开启压缩与并行度。 - 物理备份:适用于需要零停机的场景,需使用一致性快照或只读副本。 - 增量/差异备份 - 增量:基于 WAL 的增量备份,适合频繁写入场景;需配合 PITR(Point-in-Time Recovery)。 - 差异:每日差异备份+周期性全量,降低恢复时间;需严格管理差异链。 - 自动化脚本 - 使用定时任务触发备份;脚本需包含连接参数、输出路径、压缩与校验步骤。 - 对于 PostgreSQL,可参考官方工具与扩展(如逻辑复制、物理快照)。 - 备份调度 - 低峰时段执行;设置重试与告警;记录备份元数据(版本、时间戳、校验和)。 - 存储管理 - 多层存储:本地热存储、近线归档、远端冷存储;分级保留策略。 - 去重与压缩:降低存储成本;注意解压性能对恢复时间的影响。 ### 数据恢复流程 - 准备阶段:确认目标环境与依赖(数据库版本、驱动、连接参数)。 - 结构恢复:优先恢复迁移历史与结构,确保模型与索引一致。 - 数据恢复:按备份集顺序恢复数据;校验主键/唯一性与外键关系。 - 应用启动:重启应用,执行必要的迁移升级;运行初始化脚本进行基础数据验证。 ### 灾难恢复计划与业务连续性 - RTO/RPO:根据业务需求设定恢复目标;优先保证结构与关键数据的恢复。 - 多活/异地:部署多活实例或异地副本;定期进行切换演练。 - 降级策略:在极端情况下,优先恢复核心模块(如认证、基础数据),再逐步恢复其他模块。 ### 备份数据验证、完整性检查与恢复测试 - 校验清单:备份集完整性、结构一致性、关键数据抽样比对。 - 完整性检查:导入到隔离环境进行一致性校验(索引、约束、外键)。 - 恢复测试:定期在非生产环境进行恢复演练,评估恢复时间与数据可用性。 ### 多环境部署的备份策略 - 开发/测试:使用独立数据库或容器化实例;定期从生产拉取受限数据进行备份与恢复测试。 - 生产:采用企业级备份解决方案;结合逻辑复制或物理快照实现近零停机。 ### 备份存储安全、加密传输与异地容灾 - 加密:备份文件与传输通道均需加密;密钥管理遵循最小权限与轮换策略。 - 传输:使用安全协议(如 SFTP/HTTPS);对敏感数据进行脱敏处理。 - 异地容灾:在不同地理区域保留备份副本;定期进行异地恢复演练。