laravel 备份数据库 求指教

想备份数据 导出包含结构和数据的xxx.sql文件
目前试了spatie/laravel-backup
但是我的环境是docker-compose

......
  php:
    build:
      context: ./services/php
      args:
        PHP_VERSION: php:${PHP_VERSION}-fpm-alpine
        CONTAINER_PACKAGE_URL: ${CONTAINER_PACKAGE_URL}
        PHP_EXTENSIONS: ${PHP_EXTENSIONS}
        TZ: "$TZ"
    container_name: php
    expose:
      - 9501
    ports:
      - "${PHP_SUPERVISOR_HOST_PORT_C}:9001"
    extra_hosts:
      - "www.site1.com:172.17.0.1"
    volumes:
      - ${SOURCE_DIR}:/www/:rw
      - ${PHP_PHP_CONF_FILE}:/usr/local/etc/php/php.ini:ro
      - ${PHP_FPM_CONF_FILE}:/usr/local/etc/php-fpm.d/www.conf:rw
      - ${PHP_LOG_DIR}:/var/log/php
      - ${DATA_DIR}/composer:/tmp/composer
      - ${PHP_SUPERVISOR_LOG}:/var/log/supervisor/:rw
      - ${PHP_SUPERVISOR_CONFIG}:/etc/supervisor/conf.d/:rw
      - ${PHP_SUPERVISOR_CONF_FILE}:/etc/supervisor/supervisord.conf:ro
    restart: always
    command:
     - /bin/sh
     - -c
     - |
        supervisord -n -c /etc/supervisor/supervisord.conf
    cap_add:
      - SYS_PTRACE
    networks:
      default:
        ipv4_address: 10.0.0.11

  mysql:
    image: mysql/mysql-server:${MYSQL_VERSION}
    container_name: mysql
    ports:
      - "${MYSQL_HOST_PORT}:3306"
    volumes:
      - ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
      - ${DATA_DIR}/mysql:/var/lib/mysql/:rw
      - ${MYSQL_LOG_DIR}:/var/log/mysql/:rw
    restart: always
    networks:
      default:
        ipv4_address: 10.0.0.12
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      MYSQL_ROOT_HOST: "${MYSQL_ROOT_HOST}"
      TZ: "$TZ"
......

在php容器执行

php artisan backup:run

报错如下

Backup failed because The dump process failed with exitcode 127 : Command not found : sh: mysqldump: not found
.
#0 /www/project/vendor/spatie/db-dumper/src/DbDumper.php(263): Spatie\DbDumper\Exceptions\DumpFailed::processDidNotEndSuccessfully(Object(Symfony\Component\Process\Process))
#1 /www/project/vendor/spatie/db-dumper/src/Databases/MySql.php(203): Spatie\DbDumper\DbDumper->checkIfDumpWasSuccessFul(Object(Symfony\Component\Process\Process), '/www/herui-area...')
#2 /www/project/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJob.php(246): Spatie\DbDumper\Databases\MySql->dumpToFile('/www/herui-area...')
#3 [internal function]: Spatie\Backup\Tasks\Backup\BackupJob->Spatie\Backup\Tasks\Backup\{closure}(Object(Spatie\DbDumper\Databases\MySql), 'mysql')
#4 /www/project/vendor/laravel/framework/src/Illuminate/Support/Collection.php(1120): array_map(Object(Closure), Array, Array)
#5 /www/project/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJob.php(249): Illuminate\Support\Collection->map(Object(Closure))
#6 /www/project/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJob.php(166): Spatie\Backup\Tasks\Backup\BackupJob->dumpDatabases()
#7 /www/project/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJob.php(142): Spatie\Backup\Tasks\Backup\BackupJob->createBackupManifest()
#8 /www/project/vendor/spatie/laravel-backup/src/Commands/BackupCommand.php(52): Spatie\Backup\Tasks\Backup\BackupJob->run()
#9 [internal function]: Spatie\Backup\Commands\BackupCommand->handle()
#10 /www/project/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array)
#11 /www/project/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#12 /www/project/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#13 /www/project/vendor/laravel/framework/src/Illuminate/Container/Container.php(576): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#14 /www/project/vendor/laravel/framework/src/Illuminate/Console/Command.php(183): Illuminate\Container\Container->call(Array)
#15 /www/project/vendor/symfony/console/Command/Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#16 /www/project/vendor/laravel/framework/src/Illuminate/Console/Command.php(170): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#17 /www/project/vendor/spatie/laravel-backup/src/Commands/BaseCommand.php(16): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#18 /www/project/vendor/symfony/console/Application.php(1021): Spatie\Backup\Commands\BaseCommand->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#19 /www/project/vendor/symfony/console/Application.php(275): Symfony\Component\Console\Application->doRunCommand(Object(Spatie\Backup\Commands\BackupCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#20 /www/project/vendor/symfony/console/Application.php(149): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#21 /www/project/vendor/laravel/framework/src/Illuminate/Console/Application.php(90): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#22 /www/project/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(133): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#23 /www/project/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#24 {main}
Backup failed because: The dump process failed with exitcode 127 : Command not found : sh: mysqldump: not found

