Linux下备份与恢复ThinkPHP项目的实用方案
一 备份策略与准备
- 备份范围建议包含:项目代码目录、数据库转储文件、环境配置与密钥、运行时缓存目录(可选)。
- 准备与检查:
- 确认数据库类型与连接信息(如 MySQL/MariaDB 的 host/port/user/password/database)。
- 确保备份目录存在且可写,例如:/opt/backups/your_project/YYYY-MM-DD/。
- 建议将备份文件与代码分离存放,避免被代码部署流程覆盖。
- 若使用队列、会话等外部存储(如 Redis),也需单独备份其数据或持久化配置。
二 快速命令行备份与恢复
- 项目文件打包
- 进入项目父目录后打包(排除大而无用目录,如 runtime、vendor 可选):
- 示例:tar -czvf your_project_2025-11-16.tar.gz -C /var/www/your_project . --exclude=runtime --exclude=vendor
- 数据库备份
- 使用 mysqldump 导出结构与数据:
- 示例:mysqldump -h 127.0.0.1 -P 3306 -u dbuser -p dbname > db_2025-11-16.sql
- 数据库恢复
- 建议先创建空库(如有必要),再导入:
- 示例:mysql -h 127.0.0.1 -P 3306 -u dbuser -p dbname < db_2025-11-16.sql
- 说明
- 上述方式适用于绝大多数 ThinkPHP 版本与部署形态,简单可靠、便于迁移与归档。
三 在ThinkPHP中编写备份与恢复命令
- 生成自定义命令(示例为 ThinkPHP 5/6 控制台命令)
- 创建命令类 app/command/Backup.php:
- 作用:读取数据库配置,调用 mysqldump 导出到指定目录,并记录日志。
- 创建命令类 app/command/Restore.php:
- 作用:校验备份文件存在,调用 mysql 导入恢复。
- 注册命令
- 在 app/console.php 的 commands 数组中加入:‘app\command\Backup’、‘app\command\Restore’。
- 使用示例
- 备份:php think backup
- 恢复:php think restore /path/to/backup_2025-11-16.sql
- 安全与可运维性建议
- 不在代码中硬编码密码,优先读取 .env 或环境变量;命令执行失败应抛出明确错误并写入日志;导入前可做基本校验(文件存在、可读、大小合理)。
四 自动化与保留策略
- 使用 cron 定时执行备份脚本
- 示例脚本 backup.sh(路径与参数请按实际调整):
- #!/bin/bash
- BACKUP_DIR=“/opt/backups/your_project/$(date +%F)”
- mkdir -p “$BACKUP_DIR”
- tar -czvf “$BACKUP_DIR/code_$(date +%F_%H-%M-%S).tar.gz” -C /var/www/your_project . --exclude=runtime --exclude=vendor
- mysqldump -h 127.0.0.1 -P 3306 -u dbuser -p’DBPASS’ dbname > “$BACKUP_DIR/db_$(date +%F_%H-%M-%S).sql”
- 赋权并加入计划任务(每天 02:00 执行):
- chmod +x /opt/scripts/backup.sh
- 0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
- 保留策略
- 建议保留近 7 天日备、近 4 周周备、近 3 月月备;可用 find 按时间删除过期备份,例如:
- 删除 30 天前的备份:find /opt/backups/your_project -type f -mtime +30 -delete
- 安全与合规
- 备份文件含敏感数据,建议加密存储或放入受限访问目录;必要时同步至异地或对象存储;定期做恢复演练验证可用性。
五 常见问题与应急
- 恢复后白屏或路由异常
- 核对 .env 配置(数据库、应用域名、调试模式)、清除缓存(如 runtime 目录)、检查目录权限与所有者。
- 导入报错(表已存在/字符集不一致)
- 恢复前确认目标库为空;必要时使用 --force 忽略错误(谨慎),或先 mysqldump 增加 --set-gtid-purged=OFF、–triggers --routines --events 等参数以尽量保持一致性。
- 误删文件的紧急处理
- 若文件仍被进程占用,可用 lsof | grep deleted 查找句柄并从 /proc//fd/ 复制恢复;若为 EXT3/EXT4 且未被覆盖,可尝试 extundelete;通用场景可用 testdisk/photorec。SSD 启用 TRIM 或数据被覆盖时恢复概率显著降低,优先依赖已有备份。