UU Blog

Python下载阿里云RDS实例备份

很多数据都做了备份,而且全都用脚本完成。并定时下载一份回我们本地,等于多多点异地备份了,避免被一锅端了的情况。

像代码,这个是分发的,而且开发人手一份,这个就不备份了。用户静态数据也都定时做了rsync同步备份,压缩保存。

连测试环境的数据库都做了自动的MySQL逻辑备份。唯独线上环境,存在RDS中的MySQL数据库,虽然有RDS定时备份实例,但是不经常上去下载一份保存回本地你是不得安心的。

这万一被盗号了呢。。。岂不是辛辛苦苦几十年,一删回到解放前。

本来是可以用mysqldump -h 远程IP 这样备份的。但是RDS可能是防止脱裤,搞了限制。所以,往日都是我自己上阿里云官网,手动点击下载备份。

为了减少这一部分的重复劳动,我决定用阿里云的SDK搞一个自动下载实例。

以为会遇到很多麻烦,没想到SDK封装得还不错,使用异常简单。

步骤分为如下几步

  1. 安装阿里云API封装的Python SDK

    里面几乎有阿里云所有产品的SDK,这给我们定制自己的工具提供了很大的便利。
    这里我们要用的是RDS相关的功能,所以 sudo pip install aliyun-python-sdk-rds就行了。

  2. 申请访问API需要用的Access Key

    最好先新建RAM账号,再申请AK。

  3. 编码

整个备份逻辑很简单,就是查看指定日期区间备份列表,获取备份信息。然后下载备份。

主要用到SDK DescribeBackupsRequest 这个类。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from aliyunsdkcore import client
#from aliyunsdkrds.request.v20140815 import DescribeRegionsRequest
from aliyunsdkrds.request.v20140815 import DescribeBackupsRequest
import json
import requests
import datetime
#import time

saveRoot='/home/phan/backups/' #设置备份根目录

# 下载链接
def downLink(url,dateStr):
downFile = requests.get(url)
# 设置备份目录
savePath = '%s%s.tar.gz'%(saveRoot,dateStr)
with open(savePath,'wb') as backup_file:
backup_file.write(downFile.content)

# 获取今日和明日的日期
today=datetime.date.today();
yesterday=datetime.date.today() - datetime.timedelta(1)

clt = client.AcsClient('你的AK','你的ASK','cn-shenzhen') #这里的地区ID非必须的

request = DescribeBackupsRequest.DescribeBackupsRequest()
## 以下请求的参数都是必须的 尤其实例名和查询区间
request.set_accept_format('json')
request.set_action_name('DescribeBackups')
request.set_DBInstanceId('rm-xxxxxxxxxxx') # 你的实例ID
request.set_StartTime('%sT00:00Z'%(yesterday))
request.set_EndTime('%sT00:00Z'%(today))
result = clt.do_action_with_exception(request)
## 下载RDS备份
if result:
json_rds = json.loads(result)
if json_rds['Items']['Backup'][0]['BackupStatus']=='Success':
downLink(json_rds['Items']['Backup'][0]['BackupDownloadURL'],today)

print u"数据库备份完成"

至此,加入crontab,备份基本全自动了。

参考资料

Aliyun Python SDK
Aliyun RDS Help

给作者打一针鸡血