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 ...
随机推荐
- echarts相关属性设置(2)--折线图和柱状图的结合使用
type:bar和line的组合 option = { { tooltip: { trigger: 'axis', axisPointer: { // type: 'shadow' }, // lab ...
- python 基础(十五) socket编程
SOCKET TCP协议: 有请求 有响应 称之为 tcp协议 是面向连接的协议 就是在收发数据之前 必须先要建立一个可靠的链接 三次握手 如:网站 UDP协议: 是一个非链接的协议 传输之前不需要键 ...
- Codeforces 1142A(性质、暴举)
队友和大佬都什么几种情况啥的……我是把终点都插了,起点随便选一个,暴举答案莽A. ; ll n, k, a, b, aa, minn = INF, maxx = -; set<ll> bb ...
- Linux下Java运行.class文件,报错找不到或无法加载主类
classpath配置的错误,所以找不到.class文件. 原先的etc/profile中的classpath配置 export CLASSPATH=$JAVA_HOME/lib/tools.jar ...
- 086 Partition List 分隔链表
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前.你应当保留两个分区中每个节点的初始相对位置.例如,给定1->4->3->2-&g ...
- D - 連結 / Connectivity 并查集
http://abc049.contest.atcoder.jp/tasks/arc065_b 一开始做这题的时候,就直接蒙逼了,n是2e5,如果真的要算出每一个节点u能否到达任意一个节点i,这不是f ...
- git(代码仓库)
第1章 git介绍 1.1 参数: 第2章 git管理一个项目 2.1 图示 2.2 cd /项目路径 2.3 git config --globle user.email "邮箱地址&q ...
- dispaly:none 和visibility :hidden的区别
display:none 通常被 JavaScript 用来在不删除元素的情况下隐藏或显示元素. 它和 visibility 属性不一样.把 display 设置成 none 元素不会占据它本来应该显 ...
- lowbit
树状数组(lowbit) Time Limit:1000ms Memory Limit:128MB 题目描述 这天,LYK在学习树状数组. 当它遇到一个叫lowbit的函数时有点懵逼.lowbit ...
- PaaS优点与限制(3)
PaaS优点与限制(3) PaaS学习笔记目录 PaaS基础学习(1) 在PaaS上开发Web.移动应用(2) PaaS优点与限制(3) 13. PaaS的核心服务 核心服务是指提供数据存储.SQl. ...