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@163.com # Last modified: 2015-2-5 # Filename: innobackup.py # Description: backup mysql files,base percona xtrabackup # blog:gccmx.blog.51cto.com #==================================================== import datetime import subprocess import os import sys import logging 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 = ‘bk2015‘ 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 def storebefore(): suffix = datetime.datetime.now().strftime("%y%m%d") storedir = "%s/%s-bak" %(stores,suffix) if not os.path.exists(storedir): subprocess.call("mkdir -p %s" %(storedir),shell=True) command = "cd %s && mv * %s" %(basedir,storedir) subprocess.call(command,shell=True) # 删除转储目录中超过7天的备份数据 def cleanstore(): command = "find %s -type d -mtime +7 |xargs rm -fr" % stores subprocess.call(command,shell=True) # 备份方法,每天23点完整备份,第二天0-22点增量备份 def backup(): if not os.path.exists(basedir): subprocess.call("mkdir -p %s"%basedir,shell=True) commandfull = "innobackupex --user=%s --password=%s --no-timestamp %s" %(backuser,backpass,fullback_dir) if cuhour == ‘23‘: storebefore() subprocess.call("rm -fr %s/*"%basedir,shell=True) subprocess.call(commandfull,shell=True) logging.info(commandfull) else: if int(cuhour) - 1 >= 0: increbase_dir = ‘%s/%s‘ %(basedir,str(int(cuhour) - 1)) else: increbase_dir = "%s/%s" %(basedir,todaydate) if not os.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()
本文出自 “烛影摇红” 博客,请务必保留此出处http://gccmx.blog.51cto.com/479381/1612100
原文地址:http://gccmx.blog.51cto.com/479381/1612100