SAE Django中自动备份数据库

January 11, 2015 | 11:24 python Django SQL SAE

备份数据库想必是一个很常见的需求,下面主要记录一下如何在SAE的Python环境(Django)下,结合DeferredJob以及Cron来实现对MySQL数据库的自动备份。

首先,是在我们的views.py里面,添加一个实现备份的方法。其中需要调用SAE提供的MySQLExportDeferredJob类,这里请参见SAE的API。以下是具体代码:

def db_backup(request):
  # 判断是否是线上
  from os import environ
  online = environ.get("APP_NAME", "") 
  if online:
    from sae.deferredjob import MySQLExport, DeferredJob
    deferred_job = DeferredJob()
    today = datetime.datetime.now().date()
    filename = 'backup_%s.zip' % today #用日期作为文件名,并.zip成压缩文件
    job = MySQLExport('domain', filename,'') #domain为某个SAE的Storage域
    deferred_job.add(job)
  else:
    raise Http404

然后,在urls.py中为上面的方法分配一个url匹配,这样我们就可以调用它了。

最后就是为我们的Django项目配置Cron任务。打开config.yaml文件,添加如下代码:

cron:
  - description: database backup
  url: /backup/
  schedule: 0 5 * * 1

上面这一段代码使用的是crontab语法,具体的含义(尤其是schedule参数)请参见Man 5文档

这样我们就实现了一个定时对SAE下Django项目进行数据库备份的功能了。

注意:我们的实现中还有一个需要当心的问题,即我们的url是暴露在公开域中的,任何人如果知晓我们的备份url都可以在任意时刻手动调用该方法。如需解决这一问题,可在Cron中的login参数下进行身份验证,目前尚未实际测试。

Creative Commons BY-NC-ND 3.0