0

我已经使用 Laradock 部署了一个 Laravel 应用程序。

我想指出数据库连接工作正常(用户可以注册、登录等)。

为了备份应用程序,我安装了Spatie 的 Laravel 备份包

我相应地设置了所有配置变量,如下所示:

配置/备份.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.

根据这个包的文档,我们需要指定mysqldump二进制文件的路径,如下所示:

配置/数据库.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/'

如果我mysqldump在 MySQL 容器内部执行,它确实有效:

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

我得到错误:

备份失败,因为:转储过程失败,退出代码 127:找不到命令:sh:1:mysqldump:未找到

那我怎么告诉 Laradock mysqldump 二进制路径在哪里呢?

有解决方法吗?也许设置一个与容器连接的新Workspace容器MySQL

任何替代方法?

在 Adrien Right的帮助下解决.env文件,我确实发现以下变量设置为 false:

### WORKSPACE #############################################
####
# ...
WORKSPACE_INSTALL_MYSQL_CLIENT=false
# ...

所以我把它改成了真的:

### 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!

这就是诀窍!

4

2 回答 2

1

如此处所述,编辑 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
于 2020-10-14T10:43:02.420 回答
0

删除转储和其中的所有内容或在config/database.php中对其进行注释,然后它可以在没有转储的情况下正常工作, 如下所示:

//'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
         ], 
于 2021-11-10T22:46:45.817 回答