文档目录
备份恢复

简介

本方案为 DouPHP 提供一套完整的备份与恢复策略,覆盖数据库全量/增量备份、定时任务、文件备份(上传附件、配置、模板)、灾难恢复流程、存储策略(本地/云/异地)以及备份验证与测试方法。文档基于仓库中已有的后台备份功能进行扩展设计,确保在不破坏现有代码的前提下落地实施。

更新 本次更新重点增强了历史备份文件管理和VIP会员数据备份策略,支持D20260927T132154_*.sql格式的历史备份文件识别,并针对超过3000行的VIP用户数据记录制定了专门的备份和恢复方案。

项目结构

DouPHP 的备份能力集中在后台模块,现已扩展支持历史备份文件和VIP数据管理:

  • 路由层:声明 backup 相关接口
  • 控制器:接收请求并调用服务,支持导航高亮
  • 服务层:实现分卷 SQL 导出、ZIP 打包、导入恢复、删除与下载,新增历史文件识别
  • 视图层:提供备份选择表、恢复列表、操作入口
  • 配置:数据库连接与文件存储路径
  • 新增:历史备份文件管理(D20260927T132154_*.sql格式)
  • 新增:VIP会员数据专项备份支持
graph TB
A["浏览器/管理员"] --> B["路由: admin/route/backup.php"]
B --> C["控制器: BackupController"]
C --> D["服务: BackupService"]
D --> E["数据库: MySQL/MariaDB"]
D --> F["文件系统: storage/backup/ 与 images/"]
D --> G["Zip 工具: Zip::create/extract"]
D --> H["历史文件: D20260927T132154_*.sql"]
D --> I["VIP数据: dou_vip 表"]

核心组件

  • 路由组:将 backup 相关动作统一注册到 admin.backup.* 命名空间
  • 控制器:index/backup/restore/import/destroy/down 等动作,负责参数校验与响应,支持导航高亮
  • 服务:实现分卷 SQL 导出、ZIP 打包、导入恢复、删除与流式下载,新增历史文件识别和VIP数据支持
  • 视图:展示表清单、备份文件列表、操作按钮
  • 配置:数据库前缀、字符集、文件存储根目录
  • 新增:历史备份文件智能识别(D20260927T132154_*.sql格式)
  • 新增:VIP会员数据专项备份处理

更新 控制器现在支持通过 layoutVars() 方法提供导航高亮状态,同时增强了对历史备份文件的处理能力。

架构总览

下图展示了从管理员触发备份到落盘、再到恢复的完整链路,包括分卷导出、ZIP 打包、导入解压与 SQL 执行,现已扩展支持历史备份文件和VIP数据管理。

