前几天由于更换域名,涉及到数据库中的内容也需要进行修改。从SAE平台中的phpAdmin直接导出sql文件,直接对文件进行替换操作,如将www.yovisun.me替换为www.yovisun.com。完成以后,删除原来数据库,再将替换后的sql文件导入,发现总是出错。后来检查sql文件,才知道,phpAdmin导出的sql文件有错,不能全部导出所有数据。
经过与SAE工作人员交流,才知道,官方推荐使用DeferredJob进行数据库的导入导出操作。但是问题出现了,得解决。SAE是有数据库恢复的功能的,以前都是通过论坛或者邮件申请,由工作人员手动恢复。现在该服务已经公开推出,可以自动恢复。但是个人感觉费用有点高,只允许付费云豆,其计费方式为:
数据恢复费用(付费云豆) = 底价(10,000云豆)+ 数据大小(单位MB,不足1MB按1MB计算) × 系数(默认10)×(当前日期 — 数据恢复日期)
这样我的恢复需要10012个付费云豆,相当于人民币100.12元,对于个人无商业价值的网站的确有点高了。如果是10元那还可以接受。
由于本次数据丢失,是由于SAE平台导致的,主要责任不在于我,于是便给SAE写了一篇Email说明了情况,还不错,管理员很快给我安排手动恢复了数据。得赞一下。(P.S 后续,SAE相关工作人员还与我交流,询问相关出错信息,很不错,让我对SAE平台又有点好感)
说了那么多废话,下面讲一下怎么使用SAE平台的服务进行数据自动备份吧,数据无价,人的精力时间有限,现在希望的都是一切自动化。所以,首先想到的是Cron服务,可以按设定的时间规则自动进行相关任务。然后,再结合官方推荐使用的DeferredJob服务进行数据库备份,自然就解决问题了。
可以新建一个php文件,如命名为:bak_up_db.php
,使用DeferredJob进行数据导出,我的设置如下:
<?php
/**
* 使用DeferredJob服务对数据库进行备份
* 结合Cron服务,实现定时备份
*
* 函数原型: addTask($tasktype,$dbtype,$stor_domain,$stor_filename,$dbname,$tbname,$callback)
* http://sae.sina.com.cn/?m=devcenter&catId=196
*/
$stor_domain = "yovisun";//Storage的存放域
$file_path = "/bak_up_db/";//文件路径
$file_name = date('YmdHis').".sql.zip";//以当前的时间日期为文件名
$stor_filename = $file_path .$file_name;//完整的文件名(含路径)
$dbname = SAE_MYSQL_DB; //数据库名
$dj = new SaeDeferredJob();
$taskID = $dj->addTask("export", "mysql", $stor_domain, $stor_filename, $dbname, null, null);
if($taskID===false){
var_dump($dj->errno(), $dj->errmsg());
}else{
var_dump($taskID);
}
这样就可以进行数据的导出,当然,请先创建相应的Storage,保证目录正确。接下来就是在config.yaml文件中设置Cron任务,可以根据自己的需要设计,具体语法可以参考官网的文档。我的设置如下:
cron:
- description: 使用DeferredJob每天凌晨4点对进行数据库备份
url: task/bak_up_db.php
schedule: every day of month 04:00
这样,在每天凌晨的4点就会进行自动备份。
OK,完工,去Storage看看吧,所有的备份数据均在那里,是不是心里踏实了许多。
(温馨提示:目前DeferredJob每天只能执行10次)
这个太有用了~
呵呵,好久不见你了哦
我想问一下addTask的最后一个回调地址是任务添加成功之后回调还是任务执行完成后回调的
任务成功时,调用的回调url
谢谢啦,我刚才测试了一下了