使用 Laravel 制定 MySQL 数据库备份计划任务

译文首发于 使用 Laravel 制定 MySQL 数据库备份计划任务,转载请注明出处。

你能够在终端里经过运行一行命令导出整个数据库。这种方案不只简单直接并且有效。不过有更加自动化的解决方案。让咱们来看看到底是什么!php

scheduling-mysql-backups-with-laravel

背景

几天前,我登陆到错误的数据库中而后干掉了 18 000 行线上数据记录。更糟糕的是,咱们没有对这个数据库进行备份。而后,我决定编写一个可以自动完成数据库导出并保存到 SQL 文件的脚本。html

另外,若是你须要一款功能强大的数据备份系统,你能够看看 这个 扩展。这样咱们就无需关注更多的数据库备份细节而仅需将焦点放到数据库导出和导出计划上。mysql

导出命令

使用这个单行 snippet,你能够快速的将数据库导出到 SQL 文件。不少应用使用下面这个命令从数据库导出数据。laravel

mysqldump -u[user] -p[pass] [db] > [file_path]

正如你所看到的那样,咱们须要传入用户名、密码和须要导出的 DB,而后将输出重定向到指定的文件。食用简单方便,功效显著。git

如今让咱们将这个命令经过使用 artisan 命令进行封装,使其更易于运行和可加入计划任务。github

Artiasn 控制台接口热身

经过使用 artisan 控制台(console)集成 shell 命令的一个重要出发点是,可以一次编写处处运行。咱们要作的是配置并使用这些配置。这意味着,一旦有参数被修改,咱们不须要经过命令自己进行调整。接下来,咱们能够来建立这个控制台命令。sql

经过运行 php artisan make:comman 命令来建立一个自定义命令。这里咱们的命令命名为 BackupDatabase。当建立完你的命令后,Laravel 会自动的将命令注册到系统中。你须要作的,仅仅是去定义命令的签名(signature)。shell

让咱们来预览一下这个命令文件;稍后会详细解释它是如何运行的:数据库

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

class BackupDatabase extends Command
{
    protected $signature = 'db:backup';

    protected $description = 'Backup the database';

    protected $process;

    public function __construct()
    {
        parent::__construct();

        $this->process = new Process(sprintf(
            'mysqldump -u%s -p%s %s > %s',
            config('database.connections.mysql.username'),
            config('database.connections.mysql.password'),
            config('database.connections.mysql.database'),
            storage_path('backups/backup.sql')
        ));
    }

    public function handle()
    {
        try {
            $this->process->mustRun();

            $this->info('The backup has been proceed successfully.');
        } catch (ProcessFailedException $exception) {
            $this->error('The backup process has been failed.');
        }
    }
}
你也看到了,咱们的命令签名为 db:backup。因为 Laravel 已经有了 db 命令空间,这样命令更加清晰命令。

在构造函数中,咱们实例化一个新的 Symfony\Component\Process\Process 实例。缘由是这里咱们须要使用 Symfony 的 Process 组件 - 而不是简单的调用 shell_exec 函数。这个组件提供了不少好赞的特性。好比,若是进程失败,咱们能够抛出异常,而后有效处理异常。服务器

若是你是用的是 process 的 run() 方法,你须要手动的去检测运行错误而后抛出异常。而经过 mustRun() 方法,它会自动的给咱们抛出异常。你能够从 文档 中获取更多信息。

咱们将 shell 命令和所需的参数传入到 sprintf() 函数中,它会将占位符替换成实际的参数。在处理完 process 实例后,咱们能够进行下一步 handle)( 方法的处理。

在 handle 方法里,咱们有个一 try-catch 代码块。首先,咱们调用 mustRun() 方法,若是没有错误,咱们向控制台中输出绿色的信息;不然,抛出 ProcessFailedException 异常,并在 catch 代码块中捕获,并向控制台中输出 error 信息。

接下来呢?若是咱们在控制台执行 php artisan db:backup 命令,咱们就会到此处数据库而后将其保存到 storage/backups/backup.sql 文件。运行良好,不过,咱们还有一些工做要作,就是编写计划任务。

编写备份任务的计划任务

首先,在 Laravel 中可以轻松建立计划任务。它内置提供了既简单又支持链式操做的定义任务的 API 接口。在继续本文阅读以前,强烈建议阅读 它的文档 中译

而后,进入到 Console/Kernel.php 文件看看 schedule() 函数。咱们能够定义任务和任务执行周期。好比,咱们但愿在 每周一的 23:00 运行计划,它的编码以下:

protected function schedule(Schedule $schedule)
{
    $schedule->command('db:backup')->mondays()->at('23:00');
}

是否是很简单?更棒的是,你能够在这里定义任意多个命令。调度器(scheduler)会在指定的时间分别处理这些任务。

若要运行这个调度器,咱们须要执行 php artisan schedule:run 命令,而后它会触发全部须要运行的命令。这很棒,咱们仅需一行命令就能够在指定的时间触发对应的任意命令。

但如今的问题时,如何管理调度器自身。这个有点像鸡生蛋蛋生鸡的问题,可是相信我,没有这么复杂。

使用 Forge 设置调度器

若是你还须要掌握 CORN 执行原理相关基础支持, Mohamed Said 有一个系列文章 深刻讲解了 CRON 相关知识。其中关键点在于,咱们无需为每一个计划任务建立 CRON 定时器。咱们仅需向前面介绍的那样定义任务执行手气,而后运行任务调取器就行了。

不过,咱们须要设置运行 php artisan schedule:run 命令的时间。若是你使用了 Laravel Forge,那么能够很轻易的建立定时任务。只需进入到 Scheduler 选项卡,而后你就能建立任何你想要的计划任务。

forge schedule

如你所见,默认的已将添加了 schedule:run 命令,你须要作的就是,定义任务周期(frequency)以及替换默认命令到你服务器的命令。

若是准备好了,调度器将每次在适当的时候运行,并触发全部要执行的命令。

总结

很高兴; 咱们能够提供轻量级的解决方案,而不依赖于一个更大的包。在这里,咱们也能够利用 Laravel 的优点来知足需求。

咱们可使用 Process 组件轻松导出数据库,并将其封装在 artisan 命令中。而后,咱们能够快速地为咱们的命令设置一个执行周期,而 Laravel 的调度程序将负责剩下的工做。咱们能够躺着就把活该干了。

原文

Scheduling MySQL Backups with Laravel

相关文章
相关标签/搜索