Shell实战【自动下载阿里云RDS数据库备份】

阿里云RDS的用户会有这样的需求,为了数据更安全和可用,需要将RDS的备份传输到自己的数据中心,以防在阿里云出故障的时候至少还有备份可以用,目前阿里云的RDS备份下载是免费,不排除未来会进行付费下载。
通过工单系统,阿里的工程师提供了一个可以下载RDS备份文件的工具(python脚本)下载地址:http://aliyunbbs123.oss-cn-hangzhou.aliyuncs.com/muyuan/rds_getbackupfilev1.0.zip
虽然有了这个阿里提供的脚本工具可以帮助你下载备份文件,但是要下载备份文件,你就需要修改时间段,如果你有多个库,那么还需要修改实例ID,所以这就是我写这个shell脚本的初衷了(如果你会python 那你可以直接编写python脚本),可以用计划任务每天执行脚本,下载多个数据库每天的备份,这样是不是轻松很多?好,现在开始。

下载的python工具脚本内容如下: 我们先稍作修改,来满足我们的Shell自动化下载需求

[root@LePus01 rdsget]# cat getfile.py
# -*- coding: utf-8 -*-
'''
Created on 2015-1-27

@author: muyuan
'''

import sys,os,shutil,string
import re
import urllib,urllib2,requests
import datetime,time
import aliyun.api

#这里写id 和 密钥
aliyun.setDefaultAppInfo("ID", "密钥")   ###这个直接填写你的Access Key ID和Access Key Secret 这个每用户只有1个,你固定填写就可以了

#print u"请先设置aliyun.setDefaultAppInfo的Access Key ID和Access Key Secret"  ###注释掉,我们是通过shell脚本执行的,不需要交互式操作

#print u"请输入您的RDS所在区域,如cn-hangzhou" ###注释掉,我们是通过shell脚本执行的,不需要交互式操作

#prompt = "Aliyun>"  ####注释掉,同上
my_diqu = "cn-beijing"
#print u"请输入您的RDS实例名"  ####注释掉,同上
my_rdsname = "rdsd52v21y29tyc8s478"
#print u"请输入您要下载备份的开始时间如2015-01-15"  ####注释掉,同上
my_begintime = "2015-09-16"
#print u"请输入您要下载的备份结束时间如2015-01-18"  ####注释掉,同上
my_overtime = "2015-09-23"

#查询备份信息,设置相关条件
a = aliyun.api.Rds20140815DescribeBackupsRequest()
a.RegionId = my_diqu #% (diqu)
a.DBInstanceid = my_rdsname # % (rdsname)
a.StartTime = my_begintime + "T00:00Z" # % (begintime)
#overtime = time.strftime("%Y%m%d-%H%M%S")
a.EndTime =  my_overtime + "T00:00Z" 

#获取备份列表
try:
	f = a.getResponse()
	if("Code" in f):
		print("Fasle")
		print(f["Code"])
		print(f["Message"]) 
	else:
		f = a.getResponse()
#		print(f)
		f = str(f)
#格式化输出
#		b=re.compile(r"(http://.*?)',")
		my_re = re.compile(r"(http://.*?)',")
#正则匹配		
		print my_re.findall(f)
		my_data = my_re.findall(f)
		my_len = len(my_data)      #计算list的元素数
###开始下载		
#		print "%r~%r,you have %r backup file ,start download,please wait," % (a.StartTime, a.EndTime, d) 
		print u"从%r到%r,有%r个备份文件可以下载 ,正在下载,请稍候," % (a.StartTime, a.EndTime, my_len) 
		my_url = my_data
		for m in my_url:
#			u = urllib2.urlopen(m)
#			y = u.read()
			urllib.urlretrieve(m, "muyuan.tar.gz")
			now = time.strftime("%Y%m%d-%H%M%S")
			newname = now + ".rdsd52v21y29tyc8s478.tar.gz"
			shutil.move("muyuan.tar.gz",newname)
		print u"下载完成,请查看脚本运行的当前目录下是否已经成功下载文件"
except Exception,e:
	print(e)

好了,基本改造完毕,其实就是填写Access Key ID和Access Key Secret 和注释掉交互式操作部分。

编写shell 完成自动化批量下载
先编写一个rdsid文件,每行一个是一个数据库的实例id ,供脚本的for循环调用,实现批量多库下载。

[root@LePus01 rdsget]# cat getrdsbak.sh 
#!/bin/bash

export PATH=$PATH
export DOMAIN=cn-beijing
export PYNAME=getfile.py
##下边这两个变量,在日常每日执行任务时,需要注释掉,当需要批量下载一段时间的备份时,才使用,程序后部会有判断。
#export BEGINDATE="2015-09-16"   
#export ENDDATE="2015-09-23"

为了方便调用,本脚本使用函数的方法,这里定义了2个函数。
一个用于每天的定期任务计划批量下载。
一个用于一段时间的批量下载。

###一段时间的批量下载的函数
function Regular()
{
for i in $(cat rdsid)  
	do	sed -i "s/^my_diqu.*/my_diqu = \"$DOMAIN\"/g" $PYNAME  ##替换地区
		sed -i "s/^my_rdsname.*/my_rdsname = \"$i\"/g" $PYNAME  ##for循环替换实例ID 实现多库的批量下载
		sed -i "s/^my_begintime.*/my_begintime = \"$BEGINDATE\"/g" $PYNAME  ##替换开始时间
		sed -i "s/^my_overtime.*/my_overtime = \"$ENDDATE\"/g" $PYNAME  ##替换结束时间
		sed -i "s/\t\t\tnewname.*/\t\t\tnewname = now + \"."$i".tar.gz\"/g" $PYNAME ##替换以实例ID命名的下载文件。
		python $PYNAME
done;
return 1
}

### 每天的定期任务计划批量下载的函数  内容功能同上
function Everydate()
{
for i in $(cat rdsid)
        do      sed -i "s/^my_diqu.*/my_diqu = \"$DOMAIN\"/g" $PYNAME
                sed -i "s/^my_rdsname.*/my_rdsname = \"$i\"/g" $PYNAME
                sed -i "s/^my_begintime.*/my_begintime = \"$(date +%Y-%m-%d)\"/g" $PYNAME  ##开始时间为当天日期
		sed -i "s/^my_overtime.*/my_overtime = \"$(date -d "+2days" +%Y-%m-%d)\"/g" $PYNAME ##结束时间为当天+1天的日期
                sed -i "s/\t\t\tnewname.*/\t\t\tnewname = now + \"."$i".tar.gz\"/g" $PYNAME
                python $PYNAME
done;
return 1
}

if [ -z $BEGINDATE ] && [ -z $ENDDATE ]
then
	Everydate
else
	Regular
	exit 1
fi

见效果:

getrdsbak

发表评论