加载中…
文档目录
灾难恢复

简介

本文件为 DouPHP 提供完整的灾难恢复方案,覆盖数据丢失(误删、数据库损坏)与服务中断(服务器崩溃、磁盘故障、网络中断)等典型场景。文档基于系统内置的备份与恢复能力,结合存储与附件机制,给出从“准备—执行—验证—回滚”的全流程预案,并提供可落地的自动化思路与手动步骤,帮助在最小停机时间内完成恢复。

项目结构

DouPHP 的备份与恢复由后台模块提供:

  • 路由层:声明式路由将 /backup 请求分发到控制器。
  • 控制器层:接收参数、调用服务、返回消息与跳转。
  • 服务层:实现分卷 SQL 导出/导入、ZIP 打包/解压、文件校验与安全限制、审计日志记录。
  • 视图层:提供备份选择、恢复列表、操作入口。
  • 配置与存储:数据库连接信息位于配置文件;备份文件存放于 storage/backup;附件资源位于 images。
graph TB
AdminUI["管理界面<br/>backup.htm"] --> Route["路由<br/>admin/route/backup.php"]
Route --> Ctrl["控制器<br/>BackupController.php"]
Ctrl --> Svc["服务<br/>BackupService.php"]
Svc --> DB["数据库<br/>config/config.php"]
Svc --> FS["文件系统<br/>storage/backup, images"]
FS --> Disk["磁盘抽象<br/>Disk.php"]

图表来源

  • backup.php:29-33
  • BackupController.php:58-162
  • BackupService.php:75-637
  • config.php:15-52
  • Disk.php:92-137

章节来源

  • backup.php:29-33
  • BackupController.php:58-162
  • BackupService.php:75-637
  • backup.htm:28-78
  • config.php:15-52

核心组件

  • 备份与恢复控制器:负责页面渲染、参数校验、结果响应与二次确认跳转。
  • 备份服务:实现表清单构建、分卷 SQL 生成、ZIP 打包/解压、导入执行、删除与下载、审计日志。
  • 路由:统一暴露 backup 相关接口(index/restore/import/down/destroy)。
  • 视图:展示表清单、备份文件列表、操作按钮与提示信息。
  • 配置:数据库主机、库名、用户、密码、表前缀、字符集与应用密钥等。
  • 存储:备份文件写入 storage/backup;可选将 images 目录一并打包进 ZIP。

章节来源

  • BackupController.php:58-162
  • BackupService.php:75-637
  • backup.php:29-33
  • backup.htm:28-78
  • config.php:15-52

架构总览

备份与恢复的关键交互如下:

