Linux下ThinkPHP如何备份
导读:Linux下ThinkPHP备份实操指南 一 备份策略与准备 备份对象通常包含两部分:一是数据库(如 MySQL/MariaDB),二是项目代码与配置(含上传目录、配置文件等)。 建议准备一个专用备份目录(如 /opt/backups/y...
Linux下ThinkPHP备份实操指南
一 备份策略与准备
- 备份对象通常包含两部分:一是数据库(如 MySQL/MariaDB),二是项目代码与配置(含上传目录、配置文件等)。
- 建议准备一个专用备份目录(如 /opt/backups/your_project/),并确保运行备份的用户对该目录有读写权限,同时具备访问数据库的账号与权限。
- 为降低风险,备份文件应定期异地/离线保存,并做好保留周期与容量规划。
二 数据库备份
-
方式一 命令行 mysqldump(最通用)
- 基本用法:
- 交互式输入密码:
mysqldump -h 127.0.0.1 -u 用户名 -p 数据库名 > /opt/backups/your_project/db_$(date +%F_%H-%M-%S).sql - 命令行直接带密码(注意安全):
mysqldump -h 127.0.0.1 -u 用户名 -p'密码' 数据库名 > /opt/backups/your_project/db_$(date +%F_%H-%M-%S).sql - 常用增强参数(按需添加):
--single-transaction --routines --triggers --hex-blob --set-gtid-purged=OFF
- 交互式输入密码:
- 恢复命令:
mysql -h 127.0.0.1 -u 用户名 -p 数据库名 < /opt/backups/your_project/db_2025-12-04_10-00-00.sql - 说明:上述方法适用于所有基于 MySQL 的 ThinkPHP 应用,简单、可靠、便于自动化。
- 基本用法:
-
方式二 在ThinkPHP中编程生成SQL备份(便于集成到后台)
- 思路:使用 Db 类获取所有表名,遍历执行 SHOW CREATE TABLE 获取建表语句,再对每张表 SELECT * FROM 生成 INSERT 语句,写入 .sql 文件。
- 示例(简化版):
use think\Db; $tables = Db::query('SHOW TABLES'); $backup = "SET FOREIGN_KEY_CHECKS=0; \n\n"; foreach ($tables as $row) { $table = current($row); $ddl = Db::query("SHOW CREATE TABLE `$table`")[0]['Create Table']; $backup .= "$ddl; \n\n"; $data = Db::table($table)-> select(); foreach ($data as $row) { $cols = array_map(fn($c) => "`$c`", array_keys($row)); $vals = array_map(fn($v) => is_null($v) ? 'NULL' : "'".addslashes($v)."'", $row); $backup .= "INSERT INTO `$table` (".implode(',', $cols).") VALUES (".implode(',', $vals)."); \n"; } } $backup .= "SET FOREIGN_KEY_CHECKS=1; \n"; file_put_contents('/opt/backups/your_project/db_'.date('YmdHis').'.sql', $backup); - 提示:大数据量时建议改用 mysqldump 或分批导出,避免内存溢出与超时。
三 项目代码与上传目录备份
- 打包整个项目目录(不含敏感或临时文件更稳妥):
tar --exclude='runtime' --exclude='.git' --exclude='*.log' \ -czvf /opt/backups/your_project/code_$(date +%F_%H-%M-%S).tar.gz \ -C /var/www your_project - 仅备份配置与上传目录(常见做法):
tar -czvf /opt/backups/your_project/config_upload_$(date +%F).tar.gz \ /var/www/your_project/config /var/www/your_project/public/uploads - 说明:tar 是 Linux 下常用的归档与压缩工具,适合做目录级备份与迁移。
四 自动化与保留策略
- 使用 crontab 定时执行(示例:每天 02:00 备份数据库与代码)
0 2 * * * /usr/bin/mysqldump -h127.0.0.1 -u用户名 -p'密码' 数据库名 > /opt/backups/your_project/db_$(date +\%F).sql 30 2 * * * tar --exclude='runtime' --exclude='.git' -czvf /opt/backups/your_project/code_$(date +\%F).tar.gz -C /var/www your_project- 注意:crontab 中 % 需转义为 %,否则会被当作换行。
- 保留策略示例(保留最近 7 天):
# 每天清理7天前的数据库与代码备份 0 3 * * * find /opt/backups/your_project -name "db_*.sql" -mtime +7 -delete 0 3 * * * find /opt/backups/your_project -name "code_*.tar.gz" -mtime +7 -delete - 建议将备份文件再同步到远程存储(如对象存储/内网备份机),提升可靠性。
五 恢复与校验
- 数据库恢复:
mysql -h 127.0.0.1 -u 用户名 -p 数据库名 < /opt/backups/your_project/db_2025-12-04_10-00-00.sql- 如遇到字符集问题,可在导入时指定:
mysql -h 127.0.0.1 -u 用户名 -p --default-character-set=utf8mb4 数据库名 < backup.sql
- 如遇到字符集问题,可在导入时指定:
- 代码恢复:
tar -xzvf /opt/backups/your_project/code_2025-12-04.tar.gz -C /var/www - 校验建议:
- 检查备份文件大小与修改时间是否合理。
- 在测试环境抽样恢复验证表结构与数据一致性。
- 定期做恢复演练,确保流程可用。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux下ThinkPHP如何备份
本文地址: https://pptw.com/jishu/764107.html
