2016年10月22日 星期六

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 文件#

代码如下: 


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 上.

from : https://laravel-china.org/topics/207

沒有留言:

wibiya widget