实现日常下载云数据库备份文件到本地保存的最佳实践

2020-03-05 18:32:05 浏览数 (1)

导读

“在腾讯云团队协助下,经过7x24小时的努力,微盟数据已经全面找回,并且公布商家赔偿计划。”--刷爆朋友圈的信息

科技界的圈子并不小,承包朋友圈,也可承包微博热搜。微博字数有限,仅仅能看到事情结果。朋友圈的公众号有详细叙述事情起伏经过,看得人心潮澎湃。

腾讯云团队在此次数据恢复中表现的硬核技术实力,是我们透过众多公关文必须看到的东西。抛开一个个租赁的计费账单,这也是云厂商真正的价值所在之一。

当然,令人激动的消息并不是事情的结束。微盟事件后,所有人开始积极思考,该做哪些事情提高系统数据安全。

权限账户分级、数据容灾、法律严惩等讨论近期也是不少。

思路推进,自然考虑使用各云厂商提供的各种数据安全解决方法。

例如腾讯云数据库,本身提供高可用架构的同时,也提供完备的周期自动备份方案。如果使用的是云数据库,那么日常备份的任务无需额外的操作。

当前最完备的系统安全方案中,一定有一条最安全的方法,是保证云数据库每日全量与增量数据完整备份的同时,保存1到n份副本到本地或其他储存介质中,并且定期检查备份可用,做周期的备份恢复演习。

当然各云厂商已经烙好了大饼,切好了小块,最后每一口还是要自己张嘴吃的。


本文解决其中一个最叶子结点的小事情,以实现能够保存多份备份副本到本地或其他存储介质中。

即以云数据库CDB for Mysql 为例,通过云API 接口实现自动下载全量备份文件和binlog日志到本地服务器。

实现方法大纲如下:

1. 安装开发工具集(SDK)环境

2. 使用api 3.0 explorer 调用腾讯云API 3.0 接口,快速生成SDK代码

3. 编写语言脚本,截取有效备份文件下载链接

4. 调用接口实现下载

文末提供python 代码示例,供腾讯云用户参考使用。


下面通过示例阐述操作步骤,示例语言python。

步骤 1.安装SDK,可选语言包括Python,Java,PHP,Go等。下载链接请查看:https://github.com/TencentCloud

点击链接下载 Tencent Cloud SDK 3.0 for Python 的zip 包,并且根据页面提示的步骤安装SDK环境。 https://github.com/TencentCloud/tencentcloud-sdk-python

root@VM_93_197_centos ~# mkdir /sdk_python

root@VM_93_197_centos ~# cd /sdk_python

root@VM_93_197_centos sdk_python# ls

tencentcloud-sdk-python-master.zip

root@VM_93_197_centos sdk_python# unzip tencentcloud-sdk-python-master.zip

root@VM_93_197_centos sdk_python# cd tencentcloud-sdk-python-master/

root@VM_93_197_centos tencentcloud-sdk-python-master# python setup.py install

步骤 2. 使用腾讯云API 3.0 explorer 工具,调用接口DescribeBackups(查询数据备份文件列表)获得备份文件的内/外网下载地址,并生成SDK可执行代码。

在腾讯云提供的API 3.0 explorer 工具页面,根据提示信息,填写必要参数,即可在线调用测试参数和接口。

云API 3.0 explorer 地址:https://console.cloud.tencent.com/api/explorer?Product=cdb&Version=2017-03-20&Action=DescribeBackups&SignVersion=

接口DescribeBackups 参考文档:https://cloud.tencent.com/document/product/236/15842

参数说明 (官方文档中亦有):

个人秘钥:安全凭证,包括 SecretId 和 SecretKey

Region: 实例所在地域,例如华东地域(上海)

InstanceId: 实例的标识ID,例如cdb-abcdefg

Offset: 偏移量,例如0

Limit: 分页大小,例如1

注意事项:

用户必须严格保管安全凭证,避免泄露,否则将危及财产安全。如已泄漏,请立刻禁用该安全凭证。

附:申请安全凭证的具体步骤如下:

  1. 登录 腾讯云管理中心控制台。
  2. 前往 云API密钥 的控制台页面。
  3. 在 云API密钥 页面,单击【新建密钥】即可以创建一对密钥。

使用API 3.0 explorer 操作图示:

点击【在线调用】测试参数和接口点击【在线调用】测试参数和接口
点击【代码生成】快速获得可执行代码点击【代码生成】快速获得可执行代码

步骤 3.

复制云api explorer 生成的python 代码到SDK环境中,不需要任何改动,运行即可获得接口DescriberBackups 的调用结果。

root@VM_93_197_centos v20190711# python /API/Mysql/backup.py

{"TotalCount": 14, "RequestId": "050382e1-exxx-41cb-a510-xxxxx89c", "Items": [{"Status": "SUCCESS", "FinishTime": "2020-02-28 09:06:21", "Name": "xxxxxxbackup_20200228000511.xb", "Creator": "SYSTEM", "IntranetUrl": "https://mysql-database-backup-sh-xxxxxxxxFoctet-stream", "InternetUrl": "https://mysql-database-backup-sh-xxxxxxxFoctet-stream", "Date": "2020-02-28 09:06:17", "BackupId": 157109760, "Type": "physical", "Size": 1818642237}]}

前3步均不需要任何代码能力,简单实用。

步骤4.

需要编写脚本实现自动下载。

基本实现方法为:云api 接口输出json格式,包含备份文件的下载链接intraneturl。通过python脚本截取有效的url, 并且通过调用wget 进行下载。更多文件路径和备份文件管理的逻辑可以根据需要修改添加。

