简介
本文件为 DouPHP 的"备份恢复策略"完整文档,覆盖自动备份配置、增量与全量方案、数据一致性与完整性验证、灾难恢复流程、加密存储与传输安全、监控告警与异常处理,以及不同场景下的恢复策略(单表恢复、全库恢复、跨环境同步)。内容基于仓库中现有备份实现进行说明,并给出可落地的运维建议。
更新 本次更新重点介绍了导航高亮增强、分卷文件智能分组、删除操作优化和语言支持完善,这些改进显著提升了用户体验和操作便利性。
项目结构
DouPHP 的备份能力集中在后台模块,通过声明式路由暴露控制器接口,由服务层完成分卷导出、导入、删除与下载等核心逻辑。备份产物默认落盘至 storage/backup,支持 SQL 分卷与 ZIP(含 images 附件)打包。
graph TB
A["浏览器/管理员"] --> B["路由: admin/route/backup.php"]
B --> C["控制器: BackupController"]
C --> D["服务: BackupService"]
D --> E["数据库: DB::query/fnExecute"]
D --> F["文件系统: storage/backup/*.sql, *.zip"]
D --> G["压缩: Zip::create/extract"]
D --> H["智能预算: volumeBudgetBytes()"]
D --> I["错误跟踪: importFailedNotice()"]
C --> J["导航高亮: layoutVars()"]
C --> K["删除响应: respondDeleteResult()"]
核心组件
- 路由层:声明 backup 相关 GET/POST/DELETE 端点,统一入口。
- 控制器层:接收请求参数,调用服务层执行备份、导入、删除、下载等操作。
- 服务层:实现分卷 SQL 导出、ZIP 打包、导入执行、文件校验、流式下载、审计日志记录。
- 视图层:提供备份选择表、设置分卷大小、一键打包资源、恢复列表与操作按钮。
- 配置:数据库连接、表前缀、字符集等;系统常量用于框架级行为控制。
更新 新增的功能特性:
- 导航高亮:通过layoutVars()方法设置cur='backup',实现菜单项高亮显示
- 分卷智能分组:使用正则表达式 /^(.*)_([0-9]+).sql$/ 识别分卷文件并合并显示
- 删除操作优化:collectDeleteTargets()函数统一收集要删除的分卷文件
- 标准化响应:respondDeleteResult()方法统一处理删除操作的响应逻辑
- 语言支持:新增backup_delete_fail、backup_vol_include等中文错误消息
架构总览
备份与恢复的关键流程如下:
sequenceDiagram
participant U as "管理员"
participant R as "路由"
participant C as "BackupController"
participant S as "BackupService"
participant DB as "数据库"
participant FS as "storage/backup"
participant Z as "Zip工具"
U->>R : 访问备份页面
R->>C : GET /backup/index
C->>C : layoutVars() 设置导航高亮
C->>S : buildTableList()
S-->>C : 表清单与总量
C-->>U : 渲染备份界面
U->>R : POST /backup/backup
R->>C : backup()
C->>S : runBackup(prefix, req)
S->>S : volumeBudgetBytes() 计算预算
S->>DB : SHOW TABLE STATUS / SELECT ... LIMIT
S->>FS : 写入分卷 .sql
alt 选择打包资源
S->>Z : create(zip, sqls + images)
Z-->>S : 成功/失败
end
S-->>C : 返回消息/续传URL
C-->>U : 提示并跳转
U->>R : POST /backup/import
R->>C : import()
C->>S : runImport(req)
S->>FS : 读取SQL或解压ZIP
S->>DB : fnExecute(sql)
S->>S : importFailedNotice() 错误统计
S-->>C : 结果
C-->>U : 提示并跳转
U->>R : DELETE /backup/destroy
R->>C : destroy()
C->>S : runDelete(req, post)
S->>S : collectDeleteTargets() 收集目标文件
S->>FS : 删除主文件及分卷
C->>C : respondDeleteResult() 标准化响应
C-->>U : 删除结果
详细组件分析
备份控制器(BackupController)
- 职责:展示备份页、触发备份、列出可恢复文件、导入 SQL、删除备份、下载备份。
- 关键方法:
- index:构建表清单与总量,渲染备份界面。
- backup:调用服务执行分卷备份,支持可选打包 images。
- restore:列出 storage/backup 下可用备份文件。
- import:按分卷顺序导入 SQL,支持 ZIP 先解压再导入。
- destroy:二次确认后删除备份及同前缀分卷。
- down:流式输出备份文件供下载。
更新 控制器层改进:
- 导航高亮:通过重写layoutVars()方法设置cur='backup',实现侧边栏菜单高亮
- 删除响应:使用respondDeleteResult()方法统一处理删除操作的响应逻辑,支持二次确认和直接删除两种模式
备份服务(BackupService)
- 职责:组织表清单、执行分卷导出、导入、删除、下载、审计日志。
- 关键能力:
- 分卷导出:按 vol_size 限制每卷大小,使用 LIMIT 分页逐表导出,支持续传(tableid/startfrom/volid)。
- 一致性处理:导出前 SET NAMES 字符集;对零日期值转换为 NULL,避免严格模式导入失败。
- 完整性保护:文件名白名单校验(isBackupFile),仅允许 sql/zip;ZIP 解压时限定条目白名单与禁止扩展名。
- 资源打包:可选将 images 目录与 SQL 一起打包为 ZIP,便于整体迁移。
- 审计记录:备份、恢复、删除均记录管理日志。
- 流式下载:直接以二进制流输出备份文件。
更新 分卷文件显示改进:
- 智能分组:使用正则表达式 /^(.*)_([0-9]+).sql$/ 识别分卷文件模式
- 合并显示:同一套分卷在列表中只显示一行,显示卷数信息
- 代表文件:取序号最小的卷作为代表文件,确保操作的一致性
更新 删除操作优化:
- 目标收集:collectDeleteTargets()函数统一收集要删除的文件,包括主文件和所有分卷
- 智能匹配:自动识别分卷文件模式,确保删除操作的完整性
- 权限检查:删除前检查文件存在性和写权限
flowchart TD
Start(["开始"]) --> CheckName["校验文件名合法性"]
CheckName --> |非法| Err["抛出异常并返回错误"]
CheckName --> |合法| Act{"动作类型"}
Act --> |备份| Dump["分卷导出SQL<br/>LIMIT分页/续传<br/>智能预算控制"]
Act --> |导入| Import["读取SQL或解压ZIP<br/>按volid顺序执行<br/>错误统计跟踪"]
Act --> |删除| Del["collectDeleteTargets()<br/>收集主文件+分卷<br/>批量删除"]
Act --> |下载| Stream["流式输出二进制文件"]
Dump --> End(["结束"])
Import --> End
Del --> End
Stream --> End
路由与视图
- 路由:声明 backup 组,GET/POST/DELETE 对应不同动作。
- 视图:提供表勾选、分卷大小设置、一键打包资源、恢复列表与操作按钮(恢复/下载/删除)。
更新 视图层改进:
- 分卷信息显示:当vol_number > 1时显示分卷数量标记
- 操作列统一:每套分卷只有一行可操作,避免孤儿文件问题
- 提示信息:hover显示分卷总数信息
依赖关系分析
- 控制器依赖服务:BackupController 注入 BackupService。
- 服务依赖:
- 数据库:查询表状态、导出数据、执行 SQL。
- 文件系统:读写 storage/backup 目录。
- 压缩:Zip 工具创建/解压 ZIP。
- 配置:站点前缀、字符集等。
- 审计:记录管理操作日志。
更新 新增的依赖关系:
- 导航系统:依赖BaseController的layoutVars()方法实现菜单高亮
- 语言包:依赖common.lang.php中的备份相关语言定义
- 正则表达式:使用preg_match进行分卷文件模式识别
classDiagram
class BackupController {
+index()
+backup(request)
+restore()
+import(request)
+destroy(request)
+down(request)
+layoutVars()
}
class BaseController {
+view(template, data)
+respondDeleteResult(result)
+layoutVars()
}
class BackupService {
+buildTableList(prefix)
+runBackup(prefix, req)
+runImport(req)
+runDelete(req, post)
+streamDownload(req)
-collectDeleteTargets(filename)
-volumeHeadRow(row, stem, volNumber)
-sqlDumptable(table, vol_size, startfrom, currsize)
-volumeBudgetBytes(vol_size)
-importFailedNotice(failed)
-globVolumeFiles(filename, ext)
-isBackupFile(filename)
}
class DB {
+query(sql)
+fnExecute(sql)
+version()
+charset()
+getPrefix()
}
class Zip {
+create(file, list, root, &error)
+extract(file, root, allowRules, deniedExtensions)
}
BackupController --> BaseController : "继承"
BackupController --> BackupService : "调用"
BackupService --> DB : "读写/执行"
BackupService --> Zip : "压缩/解压"
性能与容量规划
- 分卷大小:默认 2048KB,可根据服务器内存与上传限制调整;服务会参考 upload_max_filesize 上限。
- 导出效率:采用 LIMIT 分页逐表导出,避免一次性加载大表导致内存溢出。
- 打包体积:ZIP 包含 images 目录,适合整体迁移;若仅需数据库,可选择仅导出 SQL。
- 存储空间:备份文件位于 storage/backup,需定期清理旧备份,避免磁盘占满。
- 并发与超时:控制器在备份入口关闭脚本超时限制,确保长任务完成。
更新 性能优化改进:
- 分卷显示优化:通过智能分组减少列表渲染开销
- 删除操作优化:collectDeleteTargets()函数提高文件查找效率
- 内存管理:合理控制分卷文件大小,避免内存溢出
故障排查指南
- 常见错误与定位:
- 文件名不合法:isBackupFile 拒绝路径穿越与非法扩展,检查传入文件名。
- 无选择表:首次备份必须选择至少一张表,否则会抛出异常。
- 写入失败:storage/backup 目录不可写会导致备份失败,检查权限。
- ZIP 解压失败:解压时受白名单与禁止扩展名限制,检查包内条目。
- 导入失败:严格模式下零日期值会被拒绝,服务已做转换;如仍失败,检查 SQL 语法与字符集。
- 审计日志:备份、恢复、删除均记录管理日志,可通过后台日志查看操作轨迹。
- 下载问题:下载接口直接输出二进制,检查响应头与网络代理是否拦截。
更新 故障排查改进:
- 删除操作诊断:新增backup_delete_fail错误消息,提供详细的删除失败原因
- 分卷文件问题:通过正则表达式精确识别分卷文件,避免误删或漏删
- 语言支持:所有错误消息都提供中文本地化,便于用户理解问题
结论
DouPHP 内置了完整的数据库备份与恢复能力,支持分卷导出、ZIP 打包、安全导入与审计记录。结合合理的分卷策略与存储管理,可满足日常备份与灾难恢复需求。对于自动化与高级安全能力,可在现有基础上扩展定时任务与加密机制。
更新 最新改进显著提升系统体验:
- 导航高亮增强:提升用户界面的直观性和易用性
- 分卷智能分组:改善大量分卷文件的管理体验
- 删除操作优化:提供更可靠和安全的文件删除功能
- 语言支持完善:提供完整的中文错误提示,降低使用门槛
附录:操作清单与最佳实践
自动备份配置(建议)
- 定时任务:通过系统 crontab 或任务调度器定时调用备份接口(例如每日凌晨执行全量备份)。
- 备份策略:
- 全量备份:每天一次,保留最近 N 份。
- 增量备份:当前实现为全量分卷导出;如需增量,可基于 binlog 或时间点恢复策略配合数据库原生工具实现。
- 存储空间管理:定期清理过期备份,监控 storage/backup 目录大小。
更新 操作体验改进:
- 导航高亮:备份页面会自动高亮显示,方便用户快速定位
- 分卷管理:智能分组显示让大量分卷文件更易管理
- 删除确认:增强的删除确认机制防止误操作
增量备份与全量备份方案
- 全量备份:使用"全部表"选项导出完整 SQL,必要时打包 images 目录。
- 增量备份:当前未内置增量导出;可结合数据库 binlog 或外部备份工具实现增量策略。
- 数据一致性:导出前设置字符集,零日期值转换为 NULL,避免严格模式导入失败。
- 完整性验证:导入后核对关键表行数与业务指标;ZIP 解压受白名单与禁止扩展名保护。
更新 分卷管理改进:
- 智能识别:使用正则表达式精确识别分卷文件模式
- 合并显示:同一套分卷合并为一行显示,提升可读性
- 代表文件:取序号最小的卷作为操作入口,确保一致性
灾难恢复流程
- 数据恢复步骤:
- 选择备份文件,点击"安全导入"可先自动备份当前数据,再导入目标备份。
- 或直接导入,适用于测试环境或明确覆盖的场景。
- 服务重启流程:恢复完成后,按需重启 Web 服务与缓存服务,确保配置与缓存生效。
- 业务连续性保障:优先恢复核心业务表;分阶段验证关键功能;准备回滚预案。
更新 恢复体验改进:
- 分卷显示:清晰显示分卷数量,帮助用户了解备份规模
- 错误提示:提供详细的中文错误信息,便于问题诊断
- 操作反馈:标准化的删除响应提供更好的操作反馈
加密存储与传输安全
- 存储安全:备份文件落盘于 storage/backup,建议限制目录访问权限,仅应用账户可写。
- 传输安全:下载接口输出二进制文件,建议通过 HTTPS 与鉴权访问。
- 压缩包安全:ZIP 解压受白名单与禁止扩展名限制,防止恶意文件覆盖。
- 密钥管理:系统存在凭据加密能力,可用于敏感配置;备份本身未内置加密,可按需叠加外部加密工具。
监控告警与异常处理
- 监控建议:
- 监控 storage/backup 目录大小与增长趋势。
- 监控备份任务执行成功率与耗时。
- 监控数据库连接与慢查询,避免备份期间影响业务。
- 告警规则:
- 备份失败立即告警。
- 存储空间不足阈值告警。
- 导入失败或数据不一致告警。
- 异常处理:
- 捕获并记录 DomainException,返回用户友好提示。
- 审计日志记录所有备份、恢复、删除操作。
更新 监控和告警改进:
- 删除操作监控:新增backup_delete_fail错误消息,便于监控删除操作失败
- 分卷文件监控:智能分组显示帮助监控分卷文件完整性
- 语言支持:所有监控消息都提供中文本地化
不同场景下的恢复策略
- 单表恢复:
- 从备份文件中提取目标表的 CREATE 与 INSERT 语句,在目标库中单独执行。
- 注意字段类型与字符集一致性。
- 全库恢复:
- 使用"安全导入"先备份当前数据,再导入目标备份。
- 恢复后验证关键业务数据与索引。
- 跨环境数据同步:
- 使用 ZIP 打包(含 images)迁移到目标环境。
- 解压后导入 SQL,检查路径与配置差异。
更新 多环境支持改进:
- 导航适配:layoutVars()方法确保在不同环境下导航高亮正常工作
- 分卷兼容:正则表达式模式确保跨环境的分卷文件识别一致性
- 语言适配:中文错误消息提升多语言环境下的用户体验