Laravel 应用自动备份 MySQL 数据到云端 (Dropbox) 实践

说明

之前的 PHPHub 一直使用 cron + shell script 的原始方法备份, 并且只备份在本机上, 有点不科学, 今天花了点时间做了 云备份 , 在此记录下.

需求

每天凌晨的时候, 自动 dump 数据库备份文件到 Dropbox 云平台上, 文件命名有时间标记 (方便恢复时查看).

执行步骤

  1. 创建 Dropbox App, 获取需要的 App 信息;
  2. 安装 backup-manager 包;
  3. 创建 Artisan 备份命令;
  4. 添加 cron 计划任务.

1. 创建 Dropbox App

通过 这个链接 创建一个 App, 创建成功后收集以下信息:

  • 'key' => 应用的 KEY
  • 'secret' => 应用的 Secret
  • 'app' => 应用的名称
  • 'token' => 获取见下图, 见下图

获取 token:

2. 安装 backup-manager

backup-manager 是一个用来备份数据库的扩展包, 并专门为 Laravel 提供了接口.

有以下功能:

  • 支持 MySQL 和 PostgreSQL;
  • 支持 Gzip 压缩;
  • 支持的备份目标有 S3, Dropbox, FTP, SFTP, and Rackspace Cloud.

1. 编辑 composer.json 文件

添加以下两行:

"heybigname/backup-manager": "0.3.*@dev",
"dropbox/dropbox-sdk": "1.1.*"

然后

composer update

2. 添加 config/app.php

添加 providers

'BigName\BackupManager\Integrations\Laravel\BackupManagerServiceProvider',

3. 配置信息

执行以下命令发布配置信息

php artisan config:publish heybigname/backup-manager --path=vendor/heybigname/backup-manager/config

配置文件有两个:

  • database.php 文件不需要理会, 会自动使用 laravel 应用里当前环境下使用的数据库配置.
  • storage.php 是对存储目标 provider 的配置;

把上面 步骤1 获取到的 Dropbox 信息填入.

PHPhub 的配置 在此, 可供参考.

4. 使用

命令行执行

php artisan 

会发现多了三个命令, 分别是:

  • db:restore 恢复数据库
  • db:backup 备份数据库
  • db:list 对备份文件进行列表 (远程文件系统)

执行以上命令会有对应的提问, 按照情况回答就是, 如以下:

也可以通过提供选项的方式跳过提问如:

php artisan db:backup --database=mysql --destination=dropbox

如果一切都没问题的话, 上 dropbox 后台, 就能看到刚刚上传的文件了.

打开数据库客户端工具, 修改点内容, 然后执行以下命令, 测试下恢复功能:

php artisan db:restore

3. 创建 Artisan 备份命令

backup-manager 很棒, 可惜没有提供自动命名, 所有这里手动创建一个命令, 来完成自动命名的功能.

关于 Artisan 命令的添加, 参见: Laravel 4 Artisan 命令行实战.

我们的目标是通过一个命令, 来完成自动传参:

php artisan db:cloudbackup

1. 命令行生成文件

php artisan command:make DatabaseBackupCommand

2. 激活 Artisan 命令行

在 app/start/artisan.php 文件里面, 添加以下

Artisan::add(new DatabaseBackupCommand);

3. 编辑 app/commands/DatabaseBackupCommand.php 文件

代码如下:

<?php

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class DatabaseBackupCommand extends Command {

    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'db:cloudbackup';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Backup database to the cloud.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function fire()
    {
        $now      = Carbon::now();
        $folder   = $now->format('Y-m') . '/';
        $database = Config::get('database.connections.mysql.database');
        $subfix   = '_' . $now->toDateTimeString() . '.sql';

        $filename = $folder . $database . $subfix;
        // database, destination, destinationPath, compression
        $this->call('db:backup', [
            '--database' => 'mysql',
            '--destination' => 'dropbox',
            '--destinationPath' => $filename,
            '--compression' => 'gzip',
        ]);
    }
}

4. 添加 cron 计划任务

1. 创建可供 cron 运行的脚本

vi /usr/sbin/dbcloudbackup

内容:

#!/bin/sh

cd /vagrant/phphub
php artisan db:cloudbackup

权限

chmod +x /usr/sbin/dbcloudbackup

测试一下

dbcloudbackup

查看 Dropbox 后台:

2. 添加 Cron

编辑 cron

crontab -e 

增加命令, 每天早晨 3 点半的时进行备份

30 3 * * * /usr/sbin/dbcloudbackup

有需要的话, 可以检查系统当前时间 (防止时间差问题)

date

结束语

通过这种方式, 以后可以很轻易的修改备份到别的备份目标, 如 S3 上.

摈弃世俗浮躁,追求技术精湛
本帖已被设为精华帖!
Summer
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 7
Summer

@lijinma 已修正, 多谢

9年前 评论

不错,这也是我一直想要的方案。这个dropbox的方案是要求服务器能翻墙吧?国内的服务器就用不了dropbox了。

7年前 评论

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