mysql 备份

#!/usr/bin/env python
# --*-- coding:UTF-8 --*--

import sys
import os
import datetime
import smtplib
from email.mime.text import MIMEText
import MySQLdb
import tarfile
import socket
import subprocess
from datetime import datetime, date, timedelta
import datetime
backup_dir='/data/backup/'
remote_dir='/data/backup/'
mysql_dump='/usr/local/bin/mydumper'
date_tab=datetime.datetime.now().strftime("%Y_%m_%d_%H_%M")
date_day=datetime.datetime.now().strftime("%Y_%m_%d")
ssh_avg='''ssh -o PubkeyAuthentication=yes -o stricthostkeychecking=no -lcjdb -p22 -i /usr/local/bin/id_rsa'''
remote_ip='1.1.1.1' #异地备份IP
port='35500'
backup_logs='/data/backup/data_backup.log'
backup_location= backup_dir + date_day
hostname = socket.gethostname()
rsync='/usr/bin/rsync'
#定义邮箱变量
mail_host = 'smtp.163.com'
Port = 465
mail_user = 'send@163.com'
mail_pass = 'password'
to_list= 'receive@qq.com'
file_upload="数据MD5验证有误"
data_dump="数据dump"
data_conection="数据库连接"

def mail_send(*argv):
"""邮件内容定义函数发送"""
try:
msg = MIMEText('数据库备份失败!,数据库机器:%s 原因: %s' % argv)
msg['Subject'] = ('备份失败!')
msg['From'] = mail_user
msg['To'] = to_list
send_smtp = smtplib.SMTP_SSL()
send_smtp.connect(mail_host)
send_smtp.login(mail_user, mail_pass)
send_smtp.sendmail(mail_user, to_list, msg.as_string())
send_smtp.close()
except Exception, e:
print e
print '邮件发送失败!!!'

def env_check():
if os.path.exists(backup_location) == True:
os.system('rm -rf %s' % backup_location)
os.makedirs(backup_location)
else:

os.makedirs(backup_location)
def upload_file():
receive_file=backup_data()
rsync_tran=rsync + " --bwlimit=50240 -stats -vave '%s' %s %s:%s" % (ssh_avg,receive_file[0], remote_ip,remote_dir)
os.system(rsync_tran)
remote_file_shell=ssh_avg + " %s md5sum %s%s" % (remote_ip, backup_dir,receive_file[0] )
#对上传后的数据做MD5对比,保证异地备份的数据一致性。
remote_md5=subprocess.check_output(remote_file_shell,shell=True)
if receive_file[1] == remote_md5[0:33]:
print 'backup data upload transaction sucess'
else:
print 'backup data upload failure'
mail_send(hostname,file_upload)

def backup_data():
env_check()
os.chdir(backup_dir)
old_date=(date.today() + timedelta(days = -2)).strftime("%Y_%m_%d") #计算前两天的时间
old_file='rm -rf ' + old_date +'_*.tar.gz' #删除旧数据2天前的
os.system(old_file)
try:
db = MySQLdb.connect("127.0.0.1","root","passwd",charset='utf8')
cursor = db.cursor() #db连接转换成光标cursor
except Exception, e:
print "连接数据库失败"
mail_send(hostname,data_conection)

cursor.execute('show databases')
f = cursor.fetchall() #cursor执行变成一个元组。
cursor.close()
db.close()

for i in f:
db=list(i)
for backup in db:
if backup.startswith('logs'): #对db里面的数据库不做备份,其它的都备份
pass
elif backup.startswith("information_schema"):
pass
elif backup.startswith('performance_schema'):
pass
elif backup.startswith('mysql'):
pass
elif backup.startswith('sys'):
pass
else:
mysql_shell=mysql_dump + ' -G -R -E -C -c -t 10 -F 10000 -B ' + backup + ' -o ' + backup_dir + date_day + '/' + backup
print mysql_shell
result=os.system(mysql_shell)
check_file=backup_dir + date_day + '/' +backup + '/metadata'
if os.path.isfile(check_file) == False:
mail_send(hostname,data_dump)

os.chdir(backup_dir)
backup_full=date_tab + '_' + hostname + '.tar.gz'
tar = tarfile.open(backup_full,"w:gz") #把备份数据打成TAR.压缩包
for path,dir,files in os.walk(date_day):


for file in files:
fullpath = (os.path.join(path,file))
tar.add(fullpath)
tar.close()
delete='rm -rf %s' % date_day
os.system(delete) # 打包之后删除原文件数据
file_shell="md5sum " + backup_dir + backup_full #对打包数据做MD5计算
file_md5=subprocess.check_output(file_shell,shell=True)
md5_code=file_md5[0:33]


return backup_full,md5_code
#backup_data()
#md5_check()
#backup_failure()
if __name__ == '__main__':
upload_file()

posted @ 2019-10-25 18:56  石榴心  阅读(131)  评论(0编辑  收藏  举报