真正能快速恢复的备份必须是项目文件+数据库+配置三者同步:项目用tar排除runtime/log/cache打包,数据库用mysqldump加--single-transaction等参数导出并存非Web目录,配置文件单独tar备份且校验一致性,每次备份后须抽样解压、建库、导入验证可恢复性。

ThinkPHP 项目备份要兼顾完整性、安全性、可验证性,不能只存代码或只导数据库。真正能快速恢复的备份,必须是项目文件 + 数据库 + 配置三者同步、路径明确、权限可控的一套组合动作。
项目源码和静态资源要打包压缩
用 tar 命令一次性归档,排除临时目录避免干扰:
- 跳过
runtime/、log/、cache/等运行时生成目录,它们不需备份且可能含敏感临时数据 - 命令示例:
tar -czvf tp_project_$(date +\%Y%m%d).tar.gz /var/www/myapp --exclude=/var/www/myapp/runtime --exclude=/var/www/myapp/log - 备份目标路径建议设为 Web 不可访问目录(如
/backup/),避免被扫描下载
数据库必须用 mysqldump 原生导出
ThinkPHP 自身不提供结构+数据完整导出能力,靠模型遍历拼 SQL 会丢索引、外键、视图、存储过程等关键信息:
- 推荐命令带一致性参数:
mysqldump --single-transaction --routines --triggers --events -u user --defaults-file=/etc/mysql/my.cnf dbname > /backup/db_$(date +\%Y%m%d_%H%M%S).sql -
--defaults-file是安全传密方式,禁止在命令行写-p123456(会被系统进程列表看到) - 文件名含时间戳,防止覆盖;SQL 文件严禁放在
public/或任何 Web 可访问路径下
配置文件单独提取并校验
环境配置决定项目能否启动,.env、database.php、nginx.conf 等必须纳入备份范围:
立即学习“PHP免费学习笔记(深入)”;
- 把
.env和config/目录单独 tar 打包,例如:tar -czvf config_$(date +\%Y%m%d).tar.gz .env config/ - 检查
.env中数据库账号密码是否与 mysqldump 使用的配置一致,避免恢复后连不上库 - 若使用 Nginx/Apache,把站点配置文件也一并备份,恢复时可快速还原访问入口
恢复流程要闭环可执行
备份没价值,除非你验证过它真能恢复。每次备份后建议抽样测试:
- 解压项目包到测试目录,检查目录结构、权限(如
www-data可读写runtime/) - 新建空库,执行
mysql -u user --defaults-file=/etc/mysql/my.cnf newdb 导入 - 替换配置文件,启动服务,访问首页或执行一条简单查询确认连通性
- 自动化脚本中加入
if [ $? -ne 0 ]; then echo "导入失败"; exit 1; fi类判断,不靠肉眼识别成功



















