Python 生产环境Mysql数据库增量备份脚本

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:[email protected]
# 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()
时间: 2024-12-29 23:19:43

Python 生产环境Mysql数据库增量备份脚本的相关文章

mysql数据库自动备份脚本分享

前几篇博客已经相继公开了去转盘网的所有技术细节,如下: 百度网盘爬虫 中文分词算法 邀请好友注册 js分页部分代码 这篇博客我将继续公开数据库自动备份的代码.可以这么说,没有数据库,一切就是个蛋,没有数据库备份,一切还是个蛋,你可以想象数据库备份多么重要.不会linux,不会写shell的朋友麻烦先去补补.不过你说我牛逼,不补也能看懂,那没问题,哈哈,废话不说了.老规矩,上代码: #!/bin/bash time=$(date +"%d-%m-%Y") pre=/home/ubuntu

mysql数据库分库备份脚本

版本1 for dbname in `mysql -uroot -poldboy123 -e "show databases;" |grep -Evi "database|informa|perfor"` do mysqldump -uroot -poldboy123 --events -B $dbname|gzip >/opt/bak/${dbname}_bak.sql.gz done 版本2 #!/bin/bash MYUSER=root MYPASS=o

[MySQL] 生产环境MySQL数据库事务一直在RUNNING

前言: 运营人员反映,有一单子提交卡住了,页面一直没有返回. 1,刚开始怀疑是应用服务器或者db压力过高hang住了,马上去check应用服务器以及db的负载,看起来都OK,蛮低的,应该不是DB性能问题. 2,最后去看下是否是表锁住了,查看到有2个事务一直RUNNING,没有结束., mysql> select * from INNODB_TRX\G;*************************** 1. row ***************************           

mysql全库备份/增量备份脚本

http://hongge.blog.51cto.com/ 生产环境中Mysql数据库的备份是周期性重复的操作,所以通常是要编写脚本实现,通过crond计划任务周期性执行备份脚本 mysqldump备份方案: 周日凌晨1点全库备份 周一到周六凌晨每隔4个小时增量备份一次 设置crontab任务,每天执行备份脚本 # crontab –e #每个星期日凌晨1:00执行完全备份脚本 0 1 * * 0 /root/mysqlfullbackup.sh >/dev/null 2>&1 #周一

mysql 数据库定时备份 增量/全备份

实验楼的 MySQL 数据库需要设计一个自动备份方案,能够每周执行一次全备份,每天执行一次增量备份. 数据库名称为 shiyanlou,管理的用户名为 shiyanlou,密码为 shiyanlou.注意需要先手动启动 MySQL 服务. 目标 设计并实现备份方案,任务完成后满足以下要求: MySQL 服务处于运行状态 需要为服务器中的 shiyanlou 用户设定计划任务 计划任务中设定每周的周一凌晨3点执行一次全备份 计划任务中设定每天凌晨3点执行一次增量备份,周一不执行 请不要编写额外的脚

Linux下定时备份MySQL数据库的Shell脚本

Linux下定时备份MySQL数据库的Shell脚本 对任何一个已经上线的网站站点来说,数据备份都是必须的.无论版本更新还是服务器迁移,备份数据的重要性不言而喻.人工备份数据的方式不单耗费大量时间和精力,还灰常不专业的说.于是,有了下面这段脚本的出现.参考了网上的很多教程,外加自己的测试,以下脚本经测试可用.#!/bin/bash#Shell Command For Backup MySQL Database Everyday Automatically By Crontab#Author :

Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁

Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁 一丶安装 pip install PyMySQL 二丶pymysql连接数据库 ### 语法: import pymysql # 导入py模块 conn= pymysql.connect("数据库ip","用户","密码","数据库" ) # 打开数据库连接 cursor.execute("SELECT VERSI

MySQL数据库的备份与恢复之xtrabackup工具的使用

一. 为什么需要备份 在实际生产环境中误删操作,硬件损坏都会导致数据不可用,这个时候我们就需要备份来实现灾难恢复.还需要硬件级的冗余,例如raid,也不能取代备份操作,因为数据误删之后数据也是没有的,所以备份必不可少. 二. 备份的分类 1.物理备份和逻辑备份 物理备份 : 它是直接拷贝mysql的存储在磁盘上的数据文件.这种备份使用的空间大,特别是innodb存储数据使用的表空间,因为表空间分配大小是按一定的比例增长,所以存在没有使用的空间.但是恢复时使用的时间少.逻辑备份 : 将数据以sql

mysqldump常用于MySQL数据库逻辑备份

mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump file] 上述命令将指定数据库备份到某dump文件(转储文件)中,比如: mysqldump -uroot -p123 test > test.dump 生成的test.dump文件中包含建表语句(生成数据库结构哦)和插入数据的insert语句. B. --opt 如果加上--opt参数则生成的du