执行 artisan backup:run 时找不到 Laradock mysqldump(Spatie Laravel 备份)
Laradock mysqldump not found when executing artisan backup:run (Spatie Laravel Backup)
我已经使用 Laradock 部署了一个 Laravel 应用程序。
我想指出数据库连接工作正常(用户可以注册、登录等)。
为了备份应用程序,我安装了Spatie's Laravel Backup package。
我相应地设置了所有配置变量如下:
config/backup.php
<?php
return [
'backup' => [
/*
* The name of this application. You can use this name to monitor
* the backups.
*/
'name' => env('APP_NAME', 'laravel-backup'),
'source' => [
/*......*/
/*
* The names of the connections to the databases that should be backed up
* MySQL, PostgreSQL, SQLite and Mongo databases are supported.
*
* The content of the database dump may be customized for each connection
* by adding a 'dump' key to the connection settings in config/database.php.
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'excludeTables' => [
* 'table_to_exclude_from_backup',
* 'another_table_to_exclude'
* ]
* ],
* ],
*
* If you are using only InnoDB tables on a MySQL server, you can
* also supply the useSingleTransaction option to avoid table locking.
*
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'useSingleTransaction' => true,
* ],
* ],
*
* For a complete list of available customization options, see https://github.com/spatie/db-dumper
*/
'databases' => [
'mysql',
],
],
/*
* The database dump can be compressed to decrease diskspace usage.
*
* Out of the box Laravel-backup supplies
* Spatie\DbDumper\Compressors\GzipCompressor::class.
*
* You can also create custom compressor. More info on that here:
* https://github.com/spatie/db-dumper#using-compression
*
* If you do not want any compressor at all, set it to null.
*/
'database_dump_compressor' => null,
/*....*/
],
],
];
在 Laravel Homestead 中备份工作正常。
$ php artisan backup:run
.
根据to this package's docs,我们需要指定mysqldump
二进制文件的路径如下:
config/database.php
//config/database.php
'connections' => [
'mysql' => [
'driver' => 'mysql'
...,
'dump' => [
'dump_binary_path' => '/path/to/the/binary', // only the path, so without `mysqldump` or `pg_dump`
'use_single_transaction',
'timeout' => 60 * 5, // 5 minute timeout
'exclude_tables' => ['table1', 'table2'],
'add_extra_option' => '--optionname=optionvalue',
]
],
这是我在同一个文件中默认得到的:
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
'dump'=>[
'dump_binary_path' => env('DB_DUMP_PATH'), // only the path, so without `mysqldump` or `pg_dump`
'use_single_transaction',
'timeout' => 60 * 5, // 5 minute timeout
//'exclude_tables' => ['table1', 'table2'],
//'add_extra_option' => '--optionname=optionvalue',
'add_extra_option' => '--host='.env('DB_HOST'),
]
],
在我的 .env 文件中:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DUMP_PATH='/usr/bin/'
如果我在 MySQL 容器内执行 mysqldump
,它确实有效:
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
但是,如果我运行工作区容器内的备份命令,
artisan backup:run
我收到错误:
Backup failed because: The dump process failed with exitcode 127 :
Command not found : sh: 1: mysqldump: not found
那我怎么告诉 Laradock mysqldump 二进制路径在哪里?
有解决办法吗?也许设置一个连接 Workspace
和 MySQL
容器的新容器?
任何替代方法?
在 Adrien 的帮助下解决问题
在 .env
文件中,我确实发现以下变量设置为 false:
### WORKSPACE #############################################
####
# ...
WORKSPACE_INSTALL_MYSQL_CLIENT=false
# ...
所以我将其更改为 true:
### WORKSPACE #############################################
####
# ...
WORKSPACE_INSTALL_MYSQL_CLIENT=true
# ...
我保存退出了
这也意味着我不必再对 docker-compose.custom.yml
文件进行任何更改
为了应用该更改,我执行了(无需停止任何容器)
$ docker-compose build workspace
$ docker-compose -f docker-compose.custom.yml up -d workspace
然后我进入了容器
$ docker exec -it my_workspace bash
进入内部后,我查找了 mysqldump:
# which mysqldump
/usr/bin/mysqldump
我终于可以执行 Spatie 的 Laravel 备份包了:
# artisan backup:run
Starting backup...
Dumping database xyz...
Determining files to backup...
Zipping x files and directories...
Created zip containing x files and directories. Size is x.x MB
Copying zip to disk named backMeUp...
Successfully copied zip to disk named backMeUp.
Backup completed!
成功了!
如前所述 here,编辑 laradock .env
文件并设置:
WORKSPACE_INSTALL_MYSQL_CLIENT=true
然后运行:
docker-compose build workspace && docker-composer up -d workspace
这将 更新 你的 workspace
容器并重新启动它。
连接到您的容器:
docker-compose exec workspace bash
您应该可以访问 mysqldump
:
root@82d8b3b3c0a0:/var/www# which mysqldump
/usr/bin/mysqldump
删除 dump 和其中的所有内容 或在 config/database.php 中添加注释,然后它在没有 dump 的情况下工作正常
如下所示:
//'dump' => [
// 'dump_binary_path' => '/path/to/the/binary', // only the path, so //without `mysqldump` or `pg_dump`
// 'use_single_transaction',
// 'timeout' => 60 * 5, // 5 minute timeout
// 'exclude_tables' => ['table1', 'table2'],
// 'add_extra_option' => '--optionname=optionvalue',
// ]
但是如果您在 windows 上使用 xamp 服务器,您需要像下面这样更改它:
'dump' => [
'dump_binary_path' => 'C:/xampp/mysql/bin/', // only the path, so without `mysqldump` or `pg_dump`
'use_single_transaction',
'timeout' => 60 * 5, // 5 minute timeout
],
我已经使用 Laradock 部署了一个 Laravel 应用程序。
我想指出数据库连接工作正常(用户可以注册、登录等)。
为了备份应用程序,我安装了Spatie's Laravel Backup package。
我相应地设置了所有配置变量如下:
config/backup.php
<?php
return [
'backup' => [
/*
* The name of this application. You can use this name to monitor
* the backups.
*/
'name' => env('APP_NAME', 'laravel-backup'),
'source' => [
/*......*/
/*
* The names of the connections to the databases that should be backed up
* MySQL, PostgreSQL, SQLite and Mongo databases are supported.
*
* The content of the database dump may be customized for each connection
* by adding a 'dump' key to the connection settings in config/database.php.
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'excludeTables' => [
* 'table_to_exclude_from_backup',
* 'another_table_to_exclude'
* ]
* ],
* ],
*
* If you are using only InnoDB tables on a MySQL server, you can
* also supply the useSingleTransaction option to avoid table locking.
*
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'useSingleTransaction' => true,
* ],
* ],
*
* For a complete list of available customization options, see https://github.com/spatie/db-dumper
*/
'databases' => [
'mysql',
],
],
/*
* The database dump can be compressed to decrease diskspace usage.
*
* Out of the box Laravel-backup supplies
* Spatie\DbDumper\Compressors\GzipCompressor::class.
*
* You can also create custom compressor. More info on that here:
* https://github.com/spatie/db-dumper#using-compression
*
* If you do not want any compressor at all, set it to null.
*/
'database_dump_compressor' => null,
/*....*/
],
],
];
在 Laravel Homestead 中备份工作正常。
$ php artisan backup:run
.
根据to this package's docs,我们需要指定mysqldump
二进制文件的路径如下:
config/database.php
//config/database.php
'connections' => [
'mysql' => [
'driver' => 'mysql'
...,
'dump' => [
'dump_binary_path' => '/path/to/the/binary', // only the path, so without `mysqldump` or `pg_dump`
'use_single_transaction',
'timeout' => 60 * 5, // 5 minute timeout
'exclude_tables' => ['table1', 'table2'],
'add_extra_option' => '--optionname=optionvalue',
]
],
这是我在同一个文件中默认得到的:
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
'dump'=>[
'dump_binary_path' => env('DB_DUMP_PATH'), // only the path, so without `mysqldump` or `pg_dump`
'use_single_transaction',
'timeout' => 60 * 5, // 5 minute timeout
//'exclude_tables' => ['table1', 'table2'],
//'add_extra_option' => '--optionname=optionvalue',
'add_extra_option' => '--host='.env('DB_HOST'),
]
],
在我的 .env 文件中:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DUMP_PATH='/usr/bin/'
如果我在 MySQL 容器内执行 mysqldump
,它确实有效:
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
但是,如果我运行工作区容器内的备份命令,
artisan backup:run
我收到错误:
Backup failed because: The dump process failed with exitcode 127 : Command not found : sh: 1: mysqldump: not found
那我怎么告诉 Laradock mysqldump 二进制路径在哪里?
有解决办法吗?也许设置一个连接 Workspace
和 MySQL
容器的新容器?
任何替代方法?
在 Adrien 的帮助下解决问题
在 .env
文件中,我确实发现以下变量设置为 false:
### WORKSPACE #############################################
####
# ...
WORKSPACE_INSTALL_MYSQL_CLIENT=false
# ...
所以我将其更改为 true:
### WORKSPACE #############################################
####
# ...
WORKSPACE_INSTALL_MYSQL_CLIENT=true
# ...
我保存退出了
这也意味着我不必再对 docker-compose.custom.yml
文件进行任何更改
为了应用该更改,我执行了(无需停止任何容器)
$ docker-compose build workspace
$ docker-compose -f docker-compose.custom.yml up -d workspace
然后我进入了容器
$ docker exec -it my_workspace bash
进入内部后,我查找了 mysqldump:
# which mysqldump
/usr/bin/mysqldump
我终于可以执行 Spatie 的 Laravel 备份包了:
# artisan backup:run
Starting backup...
Dumping database xyz...
Determining files to backup...
Zipping x files and directories...
Created zip containing x files and directories. Size is x.x MB
Copying zip to disk named backMeUp...
Successfully copied zip to disk named backMeUp.
Backup completed!
成功了!
如前所述 here,编辑 laradock .env
文件并设置:
WORKSPACE_INSTALL_MYSQL_CLIENT=true
然后运行:
docker-compose build workspace && docker-composer up -d workspace
这将 更新 你的 workspace
容器并重新启动它。
连接到您的容器:
docker-compose exec workspace bash
您应该可以访问 mysqldump
:
root@82d8b3b3c0a0:/var/www# which mysqldump
/usr/bin/mysqldump
删除 dump 和其中的所有内容 或在 config/database.php 中添加注释,然后它在没有 dump 的情况下工作正常 如下所示:
//'dump' => [
// 'dump_binary_path' => '/path/to/the/binary', // only the path, so //without `mysqldump` or `pg_dump`
// 'use_single_transaction',
// 'timeout' => 60 * 5, // 5 minute timeout
// 'exclude_tables' => ['table1', 'table2'],
// 'add_extra_option' => '--optionname=optionvalue',
// ]
但是如果您在 windows 上使用 xamp 服务器,您需要像下面这样更改它:
'dump' => [
'dump_binary_path' => 'C:/xampp/mysql/bin/', // only the path, so without `mysqldump` or `pg_dump`
'use_single_transaction',
'timeout' => 60 * 5, // 5 minute timeout
],