PythonのMySQLのアリクラウドバックアップファイルは、ローカルおよびバイナリログにダウンロード

直接コードに#騒ぎ、。あなたは良いアイデアを持って、あなたがメッセージを残すことができます!一緒に進行状況を議論します!

ミッション:

       一緒に仕事、一緒に進行!



#!は/ usr / binに/ pythonの
#コーディング= UTF-8

輸入JSON
輸入OS
輸入日時
インポートurllibは
aliyunsdkcoreインポートクライアントから
aliyunsdkrds.request.v20140815.DescribeBackupsRequestインポートDescribeBackupsRequestから
aliyunsdkrds.request.v20140815.DescribeBinlogFilesRequest輸入DescribeBinlogFilesRequestのから


クラスPullBackupfile() :
デフ__init __(自己、accessid、キー、地域、インスタンスID):
self.accessid = accessid
self.key =キー
self.region =地域
self.instanceid =インスタンスID
#自动创建备份目录
デフます。mkdir(自己):
今=日時。 date.today() - datetime.timedelta(日= 1)
=パス'D:\ databack \ S%' %今
のData_Path os.path.join =(パス、 'データ')
bin_log_path os.path.join =(パス、 'バイナリログ')
path_listは= [パスのData_Path、bin_log_path]
path_listはで私のために:
os.path.isdir(I)のIF:
続行
他:
os.popen、( '%S MKDIR' %Iは)
のData_Path、bin_log_path戻る

:DEFログイン(セルフ)
CLT = client.AcsClient(self.accessidを、 self.key、self.region)
CLTを返す

#アリクラウドデータがUTC時刻として返さので、あなたは東部時間で8つの地区に変換したいです。2013-08-15T12:00:2013年8月15日の午前20時00分00秒で00Z北京時間。
BACKUP_TIME DEF(セルフ、名):
今datetime.datetime.now =()
ゼロ
END_TIME =今- datetime.timedelta(時間= now.hour + 8、分= now.minute、秒= now.second、
マイクロ秒= now.microsecond)
のstart_time = END_TIME - datetime.timedelta(日= 1)
时间格式不相同
場合、名前== 'データファイル':
STARTTIME = start_time.strftime( '%Y-%M-%のdT%H:%MZ')
ENDTIME = end_time.strftime( '%Y-%M-%のdT%H:% MZ ')
場合、名前== 'バイナリログ':
STARTTIME = start_time.strftime(' %Y-%M-%のdT%H:%のM:%のSZ ')
ENDTIME = end_time.strftime(' %Y-%M-% dT%のH:%のM:%のSZ ')
戻りSTARTTIME、終了時刻


デフdownload_rds_backfile(自己):
DATA_PATH、bin_log_path = self.mkdir()
STARTTIME、終了時刻= self.backup_time( '・データ・ファイル')
してみてください:
req_bakup = DescribeBackupsRequest()
req_bakup.set_DBInstanceId(self.instanceid)
req_bakup.set_accept_format( 'JSON')
req_bakup.set_StartTime(STARTTIME)
req_bakup.set_EndTime(終了時刻)
CLT = self.login()
バックアップ= clt.do_action_with_exception(req_bakup)
jsload = json.loads(バックアップ)
NUM = jsload [ "PageRecordCount"]
印刷( "バックファイル:" + STR(NUM))
I = 0
back_path = os.path.join(DATA_PATH、 '')
iが<ながらA:

bak_url = jsload [ "アイテム"] [ "バックアップ"] [i]の[ "BackupDownloadURL"]
bak_host = jsload [ "アイテム"] [ "バックアップ"] [i]の[ "HostInstanceID"]
bak_id = jsload [ "アイテム"] 【 "バックアップ"] [I] [ "BACKUPID"]
印刷( "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)
f_header = u.info()
プリント(f_header)
bak_size = INT(f_header [ "コンテンツ長" ])

印刷( "バックアップファイルサイズ:%S M、FIMEのNEMA:%S"%(bak_size / 1024/1024、SAVE_NAME))

Fとしてオープン(SAVE_NAME、 "WB"を持ちます):

file_size_dl = 0
block_sz = 8192
真つつ:
バッファー= u.read(block_sz)
バッファリングされていない場合:
ブレーク

file_size_dl + = LEN(バッファ)
f.write(バッファ)
ステータス= R "%10D [%3.2f %%" % (file_size_dl、file_size_dl * 100 / bak_size)
ステータス=ステータス+ CHR(8)*(LEN(ステータス)+ 1)
印刷(ステータス)
I = I + 1枚
の印刷( "ダウンロードのcomplet!")
を除い:
印刷(」无备份」)


#备份ビンログ下载到本地服务器
デフdownload_rds_binlog(自己):
DATA_PATH、bin_log_path = self.mkdir()
プリント(bin_log_path)
STARTTIME、終了時刻= self.backup_time( 'ビンログ')
試してみてください。
要求= DescribeBinlogFilesRequest()
request.set_DBInstanceId(自己.instanceid)
request.set_accept_format( 'JSON')
request.set_StartTime(STARTTIME)
request.set_EndTime(終了時刻)
CLT = self.login()
binlog_backup = clt.do_action_with_exception(リクエスト)
jsload = json.loads(binlog_backup)
NUM = jsload [ "TotalRecordCount"]
プリント( "バックファイル:" + STR(NUM))
I = 0
back_path = os.path.join(bin_log_path、 '')
プリント(back_path)
中にI <NUM:
bak_url = jsload [ "アイテム"] [ "BinLogFile"] [I] [ "DownloadLink"]
bak_host = jsload [ "アイテム"] [ "BinLogFile"] [I] [ "HostInstanceID"]
bak_name = jsload [ "アイテム"] [ "BinLogFile"] [I] [ "ログファイル名"]
bak_size = jsload [ "アイテム"] [ "BinLogFile"] [I] [ "ファイルサイズ"]
bak_time = datetime.datetime.strptime(jsload [ "アイテム"] [ "BinLogFile"] [I] [ 'LogEndTime']、」 %Y-%M-%のdT%H:%のM:%のSZ ')
#プリント( "ログファイル名:" + STR(bak_name)、 "HostInstanceID:" + STR(bak_host)、 "downloadurl:" + bak_url)
SAVE_NAME = back_path + bak_name + '_' + STR(bak_time).replace(」」、 '')( ':'、 '')に取って代わる代わる。( ' - '、 '')。
印刷(「バックアップファイルのサイズ:%S M、FIMEのNEMA:%S」%(bak_size / 1024/1024、SAVE_NAME))
オープンと(SAVE_NAME、 "WB")Fとして
urllib.request.urlretrieve(bak_url、SAVE_NAME)
I = I + 1枚の
印刷( "ダウンロードのcomplet!")
を除い:
プリント( '无备份')
删除超过7天的文件夹及子目录、窓命令
デフREMOVE_FILE(自己):
os.popen( 'forfiles / P "D:\ databack" / D -7 / C "CMD / Cエコー消去@path ... && RD @path / S / Q" ")

もし__name__ == '__main__':
pull_file = PullBackupfile( 'accessid'、 'キー'、 '領域'、 'インスタンスID')
    pull_file.download_rds_backfile()
pull_file.download_rds_binlog()
pull_file.remove_file()

おすすめ

転載: www.cnblogs.com/leeInvisible/p/11582608.html