步骤5. 重复1-4步,实现binlog文件查看以及下载。

其中使用接口DescribeBinlogs(查询二进制日志备份文件列表)获得binlog文件的内/外网下载地址

接口DescribeBinlogs 参考文档:https://cloud.tencent.com/document/api/236/15843


本文提供完整的python 代码示例,供参考。可实现下载备份文件以及binlog日志。完整代码请查看文末。

代码使用方法:

1. 修改secretId、secredKey、region、instanceIds列表,其中多个instanceId使用逗号分隔。

参数i,j 设定每个实例下载的备份数量。例如,设置i=0,j=2 即下载每个实例最新的2个备份/binlog增量日志。

2. 在备份目录下运行脚本,即可下载多个实例的最新备份文件/日志binlog文件到当前目录下。

示例:

root@VM_93_197_centos CDB# pwd

/Backups/CDB

root@VM_93_197_centos CDB# python /API/Mysql/cdb_backup.py

start to download the backup of cdb-xxxx

100% .......................................................................... 1179758 / 1179758

...

root@VM_93_197_centos CDB# ls -lrt

total 4640

-rw-r--r-- 1 root root 1180947 Mar 3 23:35 cdb182xx_backup_20200303000425.xb

-rw-r--r-- 1 root root 1180950 Mar 3 23:35 cdb182xx_backup_20200302000428.xb

-rw-r--r-- 1 root root 1179759 Mar 3 23:35 cdb184xx_backup_20200303000458.xb

-rw-r--r-- 1 root root 1179758 Mar 3 23:35 cdb184xx_backup_20200302000459.xb

root@VM_93_197_centos CDB#

root@VM_93_197_centos CDB# python /API/Mysql/cdb_binlog.py

start to download the backup of cdb-xxx

100% ........................................................................ 353 / 353

...

root@VM_93_197_centos CDB# ls -lrt

total 16

-rw-r--r-- 1 root root 353 Mar 4 00:21 cdb184xx_binlog_mysqlbin.000002

-rw-r--r-- 1 root root 241 Mar 4 00:21 cdb184xx_binlog_mysqlbin.000003

-rw-r--r-- 1 root root 848 Mar 4 00:21 louxxx_binlog_mysqlbin.000016

-rw-r--r-- 1 root root 848 Mar 4 00:21 louxxx_binlog_mysqlbin.000015


Python 完整代码示例

///cdb_backup.python 完整代码

# -*- coding: utf-8 -*-

from tencentcloud.common import credential

from tencentcloud.common.profile.client_profile import ClientProfile

from tencentcloud.common.profile.http_profile import HttpProfile

from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException

from tencentcloud.cdb.v20170320 import cdb_client, models

import json

import os

import wget

# Please modify with your own Key.

secretId=""

secretKey=""

# The region of your instance locates in.

region=""

# Seperate instance IDs with comma ","

instanceIds = ["",""

# defind how many backups to get,i=offset,j=limit

i =

j =

# Get the result of DescriberBackup

def GetUrlofBackups(each_instance):

try:

cred = credential.Credential(secretId,secretKey)

httpProfile = HttpProfile()

httpProfile.endpoint = "cdb.tencentcloudapi.com"

clientProfile = ClientProfile()

clientProfile.httpProfile = httpProfile

client = cdb_client.CdbClient(cred, region, clientProfile)

req = models.DescribeBackupsRequest()

params = {"InstanceId":each_instance,"Offset":i,"Limit":j}

param = json.dumps(params)

req.from_json_string(param)

resp = client.DescribeBackups(req)

url_output = resp.to_json_string()

result = json.loads(url_output)

return result

except TencentCloudSDKException as err:

print(err)

# start to download the backups of each instance

for ID in instanceIds:

try:

backupresult = GetUrlofBackups(ID)

for each_result in backupresult["Items"]:

url = each_result["IntranetUrl"]

notification="start to download the backup of " ID

print(notification)

wget.download(url)

except TencentCloudSDKException as err:

print(err)


///cdb_binlog.python 完整代码

from tencentcloud.common import credential

from tencentcloud.common.profile.client_profile import ClientProfile

from tencentcloud.common.profile.http_profile import HttpProfile

from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException

from tencentcloud.cdb.v20170320 import cdb_client, models

import wget

import json

import os

# Please modify with your own Key.

secretId=""

secretKey=""

# The region of your instance locates in.

region=""

# Seperate instance IDs with comma ","

instanceIds = ["",""]

# defind how many backups to get,i=offset,j=limit

i =

j =

# Get the result of DescribeBinlogs

def GetUrlofBinlog(each_instance):

try:

cred = credential.Credential(secretId,secretKey)

httpProfile = HttpProfile()

httpProfile.endpoint = "cdb.tencentcloudapi.com"

clientProfile = ClientProfile()

clientProfile.httpProfile = httpProfile

client = cdb_client.CdbClient(cred, region, clientProfile)

req = models.DescribeBinlogsRequest()

params = {"InstanceId":each_instance,"Offset":i,"Limit":j}

param = json.dumps(params)

req.from_json_string(param)

resp = client.DescribeBinlogs(req)

DescribeBinlog = resp.to_json_string()

result = json.loads(DescribeBinlog)

return result

except TencentCloudSDKException as err:

print(err)

# start to download the binlog of each instance

for ID in instanceIds:

try:

binlogresult = GetUrlofBinlog(ID)

for each_result in binlogresult["Items"]:

url = each_result["IntranetUrl"]

notification="start to download the backup of " ID

print(notification)

wget.download(url)

except TencentCloudSDKException as err:

print(err)

0 人点赞