mysql 如何在laravel 9中使用spatie包设置备份数据库的路径'dump_binary_path'?

uoifb46i  于 2023-03-17  发布在  Mysql
关注(0)|答案(1)|浏览(152)

我的Laravel 9应用程序有几个docker容器(Nginx,PHP,MySQL,PHPMyAdmin等)。我使用spatie package备份我的数据库。我不知道如何设置mysqldump文件的路径,因为它在docker容器中!我尝试了许多不同的路径在互联网上提到(例如'var/lib/mysql','mysql/bin','usr/bin'等),但他们都不工作!
幸运的是,当我在服务器上运行以下命令时,成功生成了备份文件,因此我认为mysqldump文件位于'\usr\lib'中:
docker exec我的容器名称/usr/bin/mysqldump -u root用户密码=我的密码数据库名称〉存储/应用程序/备份/备份测试. sql
下面是我的docker-compose.yml文件中的MySQL服务定义:

mysql:
     image: mysql:8.0
     container_name: mysql
     restart: unless-stopped
     tty: true
     volumes:
       - ./mysql:/var/lib/mysql
     environment:
       MYSQL_ROOT_PASSWORD: {{root-passowrd}}
       SERVICE_NAME: mysql
     networks:
       - laravel

下面是config/database.php中的MySQL设置:

'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,
         'dump' => [
             'dump_binary_path' => '/usr/bin',
             'use_single_transaction',
             'timeout' => 60 * 5, 
         ],
         'options' => extension_loaded('pdo_mysql') ? array_filter([
             PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
         ]) : [],
     ],

如果有人能帮我解决这个问题,那就太好了!
下面是我运行时得到的错误
docker编写执行php php工匠备份:运行
备份失败,因为转储进程失败,退出代码为“无成功”。退出代码======== 127:未找到命令
输出======

错误输出============ sh:1:/usr/文件夹/mysqldump:页面没有找到。#0 /var/www/vendor/spatie/db-dumper/src/DbDumper.php(178):空间\数据库转储程序\异常\转储失败::processDidNotEndSuccessfully(对象(Symfony\组件\进程\进程))#1 /var/www/供应商/空间/数据库转储程序/src/数据库/MySql.php(143):空间\数据库转储\数据库转储-〉检查是否转储成功(对象(Symfony\组件\进程\进程),'/var/www/storag...')#2 /var/www/供应商/空间/laravel-backup/src/任务/备份/备份作业.php(274):空间\数据库转储器\数据库\MySql-〉转储到文件('/var/www/storag...')#3 [内部函数]:空间\备份\任务\备份\备份作业-〉空间\备份\任务\备份{闭包}(对象(空间\DbDumper\数据库\MySql),'mysql')#4 /var/www/供应商/laravel/框架/src/照明/集合/Arr.php(560):数组Map(对象(闭包),数组,数组)#5 /var/www/供应商/laravel/framework/src/照明/集合/集合.php(739):说明\支持\Arr::map(数组,对象(闭包))#6 /var/www/供应商/空间/laravel-backup/src/任务/备份/备份作业.php(277):说明\支持\集合-〉Map(对象(闭包))#7 /var/www/供应商/空间/laravel-backup/src/任务/备份/备份作业.php(188):空间\备份\任务\备份\备份作业-〉转储数据库()#8 /var/www/供应商/空间/laravel-backup/src/任务/备份/备份作业.php(160):空间\备份\任务\备份\备份作业-〉创建备份清单()#9 /var/www/供应商/空间/laravel-backup/src/命令/备份命令.php(58):空间\备份\任务\备份\备份作业-〉运行()#10 /var/www/供应商/laravel/框架/src/照明/容器/绑定方法.php(36):空间\备份\命令\备份命令-〉句柄()#11 /var/www/供应商/laravel/框架/src/照明/容器/实用程序.php(41):照明\容器\绑定方法::照明\容器{封闭}()#12 /var/www/供应商/laravel/framework/src/照明/容器/绑定方法.php(93):照明\容器\实用程序::unwrappIfClosure(对象(封闭))#13 /var/www/供应商/laravel/framework/src/照明/容器/绑定方法.php(37):调用绑定方法(对象(照明\基础\应用),数组,对象(闭包))#14 /var/www/vendor/laravel/framework/src/照明/容器/容器.php(651):调用(对象(照明\基础\应用程序),数组,数组,空)#15 /var/www/vendor/laravel/framework/src/照明/控制台/命令.php(182):调用(数组)#16 /var/www/供应商/symfony/控制台/命令/命令.php(312):照明\控制台\命令-〉执行(对象(Symfony\组件\控制台\输入\参数输入),对象(照明\控制台\输出样式))#17 /var/www/vendor/laravel/framework/src/照明/控制台/命令.php(152):Symfony\组件\控制台\命令\命令-〉运行(对象(Symfony\组件\控制台\输入\参数输入),对象(照明\控制台\输出样式))#18 /var/www/供应商/空间/laravel-backup/src/命令/基本命令.php(28):照明\控制台\命令-〉运行(对象(Symfony\组件\控制台\输入\参数输入),对象(Symfony\组件\控制台\输出\控制台输出))#19 /var/www/供应商/symfony/console/应用程序.php(1020):空间\备份\命令\基本命令-〉运行(对象(Symfony\组件\控制台\输入\参数输入),对象(Symfony\组件\控制台\输出\控制台输出))#20 /var/www/供应商/symfony/控制台/应用程序.php(312):Symfony\组件\控制台\应用程序-〉doRunCommand(对象(空间\备份\命令\备份命令),对象(Symfony\组件\控制台\输入\参数输入),对象(symfony\组件\控制台\输出\控制台输出))#21 /var/www/供应商/symfony/控制台/应用程序.php(168):运行(对象(Symfony\组件\控制台\输入\参数输入),对象(Symfony\组件\控制台\输出\控制台输出))#22 /var/www/vendor/laravel/framework/src/照明/控制台/应用程序.php(102):Symfony\组件\控制台\应用程序-〉运行(对象(Symfony\组件\控制台\输入\参数输入),对象(Symfony\组件\控制台\输出\控制台输出))#23 /var/www/vendor/laravel/framework/src/Illuminate/基础/控制台/内核.php(155):照明\控制台\应用程序-〉运行(对象(Symfony\组件\控制台\输入\参数输入),对象(Symfony\组件\控制台\输出\控制台输出))#24 /var/www/artisan(37):Illuminate\Foundation\Console\Kernel-〉句柄(对象(Symfony\组件\Console\输入\ArgvInput),对象(Symfony\组件\Console\输出\控制台输出))#25 {main}发送通知失败备份失败,原因是:转储进程失败,返回无成功退出代码。退出代码======== 127:未找到命令
输出======

