登录
首页 >  数据库 >  MySQL

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

来源:SegmentFault

时间:2023-02-24 20:07:19 405浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《使用 Laravel 制定 MySQL 数据库备份计划任务》,介绍一下MySQL、scheduler、PHP、laravel、backup,希望对大家的知识积累有所帮助,助力实战开发!

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

你可以在终端里通过运行一行命令导出整个数据库。这种方案不仅简单直接而且有效。不过有更加自动化的解决方案。让我们来看看究竟是什么!

scheduling-mysql-backups-with-laravel

背景

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

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

导出命令

使用这个单行 snippet,你可以快速的将数据库导出到 SQL 文件。很多应用使用下面这个命令从数据库导出数据。

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

以上就是《使用 Laravel 制定 MySQL 数据库备份计划任务》的详细内容,更多关于mysql的资料请关注golang学习网公众号!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表