ThinkPHP 5.5 不执行 SQL 文件备份数据,真正备份需调用 mysqldump 导出为 .sql 文件;TP 可封装 exec 调用该命令,但不可用 Db::query 或手动拼接 SQL,否则丢失索引、外键等元信息。

ThinkPHP 5.5 本身不提供直接执行 SQL 文件进行备份的能力,它也没有内置“导入 SQL 文件 → 备份数据库”的逻辑。你提到的“执行 SQL 文件如何备份数据”,这里存在概念混淆:
✅ 执行 SQL 文件(如 mysql < backup.sql)是还原操作(恢复数据);
❌ 它不是备份操作——备份是把当前数据库状态导出为 SQL 文件的过程。
所以准确来说:ThinkPHP 5.5 不执行 SQL 文件来备份数据;它可协助触发备份(调用 mysqldump),但真正备份动作由 MySQL 原生命令完成。
下面分三块讲清楚怎么做才可靠:
备份的本质是导出,不是执行
- 备份 = 把数据库结构 + 数据 → 写成一个
.sql文本文件; - 这个过程必须用
mysqldump(MySQL 官方工具),不能靠 ThinkPHP 的Db::query()或模型遍历拼接; - 原因:手动拼 SQL 会丢失索引、外键、字符集、存储过程、事件、视图定义、注释等关键元信息。
推荐命令(带一致性保障):
mysqldump \ --single-transaction \ --routines \ --triggers \ --events \ -u your_user \ --defaults-file=/path/to/my.cnf \ your_database_name > /backup/db_shop_$(date +\%Y%m%d_%H%M%S).sql
⚠️ 注意:
--defaults-file是安全传密方式,禁止在命令行写-p123456(会被ps aux看到)。立即学习“PHP免费学习笔记(深入)”;
ThinkPHP 5.5 中可做的辅助动作
虽然不能替代 mysqldump,但 TP5.5 可以封装调用逻辑,例如:
- 写一个命令行指令(
php think db:backup),内部exec()调用上述 mysqldump 命令; - 在控制器中提供 Web 界面触发备份(需严格鉴权+限速+异步防超时);
- 自动检查
mysqldump是否可用、权限是否足够、目标目录是否可写。
示例简化逻辑(非生产就绪,仅示意):
$cmd = "mysqldump --single-transaction -u {$user} --defaults-file={$cnfPath} {$dbName} > {$targetFile}";
exec($cmd, $output, $returnCode);
if ($returnCode !== 0) {
throw new Exception("备份失败,错误码:{$returnCode}");
}别踩这些坑
- ❌ 把备份文件放在
public/目录下,等于公开数据库; - ❌ 用
SELECT * FROM table循环拼 INSERT,大表会内存溢出、丢自增、无事务一致性; - ❌ 还原时只
INSERT IGNORE或跳过建表语句,旧表残留脏数据会导致后续业务异常; - ❌ 在 PHP 中硬编码数据库密码,或通过 URL 参数传密。
真正可靠的备份流程,一定是:
mysqldump 导出 → 存非 Web 可访问路径 → 加时间戳命名 → 校验文件大小/内容头 → 定期异地归档。
不复杂但容易忽略。



