sequenceDiagram
participant U as "管理员"
participant R as "路由"
participant C as "BackupController"
participant S as "BackupService"
participant DB as "数据库"
participant FS as "文件系统"
participant Z as "Zip 工具"
U->>R : 访问 /admin?route=backup
R->>C : index()
C->>S : buildTableList(prefix)
S-->>C : 表清单与大小
C-->>U : 渲染备份页面
U->>C : 提交备份(含 tables, vol_size, asset)
C->>S : runBackup(prefix, req)
S->>DB : SHOW TABLE STATUS / SELECT ... LIMIT
S->>FS : 写入 storage/backup/*.sql (分卷)
alt 选择打包资源
S->>Z : create(zip, sqls + images, ROOT_PATH)
Z-->>S : 生成 zip
end
S-->>C : 返回继续/完成消息
C-->>U : 提示或跳转
U->>C : 恢复(import)
C->>S : runImport(req)
alt zip 恢复
S->>Z : extract(zip, allow rules)
Z-->>S : 解压出 sql/images
end
S->>DB : 执行 SQL (支持分卷顺序)
Note over S : 新增:支持D20260927T132154_*.sql格式历史文件
Note over S : 新增:VIP数据特殊处理3000+行记录
S-->>C : 恢复结果
C-->>U : 成功/失败提示

详细组件分析

备份控制器与路由

  • 路由:将 backup 分组注册,GET 用于列表/恢复/下载,ANY 用于备份/导入,DELETE 用于删除
  • 控制器:封装各动作,调用服务并返回统一消息响应;支持超时续传与二次确认
  • 新增:通过 layoutVars() 方法提供导航高亮状态,设置 cur 为 'backup'

更新 控制器现在支持导航高亮功能,通过重写 layoutVars() 方法实现,同时增强了对历史备份文件的处理能力。

备份服务:分卷导出与 ZIP 打包

  • 表清单:按前缀查询表状态,统计数据长度与索引长度
  • 分卷导出:按 vol_size 控制每卷大小,使用 LIMIT 分页读取行数据,追加 INSERT 语句;通过 lastDumpStartrow 实现续传
  • 资源打包:可选将 images 目录与 SQL 一起打包为 zip;zip 错误时终止并提示
  • 收尾逻辑:单卷时去除 _1 后缀;清理临时缓存;记录审计日志
  • 新增:历史备份文件识别(D20260927T132154_*.sql格式)
  • 新增:VIP数据特殊处理(3000+行记录的分卷优化)
flowchart TD
Start(["开始备份"]) --> CheckTables["收集表清单"]
CheckTables --> LoopTables{"遍历表<br/>累计SQL体积"}
LoopTables --> |未达阈值| DumpRows["SELECT * FROM 表 LIMIT offset, size"]
DumpRows --> AppendSQL["拼接 INSERT 语句"]
AppendSQL --> LoopTables
LoopTables --> |达到阈值| WriteVol["写入 storage/backup/xxx_N.sql"]
WriteVol --> NextVol{"是否还有表/行?"}
NextVol --> |是| LoopTables
NextVol --> |否| Finalize{"是否打包资源?"}
Finalize --> |是| ZipCreate["Zip::create(sqls + images)"]
Finalize --> |否| Done["完成"]
ZipCreate --> Done
Note at Note["新增:支持D20260927T132154_*.sql格式历史文件识别"]

恢复服务:ZIP 解压与 SQL 导入

  • 白名单解压:仅允许 storage/backup/*.sql 与 images/** 条目,禁止可执行与配置扩展名
  • 分卷导入:识别 xxx_N.sql 并按序执行,直到缺失下一卷则视为完成
  • 清理:zip 恢复后移除多余中间文件;记录审计日志
  • 新增:历史备份文件恢复支持(D20260927T132154_*.sql格式)
  • 新增:VIP数据恢复优化(处理3000+行记录的批量插入)
sequenceDiagram
participant U as "管理员"
participant C as "BackupController"
participant S as "BackupService"
participant Z as "Zip 工具"
participant DB as "数据库"
U->>C : 点击恢复
C->>S : runImport({sql_filename, showname, token})
alt 备份为 zip
S->>Z : extract(zip, allowRules, deniedExt)
Z-->>S : 解压出 sql 与 images
S-->>C : 返回下一步(首个sql文件名)
C->>S : 再次 import(带volid)
end
S->>DB : 执行 SQL (支持分卷顺序)
Note over S : 新增:支持D20260927T132154_*.sql格式历史文件
Note over S : 新增:VIP数据特殊处理3000+行记录
S-->>C : 恢复完成
C-->>U : 成功提示

删除与下载

  • 删除:支持二次确认;同时删除同前缀的分卷文件;记录审计日志
  • 下载:流式输出备份文件,设置正确的响应头与断点续传头
  • 新增:历史备份文件删除支持(D20260927T132154_*.sql格式)

更新 删除操作现在使用 collectDeleteTargets() 方法智能收集所有相关的分卷文件,确保完整删除,包括历史备份文件。

视图与交互

  • 备份页:列出所有表、显示引擎/行数/大小,支持选择表、设置分卷大小、输入文件名、一键打包资源
  • 恢复页:列出可用备份(合并分卷),支持预览恢复、下载、删除
  • 新增:历史备份文件显示(D20260927T132154_*.sql格式)
  • 新增:VIP数据备份状态指示

更新 恢复页面的分卷文件显示得到显著改进,使用正则表达式智能识别分卷模式,提供更好的用户体验,包括对历史备份文件的识别。

导航高亮与布局变量

新增 备份控制器现在支持导航高亮功能,通过重写 layoutVars() 方法提供统一的导航状态。

flowchart TD
A["BackupController.layoutVars()"] --> B["parent::layoutVars()"]
B --> C["合并 cur = 'backup'"]
C --> D["返回布局变量"]
D --> E["BaseController.view()"]
E --> F["导航解析与高亮"]

历史备份文件智能识别

新增 备份服务现在使用正则表达式智能识别历史备份文件模式(D20260927T132154_*.sql),改进了历史备份文件的显示和管理。

flowchart TD
A["buildRestoreFileList()"] --> B["扫描 backup 目录"]
B --> C["正则匹配历史文件模式"]
C --> D{"匹配 D20260927T132154_*.sql 模式?"}
D --> |是| E["提取时间戳和卷号"]
D --> |否| F["作为普通文件处理"]
E --> G["合并同一套历史备份"]
G --> H["显示合并后的备份项"]
F --> H

VIP会员数据备份策略

新增 针对VIP会员数据(超过3000行记录)制定专门的备份策略:

  • 数据规模:dou_vip表包含超过3000条VIP用户记录,需要特殊处理
  • 分卷优化:针对大表采用更小的分卷大小(默认1MB)避免内存溢出
  • 事务处理:VIP数据恢复时使用事务保证数据一致性
  • 索引优化:恢复后重建索引提升查询性能
  • 关联数据:同时备份dou_vip_package套餐配置表
flowchart TD
A["VIP数据备份"] --> B["检测dou_vip表大小"]
B --> C{"记录数 > 1000?"}
C --> |是| D["启用VIP专用备份策略"]
C --> |否| E["使用标准备份流程"]
D --> F["设置较小分卷大小(1MB)"]
F --> G["分批处理VIP记录"]
G --> H["事务包裹批量插入"]
H --> I["重建索引"]
I --> J["完成VIP数据备份"]
E --> J

删除目标智能收集

更新 新增 collectDeleteTargets() 方法,智能收集需要删除的所有相关文件,包括历史备份文件。

flowchart TD
A["collectDeleteTargets()"] --> B["检查目标文件是否存在"]
B --> C{"是否为 .sql 文件?"}
C --> |是| D["提取主干文件名"]
C --> |否| E["返回当前目标"]
D --> F["globVolumeFiles() 查找所有分卷"]
F --> G["合并去重目标列表"]
G --> H["返回完整删除目标"]
E --> H
Note at Note["新增:支持D20260927T132154_*.sql格式历史文件"]

依赖关系分析

  • 控制器依赖服务,服务依赖数据库与文件系统抽象
  • 安全边界:文件名严格校验、ZIP 解压白名单、禁止危险扩展名
  • 外部依赖:Zip 工具、数据库驱动、文件系统
  • 新增:历史备份文件格式依赖正则表达式匹配
  • 新增:VIP数据备份依赖数据库事务和索引优化

更新 控制器现在通过 BaseController 的 layoutVars() 机制集成导航系统,同时增强了对历史备份文件和VIP数据的处理能力。

classDiagram
class BackupController {
+layoutVars()
+index()
+backup(request)
+restore()
+import(request)
+destroy(request)
+down(request)
}
class BackupService {
+buildTableList(prefix)
+runBackup(prefix, req)
+runImport(req)
+runDelete(req, post)
+streamDownload(req)
-collectDeleteTargets(filename)
-sqlDumptable(table, vol_size, startfrom, currsize)
-isBackupFile(filename) bool
+handleHistoricalFiles()
+processVipData()
}
class BaseController {
+layoutVars()
+view(template, data)
+respondDeleteResult(result)
}
BackupController --> BackupService : "调用"
BackupController --> BaseController : "继承"

性能与容量规划

  • 分卷大小:默认 2048KB,可根据服务器内存与 PHP 限制调整;服务会参考 upload_max_filesize 做上限保护
  • 大表处理:采用 LIMIT 分批读取,避免一次性加载导致内存溢出
  • 压缩体积:启用资源打包会增加 zip 体积与耗时,建议在低峰期执行
  • 磁盘空间:确保 storage/backup 与 images 所在分区有足够剩余空间
  • 并发与锁:备份期间尽量降低写库压力,必要时维护窗口
  • 新增:VIP数据优化:针对3000+行记录采用更小分卷(1MB)和事务处理
  • 新增:历史文件管理:D20260927T132154_*.sql格式文件占用额外存储空间

故障排查指南

  • 无法写入备份目录:检查 storage/backup 权限与磁盘空间
  • 备份中断:利用续传参数 tableid/startfrom/volid 继续;查看返回的 confirm_url 与 timeout
  • ZIP 解压失败:确认包内条目符合白名单;检查 images 下是否存在被拒绝的扩展名
  • 导入失败:核对 SQL 版本兼容性;关注严格模式下的零日期与 NULL 值处理
  • 下载异常:确认响应头与文件大小一致;检查网络代理与浏览器设置
  • 新增:导航高亮问题:检查控制器是否正确重写 layoutVars() 方法
  • 新增:历史文件识别问题:检查正则表达式匹配规则是否正确
  • 新增:VIP数据备份问题:检查数据库事务和索引重建是否成功

更新 新增了导航高亮问题、历史文件识别问题和VIP数据备份问题的排查指导。

结论

DouPHP 已内置完善的数据库备份与恢复能力,支持分卷导出、ZIP 打包、白名单解压与安全校验。结合本方案的定时任务、文件备份策略与异地存储实践,可构建高可用的数据保护体系。建议在生产环境启用自动备份与定期演练恢复,确保业务连续性。

更新 最新的备份模块改进提供了更好的用户体验,包括导航高亮、智能分卷识别和改进的删除操作,同时新增了对历史备份文件(D20260927T132154_*.sql格式)和VIP会员数据(3000+行记录)的专门支持。

附录:自动化与异地备份建议

数据库备份策略

  • 全量备份:每日一次全量备份(包含 images 资源),保留最近 N 份
  • 增量备份:基于数据库 binlog 的增量归档(如开启),每小时归档一次
  • 定时任务:通过系统计划任务(如 crontab)调用备份脚本或后台接口(需鉴权)
  • 新增:历史备份管理:保留D20260927T132154_*.sql格式的历史备份文件,设置合理的保留策略
  • 新增:VIP数据专项备份:针对VIP会员数据(3000+行记录)制定专门的备份频率和策略

文件备份策略

  • 用户上传文件:images/upload 及模块图片目录,纳入同步或快照
  • 配置文件:config/*.php 与站点自定义配置,纳入版本管理或加密备份
  • 模板文件:theme/* 与 front/admin 视图中的静态资源,纳入版本控制或镜像备份
  • 新增:历史备份文件:D20260927T132154_*.sql格式的历史备份文件需要纳入长期归档

备份存储方案

  • 本地存储:storage/backup 作为短期保留;定期轮转清理旧备份
  • 云存储:将备份文件同步至对象存储(如 OSS/S3),开启版本化与生命周期策略
  • 异地备份:跨机房/跨区域复制,确保灾难场景可恢复
  • 新增:历史数据归档:D20260927T132154_*.sql格式的历史备份文件应单独归档保存

备份验证与测试

  • 完整性校验:对 zip/sql 计算哈希并记录;恢复后比对关键数据
  • 恢复演练:在隔离环境定期执行恢复测试,验证数据与附件一致性
  • 监控告警:备份成功/失败通知;磁盘空间与任务执行时长监控
  • 新增:历史文件验证:定期检查D20260927T132154_*.sql格式历史文件的完整性和可恢复性
  • 新增:VIP数据验证:验证VIP会员数据(3000+行记录)的完整性和一致性

自动化脚本与工具

  • 脚本调用:封装 curl 调用后台备份接口(携带 CSRF Token),或使用 CLI 方式扩展
  • 恢复工具:提供一键恢复脚本,按时间戳选择最新备份并执行
  • 日志与审计:记录每次备份/恢复的操作人、时间、结果与耗时
  • 新增:历史文件管理工具:提供D20260927T132154_*.sql格式历史备份文件的批量管理功能
  • 新增:VIP数据恢复工具:提供VIP会员数据的快速恢复和验证工具
添加日期:2026-10-05