You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:40:29