Python 3.9 定时自动下载阿里云RDS备份到本地
一、业务应用诉求
- 本文所述方法经过真实业务实践,在相同环境下具备实操性。
- 背景说明,业务系统部署于阿里云,但为了数据库备份可以每天下载到本地服务器保留。之前的做法是每天由专人登录阿里云,先手工获取下载链接,然后用迅雷下载到本地。由于是纯人工操作,存在事务繁杂时经常忘掉,不及时的问题。以及经常在上班工作时间进行下载,占用公司网络带宽,影响正常业务使用。因此,诉求是实现定时自动下载,避开工作时间。
- 本方所述方法参考了阿里云的技术博文,但有一定的改进,并实例化操作过程,对有类似诉求的朋友来说,可以直接借鉴。
阿里云上的参考技术博文
具体地址:https://help.aliyun.com/knowledge_detail/55515.html?spm=5176.10695662.1996646101.searchclickresult.43bf3e75uTcoXB - 文中所述方法的环境为:Windows 10、 已经准备好的Python 3.9使用环境。
二、安装aliyun-python-sdk-core
cmd 命令窗口下执行 pip3 install aliyun-python-sdk-core
E:\python\pm_py>pip3 install aliyun-python-sdk-core
出现类似“Successfully installed aliyun-python-sdk-core-2.13.35”说明安装成功。
三、安装aliyun-python-sdk-rds
cmd 命令窗口下执行 pip3 install aliyun-python-sdk-rds
E:\python\pm_py>pip3 install aliyun-python-sdk-rds
出现类似“Successfully installed aliyun-python-sdk-rds-2.5.11”说明安装成功。
四、运行get_rds_backup.py脚本文件
参考以下标准命令,运行get_rds_backup.py脚本文件。
python get_rds_backup.py [$RDS_ID] [$Access_Key_ID] [$Access_Key_Secret] [$Backup_Dir]
说明:
[RDS_ID]:目标RDS实例的ID,可在RDS实例的基本信息页面查看。比如“rm-hp38xxxxxx2i07”。
[Access_Key_ID]:RAM用户的密钥ID。如果您还没有RAM用户,请参见创建RAM用户创建。
[Access_Key_Secret]:RAM用户的密钥。
[Backup_Dir]:期望保存备份的目录,确保剩余足够的磁盘空间,以免下载失败。
默认下载前一天的备份。如果您需要修改时间范围,可修改脚本中对应的starttime和endtime变量值。
注意事项:
4.1 RDS_ID 的获取
登录阿里云,在实例列表中,点击复制即可。
4.2 Access_Key_ID Access_Key_Secret和获取
登录阿里云后,在右上角用户账号图像处理点击 ,再点击 AccessKey管理,即可看到。
4.3 get_rds_backup.py 改动
阿里技术博文的get_rds_backup.py适用于Python 2.7,而我们的Python环境是3.9,需对下载的文档进行修改。具体有
1)print语句加上括号。
2)import包需要替换,import urllib2 在Python 3 中变成 import urllib.error 和 import urllib.request。
3)获取文件长度的方法由bak_size = int(jsload[‘TotalBackupSize’]) 变成 bak_size = int(jsload[‘TotalBackupSize’])
具体修成完成后的代码参考如下。 下载链接:
# zhanghc python 学习文件
# 开发时间:2021-09-15 12:48
# !/usr/bin/env python
import datetime
import json
import sys
import urllib.error
import urllib.request
from aliyunsdkcore import client
from aliyunsdkrds.request.v20140815.DescribeBackupsRequest import DescribeBackupsRequest
if (len(sys.argv) != 5):
print ('use help:')
print ('''
get_rds_backup.py rm-xxxxxxx xxxxxxx xxxxxxxxx /mnt/
get_rds_backup.py RDS实例ID key secret 备份保存位置
key: Access Key ID
secret:Access Key Secret
默认下载昨天的备份,时间可以修改,对应脚本中的变量 starttime 和 endtime
''')
sys.exit(0)
key = sys.argv[2]
key_secret = sys.argv[3]
rds_id = sys.argv[1]
back_path = sys.argv[4]
#back_path = "/mnt/"
yesterday = str(datetime.date.today() + datetime.timedelta(days=-1))
today = str(datetime.date.today())
starttime = yesterday + "T00:00Z"
print (yesterday,today)
endtime = today + "T00:00Z"
#key = ''
#key_secret = ''
region = "cn-qingdao"
#rds_id = ['rmmhlc,'rm-mc']
def download_rds_backfile(instanceid):
clt = client.AcsClient(key, key_secret, region)
req_bakup = DescribeBackupsRequest()
req_bakup.set_DBInstanceId(instanceid)
req_bakup.set_accept_format('json')
req_bakup.set_StartTime(starttime)
req_bakup.set_EndTime(endtime)
backup = clt.do_action_with_exception(req_bakup)
# print (backup)
jsload = json.loads(backup)
num = jsload["PageRecordCount"]
print ("backfiles:" + str(num))
i = 0
while i < num:
bak_url = jsload["Items"]["Backup"][i]["BackupDownloadURL"]
bak_host = jsload["Items"]["Backup"][i]["HostInstanceID"]
bak_id = jsload["Items"]["Backup"][i]["BackupId"]
print ("BackupId:" + str(bak_id), "HostInstanceID:" + str(bak_host), "downloadurl:" + bak_url)
save_name = back_path + bak_url.split('?')[0].split('/')[-1]
u = urllib.request.urlopen(bak_url)
# u = urllib.request.urlopen(bak_url).read()
f_header = u.info()
# bak_size = int(f_header.getheaders("Content-Length")[0])
bak_size = int(jsload['TotalBackupSize'])
print ("backup file size: %s M ,fime nema: %s" % (bak_size / 1024 / 1024, save_name))
with open(save_name, "wb") as f:
file_size_dl = 0
block_sz = 8192
j = 1;
while True:
buffer = u.read(block_sz)
if not buffer:
break
file_size_dl += len(buffer)
f.write(buffer)
status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / bak_size)
# status = status + chr(8) * (len(status) + 1)
if ((file_size_dl / bak_size) >= j): # 判断进度每前进1%,进行一次进度信息输出。
print (status)
j = j + 1
i = i + 1
print ("download complet!")
download_rds_backfile(rds_id)
4.4 CMD下测试是否可以正常下载
在cmd命令窗口输入如下的命令:
python get_rds_backup.py rm-m5ek8sk8s433uzhd7q1 LTAI5tLkk8sYUEb89qC BZaqix98DtWpsXkjlloqhf3ti E:\
如果能输出 BackupId:1*****9 HostInstanceID 信息,说明程序可以正常执行。
五、创建bat脚本文件
用文本编辑器,录入如下类似内容,另存为bat文件。 最后一行的 >>baklog.txt,是将执行结果输出到txt文件,记录执行过程。
E:
cd \python\pm_py
python get_rds_backup.py rm-m5ksk8sk8s1 LTAI4k8sk8sk8s9qC BZaqik8sk8sk8sti E:\ >> baklog.txt
六、创建Windows定时任务
在windows开始程序中找到并打开任务计划程序。
新建一个定时任务
在计划任务列表中可以看到计划任务的基本信息,例如上次运行时间,下次运行时间等。