sequenceDiagram
participant U as "管理员"
participant V as "视图 backup.htm"
participant R as "路由 backup.php"
participant C as "控制器 BackupController"
participant S as "服务 BackupService"
participant D as "数据库"
participant F as "文件系统(storage/backup, images)"
U->>V : 打开备份/恢复页面
V->>R : GET /backup/index
R->>C : index()
C->>S : buildTableList(prefix)
S->>D : SHOW TABLE STATUS LIKE 'prefix%'
D-->>S : 表清单
S-->>C : 表清单+总大小
C-->>V : 渲染表选择页
U->>R : POST /backup/backup (tables, vol_size, asset)
R->>C : backup()
C->>S : runBackup(prefix, req)
S->>D : 逐表 LIMIT 读取并生成SQL
S->>F : 写入分卷 .sql 或打包 .zip
S-->>C : 返回续传URL/完成消息
C-->>U : 提示并自动跳转
U->>R : POST /backup/import (sql_filename, volid)
R->>C : import()
C->>S : runImport(req)
alt zip
S->>F : 解压(白名单images/**, storage/backup/*.sql)
end
S->>D : 顺序执行SQL分卷
S-->>C : 完成/继续下一卷
C-->>U : 恢复成功提示

图表来源

  • BackupController.php:81-132
  • BackupService.php:132-386
  • backup.php:29-33
  • backup.htm:28-78

详细组件分析

备份控制器(BackupController)

  • 职责:渲染备份/恢复页面;处理备份、导入、删除、下载请求;通过 message 响应进行二次确认与超时跳转。
  • 关键点:
    • 备份首页列出表清单与总量,便于选择备份范围。
    • 备份接口支持分卷与是否包含资源目录(ZIP)。
    • 导入接口支持 ZIP 解压后按分卷顺序执行。
    • 删除接口带二次确认,避免误删。
    • 下载接口流式输出备份文件。

章节来源

  • BackupController.php:58-162

备份服务(BackupService)

  • 职责:组织表清单、执行分卷备份/导入、删除与下载、审计日志。
  • 关键能力:
    • 表清单构建:查询表状态并计算占用空间,过滤 MyISAM 引擎提示。
    • 分卷导出:按 vol_size 控制每卷大小,使用 LIMIT 分页读取,支持续传(lastDumpStartrow)。
    • 安全限制:仅允许解压 storage/backup/*.sql 与 images/**,禁止危险扩展名。
    • 导入执行:ZIP 解压后定位首个 SQL 分卷,按 volid 顺序执行;单卷直接执行。
    • 删除与下载:严格文件名校验,防止路径穿越;流式下载大文件。
    • 审计日志:记录备份、恢复、删除操作。
flowchart TD
Start(["开始"]) --> CheckFile["校验备份文件名合法性"]
CheckFile --> |非法| Err["抛出异常并返回错误"]
CheckFile --> |合法| Mode{"模式"}
Mode --> |备份| Dump["分卷导出SQL/打包ZIP"]
Mode --> |导入| Import["ZIP解压(可选) -> 顺序执行SQL分卷"]
Mode --> |删除| Del["删除主文件及同前缀分卷"]
Mode --> |下载| Down["流式输出备份文件"]
Dump --> Audit["记录审计日志"]
Import --> Audit
Del --> Audit
Down --> End(["结束"])
Audit --> End

图表来源

  • BackupService.php:132-637

章节来源

  • BackupService.php:75-637

路由与视图

  • 路由:以 group 形式注册 backup 组,统一命名空间 admin.*,支持 get/any/delete 多种方法。
  • 视图:展示表清单、备份文件列表、操作按钮与提示信息,支持分卷编号显示与 ZIP 标识。

章节来源

  • backup.php:29-33
  • backup.htm:28-78

配置与存储

  • 数据库配置:host、dbname、user、pass、prefix、charset 等。
  • 系统常量:前台固定模块、小程序内建模块、保留 URL 段等。
  • 存储:备份文件存放于 storage/backup;附件资源位于 images;上传与落盘通过 Disk 抽象与 ChunkedUploadHandler 管理。

章节来源

  • config.php:15-52
  • system.php:11-34
  • Disk.php:92-137
  • ChunkedUploadHandler.php:155-181

依赖关系分析

  • 控制器依赖服务:通过构造函数注入 BackupService。
  • 服务依赖:
    • 数据库:DB 门面用于查询表状态、执行 SQL。
    • 压缩:Zip 门面用于创建/解压备份包。
    • 配置:Config 获取站点版本等元信息。
    • 文件:FileHelper 辅助文件名与时间排序。
    • 审计:Audit 记录操作日志。
  • 路由与控制器解耦:通过声明式路由集中管理。
graph LR
Ctrl["BackupController"] --> Svc["BackupService"]
Svc --> DB["DB 门面"]
Svc --> Zip["Zip 门面"]
Svc --> Config["Config"]
Svc --> File["FileHelper"]
Svc --> Audit["Audit"]

图表来源

  • BackupController.php:17-41
  • BackupService.php:17-26

章节来源

  • BackupController.php:17-41
  • BackupService.php:17-26

性能与容量考量

  • 分卷大小:vol_size 控制每卷 SQL 大小,建议根据服务器内存与 PHP 限制调整,避免超时与内存溢出。
  • 超大表:对大表采用 LIMIT 分页读取,减少单次内存占用;必要时降低 vol_size 提高并发稳定性。
  • ZIP 打包:当启用资产打包时,会将 images 目录纳入压缩包,注意磁盘空间与 I/O 压力。
  • 流式下载:下载大文件时使用流式输出,避免一次性加载至内存。
  • 字符集与零日期:导出时对 DATETIME 类字段中的零日期值转换为 NULL,确保在新版 MySQL/MariaDB 严格模式下可导入。

故障场景与恢复流程

场景一:误删除数据(单表或多表)

  • 目标:恢复到最近一次完整或增量备份点。
  • 前置检查:
    • 确认当前数据库连接与权限正常。
    • 确认 storage/backup 存在可用备份文件(.sql 或 .zip)。
    • 评估影响范围与回滚窗口。
  • 恢复步骤:
    • 登录后台,进入备份/恢复页面。
    • 选择要恢复的备份文件(ZIP 会自动解压出 SQL 分卷)。
    • 点击导入,系统会按分卷顺序执行 SQL。
    • 若为多分卷,系统会提示继续下一卷直至完成。
  • 一致性验证:
    • 核对关键业务表行数与关键字段。
    • 抽查订单、商品、用户等核心数据。
  • 回滚策略:
    • 如恢复失败或数据不一致,重新选择更早的备份点进行恢复。

章节来源

  • BackupController.php:99-132
  • BackupService.php:309-386
  • backup.htm:68-78

场景二:数据库损坏(无法启动或严重错误)

  • 目标:重建数据库并恢复数据。
  • 前置检查:
    • 确认数据库服务可重启或已迁移到新实例。
    • 确认 config/config.php 中数据库连接信息正确。
    • 准备可用的备份文件(优先选择最近的完整备份)。
  • 恢复步骤:
    • 新建空数据库,保持字符集与表前缀一致。
    • 通过后台导入备份文件(ZIP 或 SQL 分卷)。
    • 若为 ZIP,系统会先解压出 SQL 与 images 资源。
  • 一致性验证:
    • 检查系统表结构与索引完整性。
    • 验证核心功能页面是否正常访问。
  • 回滚策略:
    • 若导入失败,检查错误日志并修正后再试;必要时选择更早备份。

章节来源

  • config.php:15-52
  • BackupService.php:309-386

场景三:服务器崩溃(应用进程不可用)

  • 目标:快速恢复应用服务。
  • 前置检查:
    • 确认操作系统、Web 服务器、PHP 环境可用。
    • 确认 storage/backup 与 images 目录存在且可读。
    • 确认数据库服务可用。
  • 恢复步骤:
    • 重启 Web 与 PHP-FPM 服务。
    • 访问后台健康检查或首页,确认服务就绪。
    • 如数据缺失,按“数据库损坏”流程恢复。
  • 可用性测试:
    • 访问前台首页、后台登录、关键业务页面。
    • 检查日志是否有异常。

场景四:磁盘故障(备份或附件丢失)

  • 目标:从异地或云端备份恢复站点数据与附件。
  • 前置检查:
    • 确认新磁盘挂载与分区格式化完成。
    • 确认 storage/backup 与 images 目录可写。
  • 恢复步骤:
    • 将备份文件(ZIP 或 SQL)复制到 storage/backup。
    • 通过后台导入备份,系统会解压并执行 SQL。
    • 如 ZIP 中包含 images,系统会按白名单解压附件。
  • 一致性验证:
    • 核对附件是否能正常访问。
    • 检查图片缩略图与缓存是否需要重建。

章节来源

  • BackupService.php:42-57
  • BackupService.php:309-386

场景五:网络中断(外部依赖不可达)

  • 目标:保障本地服务可用,待网络恢复后同步数据。
  • 前置检查:
    • 确认本地数据库与文件存储可用。
    • 确认第三方服务(支付、短信、云存储)配置与重试策略。
  • 恢复步骤:
    • 暂停对外部服务的写操作,避免脏数据。
    • 在网络恢复后,重放队列或触发补偿任务。
    • 检查日志与告警,确认无数据不一致。

自动化脚本与操作步骤

自动化思路

  • 定时备份:
    • 通过计划任务定期调用备份接口,生成 SQL 或 ZIP 备份。
    • 将备份文件同步至远端存储(对象存储或 NAS)。
  • 自动恢复:
    • 在灾备环境中部署相同版本的应用与数据库。
    • 通过 API 或 CLI 触发导入流程,按分卷顺序执行。
  • 健康检查:
    • 恢复完成后执行健康检查接口,确认服务可用。
    • 采集关键指标(CPU、内存、I/O、慢查询)作为基准。

手动操作步骤

  • 备份:
    • 登录后台,进入备份页面,选择表或全部表。
    • 设置分卷大小,选择是否包含资源目录。
    • 提交后等待完成,查看生成的备份文件。
  • 恢复:
    • 进入恢复页面,选择备份文件(ZIP 或 SQL)。
    • 点击导入,按提示完成各分卷执行。
    • 完成后检查核心功能与数据一致性。

章节来源

  • backup.htm:28-78
  • BackupController.php:81-132
  • BackupService.php:132-386

恢复后验证与监控

数据一致性验证

  • 表级校验:
    • 核对核心表行数与关键字段分布。
    • 检查外键约束与索引是否完整。
  • 业务校验:
    • 抽查订单、商品、用户、售后等关键业务流程。
    • 验证金额、状态、时间字段是否符合预期。
  • 附件校验:
    • 随机抽取图片与文件,确认可访问与可预览。

章节来源

  • BackupService.php:309-386

服务可用性测试

  • 前端页面:首页、分类、详情、搜索、登录、注册。
  • 后台功能:备份/恢复、用户管理、商品管理、订单管理。
  • 接口健康:访问健康检查接口或自定义探针。

性能基准测试

  • 压测工具:使用压测工具模拟并发访问,观察响应时间与错误率。
  • 指标采集:CPU、内存、I/O、数据库连接数、慢查询。
  • 基线对比:与历史基线对比,识别性能回归。

排错指南

  • 备份失败:
    • 检查 storage/backup 目录是否可写。
    • 检查 PHP 内存与执行时间限制。
    • 查看错误日志与审计日志。
  • 导入失败:
    • 检查 SQL 语法与字符集。
    • 确认数据库权限与表结构。
    • 查看导入过程中的错误提示与日志。
  • 附件缺失:
    • 确认 ZIP 解压白名单与禁止扩展名。
    • 检查 images 目录权限与路径。
  • 升级脚本问题:
    • 参考升级脚本的连接与复制逻辑,确认环境与路径。

章节来源

  • BackupService.php:132-637
  • upgrade_v1.9.php:104-140

结论

DouPHP 提供了完善的备份与恢复能力,支持分卷 SQL 导出、ZIP 打包、安全解压与顺序导入,适用于多种灾难场景。通过合理的预案设计、自动化脚本与严格的验证流程,可在最短时间内完成数据恢复与服务重建。建议在生产环境建立定期备份与演练机制,确保在真实灾难发生时能够快速、可靠地恢复。

添加日期:2026-10-05