大概知道是docker-compose环境 php容器内无法访问mysq容器报错没有该命令

求助求助 这个包支持这种环境吗

或是其他备份方法请大家指点指点 谢谢~

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
gongmeng
最佳答案

这个问题其实很简单,因为你是在PHP容器中操作的备份命令,这个备份命令其实执行了mysql的导出备份命令,但是你PHP的容器内是没有装mysql的,因为你的mysql是以另一个容器单独部署的,只不过两个容器部署到了同一个network下面,所以你会误解为你在PHP容器可以执行备份,但实际你在PHP容器内部执行mysql的客户端命令就会发现问题所在。要想解决这个问题,可以在你的PHP容器内装一个mysql客户端,客户端默认指向mysql容器的链接即可,具体你可以参考laradock的workspace容器的dockerfile文件处理。
github.com/laradock/laradock/blob/...

ARG INSTALL_MYSQL_CLIENT=false
ARG INSTALL_PING=false
ARG INSTALL_SSHPASS=false
ARG INSTALL_DOCKER_CLIENT=false

RUN set -eux; \
  ###########################################################################
  # MySQL Client:
  ###########################################################################
  if [ ${INSTALL_MYSQL_CLIENT} = true ]; then \
    apt-get -yqq install mysql-client; \
  fi; \
  ###########################################################################
  # ping:

上面是参考部分

1年前 评论
zisen (楼主) 1年前
讨论数量: 12
自由与温暖是遥不可及的梦想

个人建议不要使用这个进行备份

可以RDS RDS 可以恢复到秒级

或者shell脚本任务来执行

不使用php代码来弄这个

php 代码来弄这个不合适

1年前 评论
zisen (楼主) 1年前

程序备份SQL几乎很少见,也没有使用过,帮不到忙。通常自建的IDC也是shell自动化备份,或内网多从服务器当做“异地灾备”,

1年前 评论
zisen (楼主) 1年前
gongmeng

这个问题其实很简单,因为你是在PHP容器中操作的备份命令,这个备份命令其实执行了mysql的导出备份命令,但是你PHP的容器内是没有装mysql的,因为你的mysql是以另一个容器单独部署的,只不过两个容器部署到了同一个network下面,所以你会误解为你在PHP容器可以执行备份,但实际你在PHP容器内部执行mysql的客户端命令就会发现问题所在。要想解决这个问题,可以在你的PHP容器内装一个mysql客户端,客户端默认指向mysql容器的链接即可,具体你可以参考laradock的workspace容器的dockerfile文件处理。
github.com/laradock/laradock/blob/...

ARG INSTALL_MYSQL_CLIENT=false
ARG INSTALL_PING=false
ARG INSTALL_SSHPASS=false
ARG INSTALL_DOCKER_CLIENT=false

RUN set -eux; \
  ###########################################################################
  # MySQL Client:
  ###########################################################################
  if [ ${INSTALL_MYSQL_CLIENT} = true ]; then \
    apt-get -yqq install mysql-client; \
  fi; \
  ###########################################################################
  # ping:

上面是参考部分

1年前 评论
zisen (楼主) 1年前

建议换用sql语句备份的库。或者看用的库有没有配置用sql备份的配置

1年前 评论
zisen (楼主) 1年前
deatil (作者) 1年前
zisen (楼主) 1年前
xiaochong0302

在物理机上搞一个shell备份脚本,调用docker命令来备份,可以参考我的开源项目酷瓜云课堂,实现了本地备份在再上传到腾讯云存储,这个项目基本都是自动化的,很有参考价值.

course-tencent-cloud-docker

1年前 评论
zisen (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!