Welcome 微信登录

首页 / 数据库 / MySQL / Python 生产环境MySQL数据库增量备份脚本

MySQL数据库常用的办法是通过MySQLdump导出sql进行备份,但是不适合数据量很大的数据库,速度,锁表是两个严重的问题。前面写了一遍文章介绍xtrabackup的热备工具,见 http://www.linuxidc.com/Linux/2015-02/113058.htm。下面的脚本是基于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()MySQL管理之使用XtraBackup进行热备 http://www.linuxidc.com/Linux/2014-04/99671.htmMySQL开源备份工具Xtrabackup备份部署 http://www.linuxidc.com/Linux/2013-06/85627.htmMySQL Xtrabackup备份和恢复 http://www.linuxidc.com/Linux/2011-12/50275.htm用XtraBackup实现MySQL的主从复制快速部署【主不锁表】 http://www.linuxidc.com/Linux/2012-10/71919p2.htm安装和使用 Percona 推出的 Xtrabackup 备份 MySQL http://www.linuxidc.com/Linux/2011-10/44451.htmXtraBackup 的详细介绍:请点这里
XtraBackup 的下载地址:请点这里本文永久更新链接地址