模块: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增量备份的更多相关文章

  1. innobackupex做MySQL增量备份及恢复【转】

    创建备份用户 mysql> grant process,reload,lock tables,replication client on *.* to 'backup'@'localhost' ...

  2. MYSQL数据库自动本地/异地双备份/MYSQL增量备份

    构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是 ...

  3. windows下mysql增量备份与全备份批处理

    win下的全备批处理 批处理用于游戏服务器,经过严格测试,且正式使用,主要用来完全备份数据库,当然.这只是将数备份出来 ,至于如何将备份出来的数据远程传送的远程服务器上可以调用ftp的功能,此脚本并未 ...

  4. mysql增量备份 percona-xtrabackup

    先说下实际环境 阿里云买的ESC跑的mysql服务,目前由于数据量过大,数据库目前有800多GB,每次全备需要等20多个小时才能够完成,然后就想到做增量备份,写下此文档 一.测试环境 [root@lo ...

  5. 【转】mysql增量备份恢复实战企业案例

    来源地址:http://seanlook.com/2014/12/05/mysql_incremental_backup_example/ 小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但 ...

  6. mysql增量备份脚本

    #!/bin/sh ############################### # 此脚本用来增量备份 # 此文件名:mysqldailybackup.sh # # Author: zhangro ...

  7. mysql增量备份(2/2)

    前言 这是在百度文库里看到的文章,原名叫做<MYSQL 完全与增量备份及恢复文档 >,是关于完全备份和增量备份以及恢复文档的...... 文档介绍 本文档采用 mysqldump  对数据 ...

  8. mysql增量备份(1/2)

    转自:http://www.centos.bz/2012/11/mysql-incremental-backup/ 小量的数据库我们可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,我们 ...

  9. Mysql 增量备份和全量备份

    全量备份: # vim /root/DBFullyBak.sh //添加以下内容 #!/bin/bash # Program # use mysqldump to Fully backup mysql ...

随机推荐

  1. js 判断当前操作系统 ios, android, 电脑端

    一 .   js判断移动端的操作系统(ios或Android) $(function () { var u = navigator.userAgent; var isAndroid = u.index ...

  2. SpringBoot | 启动异常 | 显示bulid success 无 error信息

    可能原因是没有添加 web 依赖,检查pom里面是否有web <dependency> <groupId>org.springframework.boot</groupI ...

  3. JMETER通过java代码通过代码/ JMETER API实现示例进行负载测试

    本教程试图解释Jmeter的基本设计,功能和用法,Jmeter是用于在应用程序上执行负载测试的优秀工具.通过使用jmeter GUI,我们可以根据我们的要求为请求创建测试样本并执行具有多个用户负载的样 ...

  4. CATIA 使用技巧--转换出轻巧的tif格式文件

    问题描述: 我们在与客户和供应商打交道的过程中经常需要TIF格式2D图纸文件,而默认的CATIA设置保存出来TIF文件非常大,不利于保存和传送.对于该问题,我们可以通过修改CATIA的默认设置选项,将 ...

  5. SpirngMVC-JSON

    Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包,如下: 配置json转换器 在注解适配器中加入messa ...

  6. JAVA常用知识总结(十四)——Servlet

    Servlet属于线程安全的吗? Servlet不是线程安全的! 谈谈转发和重定向的区别 请求转发: request.getRequestDispatcher("/king_l2lu.jsp ...

  7. js AES对称加密 16进制和base64格式

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. C#入门笔记1

    C#是用于创建要运行在.NET CLR上的应用程序的语言之一,从C和C++语言演化而来,是微软专门为使用.NET平台而创建的.优点:就是彻头彻尾为.NET Framework设计语言. C#能编写什么 ...

  9. .net 键盘

    private void txtGoodsGroup_KeyPress(object sender, KeyPressEventArgs e) { base.OnKeyPress(e); if ((i ...

  10. 【持续更新】HTML5 基础知识

    文档类型声明 <!DOCTYPE html> 必不可少,位于文件第一行. 字符编码 <meta charset="UTF-8"> 语义化标记元素 heade ...