说明#
之前的 PHPHub 一直使用 cron +
shell script
的原始方法备份, 并且只备份在本机上, 有点不科学, 今天花了点时间做了 云备份
, 在此记录下.需求#
每天凌晨的时候, 自动 dump 数据库备份文件到 Dropbox 云平台上, 文件命名有时间标记 (方便恢复时查看).
执行步骤#
- 创建 Dropbox App, 获取需要的 App 信息;
- 安装 backup-manager 包;
- 创建 Artisan 备份命令;
- 添加 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
沒有留言:
張貼留言