Python 生產環境MySQL資料庫增量備份指令碼
MySQL資料庫常用的辦法是通過MySQLdump匯出sql進行備份,但是不適合資料量很大的資料庫,速度,鎖表是兩個嚴重的問題。前面寫了一遍文章介紹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()
MySQL管理之使用XtraBackup進行熱備
MySQL開源備份工具Xtrabackup備份部署
MySQL Xtrabackup備份和恢複
用XtraBackup實現MySQL的主從複製快速部署【主不鎖表】
安裝和使用 Percona 推出的 Xtrabackup 備份 MySQL
XtraBackup 的詳細介紹:請點這裡
XtraBackup 的:請點這裡
本文永久更新連結地址: