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开始程序中找到并打开任务计划程序。
在这里插入图片描述
新建一个定时任务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在计划任务列表中可以看到计划任务的基本信息,例如上次运行时间,下次运行时间等。
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值