我想使用路由备份 Laravel 11 中的 mysql 数据库。我尝试了一些方法,但都有问题:
使用 Spatie/db-dumper:
protected $signature = 'backup:database';
public function handle()
{
$filename = config('app.DB_DATABASE') . '.sql';
$path = storage_path("app/database/backup/");
$fnStorage = $path . $filename;
File::put($fnStorage, '');
MySql::create()
->setDbName(config('app.DB_DATABASE'))
->setUserName(config('app.DB_USERNAME'))
->setPassword(config('app.DB_PASSWORD'))
->setHost(config('app.DB_HOST'))
->setPort(config('app.DB_PORT'))
->dumpToFile($fnStorage);
}
在终端中调用它可以正常工作:
php artisan backup:database
。但是使用路线(在控制器中:Artisan::call('backup:database');
它会抛出以下错误:
“mysqldump”不被识别为内部或外部命令、可操作程序或批处理文件。
注意:我将以下代码添加到 config/database.php 但错误仍然存在!
'mysql' => [
'driver' => 'mysql',
'dump' => [
'dump_binary_path' => 'D:/xampp/mysql/bin/',
'dump_command_path' => 'D:/xampp/mysql/bin/',
'use_single_transaction',
'timeout' => 60 * 5, // 5 minute timeout
],
...
],
在终端中调用它就可以正常工作:
php artisan backup:run --only-db
。但是使用路线(在控制器中:Artisan::call('backup:run', ['--only-db'=> true]);
它会抛出以下错误:
mysqldump:出现错误:2004:尝试连接时无法创建 TCP/IP 套接字 (10106)。
3.直接使用
mysqldump
命令:
$command1 = 'mysqldump --user=' . $dbUser . ' --password=' . $dbPassword . ' --host=' . $dbHost . ' ' . $dbName . ' > "' . $fnStorage . '"';
该命令在终端中运行良好。使用路线(
exec($command1, $output, $returnVar);
当我在 VSCode 中处于设计模式时它也可以正常工作。但是在生产中(使用 xampp),它会抛出以下错误:
“mysqldump”不被识别为内部或外部命令、可操作程序或批处理文件。
当我将此命令传递给 powershell 命令时:
$command1 = 'mysqldump --user=' . $dbUser . ' --password=' . $dbPassword . ' --host=' . $dbHost . ' ' . $dbName . ' > \'' . $fnStorage . '\'';
$command1 = 'powershell -Command "' . $command1 . '"';
将其称为
exec($command1, $output, $returnVar);
,什么也不会发生!
那么,我该怎么做才能应对这份工作呢?
谢谢大家。我找到了答案并分享给其他人。
在第三种方式中,我输入了mysqldump的绝对路径:
$command1 = 'D:/xampp/mysql/bin/mysqldump --user=' . $dbUser . ' --password=' . $dbPassword . ' --host=' . $dbHost . ' ' . $dbName . ' > "' . $fnStorage . '"';
exec($command1, $output, $returnVar);
现在,它适用于设计(VSCode)和生产环境:)