# 数据库备份与恢复

<cite>
**本文引用的文件**
- [AGENTS.MD](file://AGENTS.MD)
- [.example.env](file://.example.env)
- [composer.json](file://composer.json)
- [composer.lock](file://composer.lock)
- [thinkcmf.sql](file://vendor/thinkcmf/cmf-install/src/install/data/thinkcmf.sql)
</cite>

## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)

## 简介
本指南面向 ThinkCMF 项目，围绕数据库备份与恢复提供系统化实践方案：覆盖全量/增量/差异备份策略、备份文件格式与存储（SQL、压缩包、云存储）、自动化脚本与定时任务、恢复流程（完全/点/部分）、备份验证与测试、灾难恢复计划以及常见问题与解决方案。内容结合仓库中已有的数据库迁移能力与环境配置，帮助运维与开发团队建立稳定可靠的数据库生命周期管理体系。

## 项目结构
- ThinkCMF 使用 ThinkPHP 8.x 与数据库 ORM，通过迁移工具实现数据库结构演进与回滚。
- 数据库连接与默认字符集在示例环境变量中给出，便于统一备份与恢复的一致性。
- 安装数据样例 SQL 文件可用于初始化与对比校验。

```mermaid
graph TB
A["应用层<br/>ThinkCMF 应用"] --> B["数据库层<br/>MySQL/兼容引擎"]
A --> C["迁移工具<br/>xia/migration"]
A --> D["环境配置<br/>.example.env"]
A --> E["安装数据样例<br/>thinkcmf.sql"]
```

**图表来源**
- [composer.json:1-77](file://composer.json#L1-L77)
- [.example.env:1-1](file://.example.env#L1-L1)
- [AGENTS.MD:576-599](file://AGENTS.MD#L576-L599)

**章节来源**
- [composer.json:1-77](file://composer.json#L1-L77)
- [.example.env:1-1](file://.example.env#L1-L1)
- [AGENTS.MD:576-599](file://AGENTS.MD#L576-L599)

## 核心组件
- 数据库迁移与版本管理：基于 xia/migration 的迁移命令，支持创建、执行与回滚，适合作为结构变更的“增量”依据。
- 环境配置：示例环境变量包含数据库连接与字符集等关键项，用于备份一致性与恢复匹配。
- 安装样例 SQL：提供初始表结构与基础数据，便于全量备份后的快速验证与对比。

**章节来源**
- [AGENTS.MD:576-599](file://AGENTS.MD#L576-L599)
- [.example.env:1-1](file://.example.env#L1-L1)
- [thinkcmf.sql:1-200](file://vendor/thinkcmf/cmf-install/src/install/data/thinkcmf.sql#L1-L200)

## 架构总览
下图展示备份与恢复在 ThinkCMF 中的总体交互：应用层通过 ORM 访问数据库；迁移工具负责结构变更；备份侧可采用 mysqldump 全量导出；恢复侧通过导入 SQL 或迁移工具进行结构与数据恢复。

```mermaid
graph TB
subgraph "应用与配置"
APP["ThinkCMF 应用"]
ENV[".example.env<br/>数据库连接/字符集"]
MIG["迁移工具<br/>xia/migration"]
end
subgraph "数据库"
DB["MySQL 数据库"]
SQL["SQL 备份文件"]
ZIP["压缩包备份"]
CLOUD["云存储"]
end
APP --> DB
ENV --> DB
MIG --> DB
APP --> SQL
SQL --> ZIP
ZIP --> CLOUD
CLOUD --> SQL
SQL --> DB
ZIP --> DB
MIG --> DB
```

**图表来源**
- [composer.json:1-77](file://composer.json#L1-L77)
- [composer.lock:1122-1151](file://composer.lock#L1122-L1151)
- [.example.env:1-1](file://.example.env#L1-L1)

## 详细组件分析

### 备份策略与实施
- 全量备份
  - 使用 mysqldump 导出数据库结构与数据，建议开启事务一致性与字符集一致选项，确保与示例环境一致。
  - 备份文件命名包含时间戳与数据库名，便于检索与归档。
- 增量备份
  - 基于 binlog 或逻辑增量（迁移记录）追踪结构与数据变更，配合迁移工具的“执行/回滚”能力形成可逆的增量基线。
- 差异备份
  - 以最近一次全量为基础，仅备份差异数据或结构变更，降低存储与传输成本。

```mermaid
flowchart TD
Start(["开始"]) --> Choose["选择备份类型<br/>全量/增量/差异"]
Choose --> Full{"全量?"}
Full --> |是| Dump["mysqldump 导出<br/>含结构与数据"]
Full --> |否| Inc{"增量?"}
Inc --> |是| Binlog["binlog/迁移记录<br/>追踪变更"]
Inc --> |否| Diff["差异比较<br/>上次全量之后的变更"]
Dump --> Compress["压缩打包"]
Binlog --> Compress
Diff --> Compress
Compress --> Store["本地/云存储"]
Store --> End(["结束"])
```

[本图为概念流程，无需图表来源]

### 备份文件格式与存储
- SQL 文件：结构与数据一体化，便于跨平台恢复与对比。
- 压缩包：对 SQL 文件进行压缩，节省存储空间并提升传输效率。
- 云存储：将压缩包上传至对象存储，支持多地冗余与版本管理。

```mermaid
graph LR
A["SQL 文件"] --> B["压缩包(.tar.gz/.zip)"]
B --> C["本地磁盘"]
B --> D["云存储(对象存储)"]
```

[本图为概念流程，无需图表来源]

### 自动化备份脚本与定时任务
- 脚本职责
  - 调用 mysqldump 执行全量导出，生成带时间戳的文件名。
  - 对导出文件进行压缩与校验。
  - 将压缩包上传到云存储，并清理本地临时文件。
- 定时任务
  - 使用系统定时任务按日/周/月调度脚本，确保备份频率与保留周期符合 SLA。
- 监控告警
  - 备份失败、压缩失败、上传失败均应触发告警；定期检查备份文件完整性与可恢复性。

```mermaid
sequenceDiagram
participant Cron as "定时任务"
participant Script as "备份脚本"
participant MySQL as "数据库"
participant Zip as "压缩工具"
participant Cloud as "云存储"
Cron->>Script : 触发执行
Script->>MySQL : mysqldump 导出
MySQL-->>Script : SQL 文件
Script->>Zip : 压缩 SQL
Zip-->>Script : 压缩包
Script->>Cloud : 上传压缩包
Cloud-->>Script : 上传结果
Script-->>Cron : 返回状态
```

[本图为概念流程，无需图表来源]

### 恢复流程
- 完全恢复
  - 选择最新可用的全量备份，导入 SQL 并应用必要的迁移。
- 点恢复
  - 在全量基础上，按时间点应用增量或迁移记录，恢复到目标时刻。
- 部分恢复
  - 针对特定表或业务模块进行选择性导入，减少恢复时间与影响范围。

```mermaid
flowchart TD
RStart(["开始恢复"]) --> Select["选择备份集<br/>全量/增量/差异"]
Select --> Load["加载 SQL/迁移记录"]
Load --> Apply["导入/执行迁移"]
Apply --> Verify["验证数据一致性"]
Verify --> REnd(["完成"])
```

[本图为概念流程，无需图表来源]

### 备份验证与测试
- 结构一致性：比对安装样例 SQL 与当前数据库结构，确保字段、索引、字符集一致。
- 数据抽样：随机抽取关键表与记录，核对数量与典型字段值。
- 可恢复性：在隔离环境中执行恢复流程，验证导入与迁移是否成功。

```mermaid
flowchart TD
VStart(["开始验证"]) --> Schema["结构对比<br/>安装样例 SQL vs 当前"]
Schema --> Data["数据抽样<br/>关键表/关键字段"]
Data --> Test["可恢复性测试<br/>隔离环境导入"]
Test --> VEnd(["输出报告"])
```

**章节来源**
- [thinkcmf.sql:1-200](file://vendor/thinkcmf/cmf-install/src/install/data/thinkcmf.sql#L1-L200)

### 灾难恢复计划
- 故障场景
  - 数据库崩溃、误删数据、迁移失败、备份文件损坏。
- 应急响应
  - 快速定位最近可用备份，启动恢复流程；必要时启用备用节点或冷备。
  - 恢复后进行验证与回归测试，确认业务可用性。
- 文档与演练
  - 制定 DRP 流程手册，定期组织演练，优化恢复时间与数据损失目标。

[本节为概念性内容，无需章节来源]

## 依赖分析
- ThinkCMF 使用 ThinkPHP 8.x 与数据库 ORM，迁移工具由 xia/migration 提供，遵循 Phinx 规范，支持迁移的创建、执行与回滚。
- composer.json 中定义了迁移执行的自动脚本，便于在部署后自动运行迁移，保证数据库结构与应用版本一致。

```mermaid
graph TB
CMF["ThinkCMF 应用"] --> ORM["ThinkORM"]
CMF --> MIG["xia/migration"]
MIG --> PHINX["Phinx 迁移框架"]
```

**图表来源**
- [composer.json:1-77](file://composer.json#L1-L77)
- [composer.lock:1122-1151](file://composer.lock#L1122-L1151)

**章节来源**
- [composer.json:1-77](file://composer.json#L1-L77)
- [composer.lock:1122-1151](file://composer.lock#L1122-L1151)

## 性能考虑
- 备份窗口：在业务低峰期执行全量备份，避免影响线上性能。
- 并行压缩：对大文件采用多线程压缩，缩短备份时间。
- 传输优化：使用断点续传与并发上传，提升云存储上传效率。
- 恢复加速：在恢复前预热数据库缓冲池，减少导入时的 IO 压力。

[本节为通用指导，无需章节来源]

## 故障排查指南
- 备份失败
  - 检查数据库连接与权限、mysqldump 参数与字符集设置、磁盘空间与网络稳定性。
- 压缩失败
  - 核对压缩工具版本与参数，检查磁盘空间与权限。
- 上传失败
  - 校验云存储凭证与网络连通性，确认对象桶权限与配额。
- 恢复异常
  - 对照示例环境变量中的字符集与连接参数，确保恢复环境一致；逐表导入定位问题表。

**章节来源**
- [.example.env:1-1](file://.example.env#L1-L1)

## 结论
通过结合 ThinkCMF 的迁移能力与标准的数据库备份实践，可构建覆盖全量/增量/差异的备份体系，配合自动化脚本与监控告警，实现高可靠的数据保护与快速恢复。建议定期进行备份验证与灾难演练，持续优化备份策略与恢复流程。

## 附录
- 关键参考文件
  - 迁移与数据库规范：[AGENTS.MD:576-599](file://AGENTS.MD#L576-L599)
  - 示例环境变量（数据库连接/字符集）：[.example.env:1-1](file://.example.env#L1-L1)
  - 安装样例 SQL（结构与数据）：[thinkcmf.sql:1-200](file://vendor/thinkcmf/cmf-install/src/install/data/thinkcmf.sql#L1-L200)
  - 迁移工具依赖与自动脚本：[composer.json:1-77](file://composer.json#L1-L77)，[composer.lock:1122-1151](file://composer.lock#L1122-L1151)