最近項目用戶徒增,購買的服務器仍是和公司另一個項目共用的同一臺服務器,想着要是服務器崩了,還沒個容災方案,萬一。。。不得被用戶整死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