7lrncoxx

7lrncoxx1#

我设法以不同的方式解决了这个问题!我通过Dockerfile在我的PHP容器中安装了MySQL客户端,如下所示:
停靠文件:

...
# install default-mysql-client
RUN apt-get update && apt-get install -y default-mysql-client && rm -rf /var/lib/apt
...

然后,我使用下面的命令(在我的控制器中)来生成备份。您可以通过cron作业触发此命令来定期生成备份:

mysql -u root --password=DB_PASSWORD -h mysql /usr/bin/mysqldump your-mysql-container-name > storage/app/backups/backup_filename.sql;

在我的例子中,我在UI中放置了一个按钮,以便管理员在需要时生成和下载备份。因此,当单击该按钮时,将触发一个 AJAX 调用,以便在PHP容器的shell中运行该命令。我在控制器中使用的命令如下所示:
我的控制者:

...
// create a dynamic name for the backup-file
$backup_filename  = date('d-m-Y_h-ia') . '_yourapp-DB-backup.sql';
$shell_command = 'cd .. && mysql -u root --password=' . env('DB_PASSWORD');
$shell_command .= ' -h mysql /usr/bin/mysqldump your-db-name > storage/app/backups/' . $backup_filename;

exec($shell_command);
...

最后,我把我的docker-compose.yml文件,以防它可以帮助别人!

version: '3.6'

services:

  nginx:
    image: nginx
    container_name: nginx-books
    hostname: nginx-books
    volumes:
      - ./src:/var/www/
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - books
      - nginx-web-proxy

  mysql:
    image: mysql:8.0
    container_name: mysql-books
    restart: unless-stopped
    tty: true
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: MYPASSWORD
      SERVICE_NAME: mysql
    networks:
      - books

  php:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: php-books
    hostname: php-books
    volumes:
      - ./src:/var/www/
      - ./php.ini:/usr/local/etc/php/php.ini
    networks:
      - books

  phpmyadmin:
    container_name: phpmyadmin-books
    hostname: phpmyadmin-books
    depends_on:
      - mysql
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_HOST=mysql
      - PMA_PORT=3306
    networks:
      - nginx-web-proxy
      - books

networks:
  books:
    name: books
  nginx-web-proxy:
    name: nginx-web-proxy
    external: true

相关问题