zoukankan      html  css  js  c++  java
  • 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.htm

    MySQL开源备份工具Xtrabackup备份部署 http://www.linuxidc.com/Linux/2013-06/85627.htm

    MySQL 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.htm

    XtraBackup 的详细介绍请点这里
    XtraBackup 的下载地址请点这里

    本文永久更新链接地址http://www.linuxidc.com/Linux/2015-02/113057.htm






  • 相关阅读:
    Mac 如何开启任何来源选项
    Fiddler抓包工具总结
    Inpaint>>一款神奇的去水印工具
    Adobe After Effects 2021 中文版 视频特效制作软件
    利用百度接口实现免费文字转语音
    普通电脑如何实现网吧锁屏?让你的电脑实现网吧挂机锁功能的方法
    一款强大的思维导图软件-XMind:ZEN 2020v10.0-免费安装与使用
    教你用 Python 修改微信(支付宝)运动步数,轻松升到 TOP1
    C# Winforn窗体的Load事件和Shown事件的区别
    判断输入的字符串是否是合法路径,并验证后面的输入是否含有非法字符
  • 原文地址:https://www.cnblogs.com/wudonghang/p/fed808a66863520e3d39c067423080b7.html
Copyright © 2011-2022 走看看