最近项目用户徒增,购买的服务器仍是和公司另一个项目共用的同一台服务器,想着要是服务器崩了,还没个容灾方案,万一。。。不得被用户整死php
app/config/filesystems.php
中;完成安装laravel-backup以后,能够在本地cli环境调试下html
php artisan backup:run --only-db
文件会默认保存在/storage/app/http---localhost
中
一切顺利的话,咱们须要作个定时任务,让它天天自动的去备份数据库,在app\console\kernel.php
的文件中,加入以下的备份策略:(laravel任务调度)linux
protected function schedule(Schedule $schedule){ $schedule->command('backup:run --only-db')->twiceDaily(1, 13); }
这里的代码是针对linux系统的,须要在服务器安装crontab,并设置好以后会被自动调用;laravel
至此已经完成了数据库备份,下面是个人一个误区,可是这个坑我以为很是值得去踩。按照我开始的设计思路,在备份完成打包以后,先将文件存储在本地,这时候调用一个监听事件,将文件上传至七牛云,而后再在数据库新增一条数据。
毫无疑问这个思路彻底是能够走通的,经过阅读laravel-backup官方文档,我找到了备份完成以后的几个事件(在/vendor/spatie/laravel-backup/src/Events
能够找到),这里只须要监听压缩成zip文件以后的一个时间便可,并将其注册在个人监听器里面。
在app/provider/EventSeviceProvider
中注册sql
protected $listen = [ //... 'Spatie\Backup\Events\BackupZipWasCreated' => [ 'App\Listeners\BackupListener' ] ];
发布以后,咱们会产生一个监听器BackupListener,数据库
public function handle(BackupZipWasCreated $event) { // 文件已经存储在本地,获取该文件信息 $info = $event->zip; // 将文件上传至七牛云 // 存入数据库 }
上面的部分代码没写,你们能够去本身去试下,加深对七牛云及laravel-backup的理解,彻底能够达到目的。segmentfault
我在修改配置文件app/config/laravel-backup.php
的时候,忽然意识到它的disk貌似就是filesystems.php中disks默认的一种,即存储在本地,那么咱们可否在这里直接使用刚刚加入qiniu的disk做为driver呢?答案是能够的,这里是利用了laravel的文件系统&云存储
。服务器
我这里修改了两点,一个是将app
'name' => env('APP_ENV').'/databaseBackup'
这个是为了测试环境和线上环境作个区分,可不设置。
重要的的一点,在配置文件laravel-backup.php中将laravel默认的文件系统driver由local修改为qiniu,这样就能够将dump下来的文件直接向七牛云发送,而不是直接保存在本地。ide
'destination' => [ 'disks' => [ // 'local', 'qiniu', ], ],
那么咱们在监听器BackupListener
里面的处理也能够更简单了.
public function handle(BackupZipWasCreated $event) { $info = $event->zip; $fileName = env('APP_ENV').'-databaseBackup/'.substr($info->getPath(),-21,21); $size = $info->getSize(); $data = array( 'type' => 1, 'path' => $fileName, 'size' => $size ); // 存入数据库 $db_result = DB::table('backup')->insert($data); }
附上备份表backup的sql:
CREATE TABLE `backup` ( `id` int(11) NOT NULL AUTO_INCREMENT, `type` tinyint(4) DEFAULT '1' COMMENT '文件类型', `path` varchar(256) DEFAULT '' COMMENT '位置', `size` float DEFAULT '0' COMMENT '大小', `isCloud` tinyint(4) DEFAULT '0' COMMENT '是否云备份', `downloads` int(11) DEFAULT '0' COMMENT '下载次数', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '加入时间', `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间', `deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8