Mysql数据库常用的办法是通过mysqldump导出sql进行备份,但是不适合数据量很大的数据库,速度,锁表是两个严重的问题。前面写了一遍blog介绍xtrabackup的热备工具。下面的脚本是基于xtrabackup实现自动备份数据库的功能。
需求描述:
每天晚上23点,对数据库进行一次完整备份。第二天0-22点,每小时进行一次增量备份。每次备份前把上次的完整备份和23次增量备份移动到指定目录里,保留7天的数据。
ps:不要问我,为什么是23点执行完整备份,0点不更好处理吗?bingo,这是我们的业务需求,呵呵,不能说太细,你懂得。不要问我,为啥用不用shell,至少不用写subprocess.call来调系统命令。我只能说,我乐意,你管的着?哈哈!
#-*-coding:UTF-8-*-
#!/usr/bin/python
#====================================================
#Author:gaochenchao-EMail:gccmx@
#Lastmodified:-2-5
#Filename:innobackup.py
#Description:backupmysqlfiles,baseperconaxtrabackup
#blog:gccmx.
#====================================================
importdatetime
importsubprocess
importos
importsys
importlogging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s%(filename)s[line:%(lineno)d]%(levelname)s%(message)s',
datefmt='%a,%d%b%Y%H:%M:%S',
filename='backup.log',
filemode='a')
backuser='bkuser'
backpass='bk'
basedir='/mnt/backups'
tomorrowdate=datetime.date.fromordinal(datetime.date.today().toordinal()+1).strftime("%y%m%d")
todaydate=datetime.datetime.now().strftime("%y%m%d")
fullback_dir="%s/%s"%(basedir,tomorrowdate)
cuhour=datetime.datetime.now().strftime("%H")
#cuhour=sys.argv[1]
increment_dir='%s/%s'%(basedir,cuhour)
increbase_dir=''
stores='/mnt/stores'
#转储老的备份数据,移动到以当前年月日命名的文件夹内,目录如150209-bak
defstorebefore():
suffix=datetime.datetime.now().strftime("%y%m%d")
storedir="%s/%s-bak"%(stores,suffix)
ifnotos.path.exists(storedir):
subprocess.call("mkdir-p%s"%(storedir),shell=True)
command="cd%s&&mv*%s"%(basedir,storedir)
subprocess.call(command,shell=True)
#删除转储目录中超过7天的备份数据
defcleanstore():
command="find%s-typed-mtime+7|xargsrm-fr"%stores
subprocess.call(command,shell=True)
#备份方法,每天23点完整备份,第二天0-22点增量备份
defbackup():
ifnotos.path.exists(basedir):
subprocess.call("mkdir-p%s"%basedir,shell=True)
commandfull="innobackupex--user=%s--password=%s--no-timestamp%s"%(backuser,backpass,fullback_dir)
ifcuhour=='23':
storebefore()
subprocess.call("rm-fr%s/*"%basedir,shell=True)
subprocess.call(commandfull,shell=True)
logging.info(commandfull)
else:
ifint(cuhour)-1>=0:
increbase_dir='%s/%s'%(basedir,str(int(cuhour)-1))
else:
increbase_dir="%s/%s"%(basedir,todaydate)
ifnotos.path.exists(increbase_dir):
logging.info('上次的增量备份目录[%s]不存在,终止执行'%increbase_dir)
exit(0)
commandincre="innobackupex--user=%s--password=%s--no-timestamp--incremental%s--incremental-basedir=%s"%(
backuser,backpass,increment_dir,increbase_dir)
subprocess.call(commandincre,shell=True)
logging.info(commandincre)
if__name__=='__main__':
backup()
cleanstore()