Laravel中Spatie Backup前端触发报错:无法创建TCP/IP套接字(10106)
解决Laravel spatie/backup前端触发备份时的套接字连接错误
问题
我在Laravel项目中安装了spatie/backup包并配置MySQL备份,直接执行php artisan backup:run可正常运行。为实现用户点击按钮触发备份,编写了如下路由:
Route::get('backup-run', function() { Artisan::call('backup:run'); return response()->json(['success' => 'Backup for database created']); });
以及Vue.js按钮方法:
createDBBackup() { axios.get('/backup-run') .then(response => { // ...后续逻辑 }); }
同时在config/database.php中配置了:
'dump' => [ 'dump_binary_path' => 'C:\xampp\mysql\bin', // 仅路径,不要包含`mysqldump`或`pg_dump` 'use_single_transaction', 'timeout' => 60 * 5, // 5分钟超时 ],
但前端触发时,在Clockwork中收到报错:
Spatie\Backup\Events\BackupHasFailed exception: Spatie\DbDumper\Exceptions\DumpFailedbackupDestination: null exception: Spatie\DbDumper\Exceptions\DumpFailed *message: "The dump process failed with exitcode 2 : Misuse of shell builtins : mysqldump: Got error: 2004: "Can't create TCP/IP socket (10106)" when trying to connect " ~string: "" *code: 0 *file: "C:\...\vendor\spatie\db-dumper\src\Exceptions\DumpFailed.php" *line: 17 ~trace: Array(79) ~previous: null backupDestination: null
解决方法
1. 检查Web服务器用户权限
直接执行php artisan用的是本地用户权限,前端触发时用的是Web服务器用户(如Apache的www-data、IIS的IUSR),该用户可能缺少以下权限:
- MySQL本地连接权限:给Web服务器用户添加允许从
localhost访问MySQL的权限 - 备份目录读写权限:确保Web服务器用户能读写备份存储目录
2. 指定MySQL套接字/命名管道路径
Windows下XAMPP的MySQL可能用命名管道而非套接字,在database.php的dump配置中添加对应路径:
'dump' => [ 'dump_binary_path' => 'C:\xampp\mysql\bin', 'use_single_transaction', 'timeout' => 60 * 5, 'socket' => '\\\\.\\pipe\\MySQL', // Windows命名管道路径 ],
如果是套接字文件,路径为C:\xampp\mysql\data\mysql.sock,可根据实际情况替换。
3. 确保mysqldump路径正确且环境变量配置到位
Web服务器的环境变量可能未包含MySQL路径,直接指定完整的mysqldump执行路径:
'dump_binary_path' => 'C:\xampp\mysql\bin\mysqldump.exe',
或者给Web服务器配置环境变量,将C:\xampp\mysql\bin加入系统PATH。
4. 改用POST请求并设置超时
GET请求存在超时或长度限制,修改路由为POST并设置执行超时:
Route::post('backup-run', function() { set_time_limit(300); // 设置5分钟超时 Artisan::call('backup:run'); return response()->json(['success' => 'Backup for database created']); });
对应Vue方法改为POST请求:
createDBBackup() { axios.post('/backup-run') .then(response => { // ...后续逻辑 }).catch(error => { console.error('备份失败:', error); }); }
5. 强制使用TCP/IP连接
在dump配置中添加参数强制mysqldump使用TCP连接,绕过套接字问题:
'dump' => [ 'dump_binary_path' => 'C:\xampp\mysql\bin', 'use_single_transaction', 'timeout' => 60 * 5, 'extra_options' => [ '--protocol=tcp', '--host=127.0.0.1', '--port=3306', ], ],
内容的提问来源于stack exchange,提问作者Maison012
相关产品推荐
相关产品推荐

