python 增量备份mysql_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()

原文:http://gccmx.blog.51cto.com/479381/1612100

MySQL备份脚本的编写可以分为以下几个步骤: 1. 确定备份的方式和时间 备份方式一般有全量备份增量备份两种方式,全量备份备份所有的数据,而增量备份备份最近一次备份之后的数据变更。同时需要确定备份的时间,可以选择每天的固定时间进行备份,也可以选择每周、每月等周期进行备份。 2. 编写备份脚本 备份脚本可以使用Bash或者Python脚本语言编写,以下是一个Bash备份脚本的示例: ``` #!/bin/bash # MySQL备份脚本 # 备份文件存放路径 backup_path=/data/backup/mysql # 备份文件名前缀 backup_prefix=mysql_backup # MySQL登录信息 mysql_user=root mysql_password=123456 mysql_host=localhost mysql_port=3306 # 备份文件名 backup_file=$backup_prefix$(date +%Y%m%d%H%M%S).sql.gz # 创建备份文件存放目录 mkdir -p $backup_path # 使用 mysqldump 命令备份数据库 mysqldump -u$mysql_user -p$mysql_password -h$mysql_host -P$mysql_port --all-databases | gzip > $backup_path/$backup_file # 删除过期备份文件,保留最近7天的备份 find $backup_path -name "$backup_prefix*" -mtime +7 -exec rm {} \; ``` 3. 配置定时任务 将备份脚本保存到服务器中,然后通过配置定时任务来实现定期备份。可以使用crontab命令来配置定时任务,例如下面的示例是每天凌晨2点执行备份脚本: ``` 0 2 * * * /bin/bash /path/to/backup_script.sh ``` 以上是MySQL备份脚本的简单编写方法,可以根据实际业务需求进行适当修改。同时需要注意备份文件的存储安全问题,建议将备份文件存储在独立的服务器或者存储设备中,以防数据丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值