python:mysql增量备份
模块:MySQLdb Crypto加密 ConfigParser加载配置
mydb.py
#!/usr/bin/env python
#coding=utf-8
import MySQLdb as mdb
from Crypto.Cipher import AES #算法
key = '0x7jz75nmrjx5k52lcqpybm12b1frbmn'
iv='1234567812345678'
BS = 16
pad = lambda s: s + (BS - len(s) % BS) * '\0' #加密
def encrypt(text):
aes_obj = AES.new(key, AES.MODE_CBC,iv)
buf=aes_obj.encrypt(pad(text)).encode('hex')
return buf
#解密
def decrypt(text):
aes_obj = AES.new(key, AES.MODE_CBC,iv)
buf=aes_obj.decrypt(text.decode('hex'))
return buf
#生成insert语句,从mysql自带的information_schema库中获取字段
def genSchema(host,user,passwd,table,*keys):
dbname = "information_schema"
con = None
sqlSel = "select column_name from columns where table_name='"+table+ "'"
con = mdb.connect(host=host,user=user,passwd=passwd,db=dbname,charset="utf8", unix_socket="/data/mysql/data/mysql.sock");
cur = con.cursor()
cur.execute(sqlSel)
rows = cur.fetchall()
insert =""
update =""
for row in rows:
txtRow = ""
insert = insert+ row[0] +","
if(row[0] == keys[0] or row[0] == keys[1]):
continue
else:
update = update +row[0]+"=values("+row[0]+"),"
fieldsIn = insert.rstrip(",")
fieldsUpdate = update.rstrip(",")
if con:
con.close()
sqlPre = "insert into " + table + " (" + fieldsIn + ") values ("
sqlLast = ") on duplicate key update " + fieldsUpdate
f=open('struc%s.txt'%table,'w')
f.write(sqlPre+"\n")
f.write(sqlLast+"\n")
f.close()
#获取insert语句
def getSchema(table):
f=open('struc%s.txt'%table)
index = 0
sqlInsert = ""
sqlUpdate = ""
while True:
line = f.readline()
if len(line) ==0:break
if(index == 0):
sqlInsert =line.rstrip("\n")
if(index == 1):
sqlUpdate = line.rstrip("\n")
index = index+1
return (sqlInsert, sqlUpdate)
syncData.py
#!/usr/bin/env python
#coding=utf-8
import os
import sys
import time
import types
import MySQLdb as mdb
import ConfigParser
from mydb import genSchema
from mydb import getSchema
from mydb import encrypt
from mydb import decrypt reload(sys)
sys.setdefaultencoding('utf8') if __name__ == '__main__':
if (len(sys.argv)<2):
print sys.argv[0],' export|import start end'
sys.exit(1)
method=sys.argv[1] start = ""
end = ""
myday = '2018-01-01'
if(len(sys.argv)==4):
start = sys.argv[2] + " 00:00:00"
end = sys.argv[3] + " 23:59:59"
else:
myday= time.strftime('%Y-%m-%d',time.localtime(time.time()-24*3600))
#myday = '2018-12-10'
start = myday+" 00:00:00"
end = myday+" 23:59:59" #加载config.ini
config = ConfigParser.ConfigParser()
config.readfp(open("config.ini","rb")) fromHost = config.get('cloud_blacklist',"host")
fromUser = config.get('cloud_blacklist',"user")
fromPass = decrypt(config.get('cloud_blacklist',"pass")).replace("\x00","")
toHost = config.get('boxing_blacklist',"host")
toUser = config.get('boxing_blacklist',"user")
toPass = decrypt(config.get('boxing_blacklist',"pass")).replace("\x00","") dbname = "blacklist"
con = None
Blacklistbackup = {
'black_record':['id','uuid'],
'temp_black_record':['id']
}
#从阿里云导出
if(method == 'export'):
for key in Blacklistbackup:
try:
Lenth = len(Blacklistbackup[key])
if Lenth == 2:
genSchema(fromHost,fromUser,fromPass,key,Blacklistbackup[key][0],Blacklistbackup[key][1])
elif Lenth == 1:
genSchema(fromHost,fromUser,fromPass,key,Blacklistbackup[key][0],key,Blacklistbackup[key][0])
con = mdb.connect(host=fromHost,user=fromUser,passwd=fromPass,db=dbname,charset="utf8", unix_socket="/data/mysql/data/mysql.sock");
cur = con.cursor()
sqlSel = "SELECT * from %s where update_at between '"%key+start+"' and '"+end+ "'"
print sqlSel
cur.execute(sqlSel)
rows = cur.fetchall()
f=open('data%s.txt'%key,'w')
indexNum = 0
for row in rows:
txtRow = ""
for field in row:
if(type(field) is types.UnicodeType):
field1=field.replace(chr(10), "")
txtRow += field1+"|||"
elif(type(field) is not types.StringType):
txtRow += str(field)+"|||"
else:
txtRow += field+"|||"
line=txtRow.rstrip("|||")
f.write(line+"\n")
indexNum = indexNum+1
f.close()
print "export %s totals="%key+str(indexNum)
except Exception as e:
print e
finally:
if con:con.close() #导入博兴kvm
if(method == 'import'):
for key in Blacklistbackup:
try:
(preSql,lastSql) = getSchema(key)
con = mdb.connect(host=toHost,user=toUser,passwd=toPass,db=dbname,charset="utf8",unix_socket="/data/mysql/data/mysql.sock");
cur = con.cursor()
f=open('data%s.txt'%key)
index = 0
uuid=""
while True:
line=f.readline().rstrip("\n")
if len(line) ==0:break
array = line.split("|||")
values=""
for aa in array:
if(aa.isdigit()):
values += str(aa)+","
elif(aa=='None'):
values += "NULL,"
else:
values += "'"+aa.replace("'","\\\'")+"',"
uuid=array[1]
myvalues=values.rstrip(',')
sqlInsert = preSql + myvalues + lastSql
index=index+1
cur.execute(sqlInsert)
if(index % 100 == 0):
con.commit()
con.commit()
f.close()
print "totals %s import="%key+str(index)
except Exception as e:
print e
print uuid
finally:
if con:
con.close()
mail.py
#!/usr/bin/env python
#coding=utf-8
from email.mime.text import MIMEText
import smtplib
import os
from mydb import decrypt def mail():
mail_host = 'smtp.intellicredit.cn'
mail_user = 'xxxxxxx@intellicredit.cn'
mail_pass = decrypt('加密后的密码').replace("\x00","")
sender = 'xxxxxxx@intellicredit.cn'
receivers = ['zhangshun@intellicredit.cn']
temp_black_record = os.popen('cat sync.log |grep temp_black_record|tail -3').read() #黑名单temp_black_record表增量备份
black_record = os.popen('cat sync.log |grep black_record|grep -v temp_black_record|tail -3').read() #黑名单black_record表增量备份
message = MIMEText('%s%s'%(temp_black_record,black_record),'plain','utf-8')
message['Subject'] = '黑名单数据增量备份'
message['From'] = sender
message['To'] = receivers[0]
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host,25)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender,receivers,message.as_string())
smtpObj.quit()
except Exception as e:
print(e)
if __name__ == '__main__':
mail()
config.ini
[cloud_blacklist]
host=1.1.1.1
user=user
pass=加密后的passwd [boxing_blacklist]
host=1.1.1.1
user=user
pass=加密后的passwd [general]
mailUser=xxxxxxx@intellicredit.cn
mailPass=加密后的passwd
mailHost=smtp.intellicredit.cn
[security]
mailUser=xxxxxxx@intellicredit.cn
mailPass=加密后的passwd
mailHost=smtp.intellicredit.cn
python:mysql增量备份的更多相关文章
- innobackupex做MySQL增量备份及恢复【转】
创建备份用户 mysql> grant process,reload,lock tables,replication client on *.* to 'backup'@'localhost' ...
- MYSQL数据库自动本地/异地双备份/MYSQL增量备份
构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是 ...
- windows下mysql增量备份与全备份批处理
win下的全备批处理 批处理用于游戏服务器,经过严格测试,且正式使用,主要用来完全备份数据库,当然.这只是将数备份出来 ,至于如何将备份出来的数据远程传送的远程服务器上可以调用ftp的功能,此脚本并未 ...
- mysql增量备份 percona-xtrabackup
先说下实际环境 阿里云买的ESC跑的mysql服务,目前由于数据量过大,数据库目前有800多GB,每次全备需要等20多个小时才能够完成,然后就想到做增量备份,写下此文档 一.测试环境 [root@lo ...
- 【转】mysql增量备份恢复实战企业案例
来源地址:http://seanlook.com/2014/12/05/mysql_incremental_backup_example/ 小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但 ...
- mysql增量备份脚本
#!/bin/sh ############################### # 此脚本用来增量备份 # 此文件名:mysqldailybackup.sh # # Author: zhangro ...
- mysql增量备份(2/2)
前言 这是在百度文库里看到的文章,原名叫做<MYSQL 完全与增量备份及恢复文档 >,是关于完全备份和增量备份以及恢复文档的...... 文档介绍 本文档采用 mysqldump 对数据 ...
- mysql增量备份(1/2)
转自:http://www.centos.bz/2012/11/mysql-incremental-backup/ 小量的数据库我们可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,我们 ...
- Mysql 增量备份和全量备份
全量备份: # vim /root/DBFullyBak.sh //添加以下内容 #!/bin/bash # Program # use mysqldump to Fully backup mysql ...
随机推荐
- TTM-To the moon
传送门 查询历史版本,回到历史版本,这个题目显然是用主席树,好像就没了! 但是这里的修改是区间修改,众所周知主席树的空间复杂度是\(nlog(n)\)的,区间修改会导致主席树的开点到达一个相当恐怖的数 ...
- JIRA中的标记语言的语法参考
前言 看到网上有的文章说JIRA是使用Textile这门标记语言,有些语法和Wikitext和Markdown相像.JIRA在2017年进行了一次大更新,某些语法可能和以前不大一样,这里纪录一下常用的 ...
- 自己开发shell脚本实现一键化安装。
一.说明在现实环境中可能需要批量部署服务器,那么在我们已经部署好一台服务以后如果实现剩下的服务批量安装呢: 使用shell能否实现功能: 假设我们要部署lamp或者是lnmp如何实现脚本部署? 使用以 ...
- 正则表达式匹配URL——给URL地址加上<a> 链接
<?php function replace_url ($content) { if (empty($content)) return; //给URL地址加上 <a> 链接 $pre ...
- Nginx 开启多核cpu配置
nginx默认是没有开启利用多核cpu的配置的.需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu; 需要在nginx配置里添加 worker_processes 和 or ...
- 一些JS基本小内容
获取select选中内容: 1.获取select表单内容 <select id="sel"> <option value="v1">1& ...
- CPU性能的评价
人们通常用benchmark 来衡量CPU的性能,常见的benchmark有dhrystone和coremark. 由于dhrystone 受编译器影响比较大,所以,结果不是很准确,现在大多采用cor ...
- 一样的Java,不一样的HDInsight大数据开发体验
大数据的热潮一直居高不下,每个人都在谈.你也许不知道,早些年这个领域可是有个非常「惹眼球」的段子: 1首先开始科普 什么是 HDInsight Azure HDInsight 是 Hortonwork ...
- spring 上传附件
jsp: <form class='uk-form' action="savelead" method="post" enctype="mult ...
- POJ 2104 K-th Number (区间第k大)
题意:给定一个序列A,接下来又m个询问,每个询问输出A[L,R]中的第K大.(保证第k大存在) 思路: 我想拿来练习“可持久化线段树”的,搜到这个比较巧的算法也可以解决这个问题,叫“归并树?.大概的思 ...