博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
配合crond服务实现自定义周期备份MySQL数据库(使用innobackupex进行备份)
阅读量:4635 次
发布时间:2019-06-09

本文共 3229 字,大约阅读时间需要 10 分钟。

备份

新建一个脚本/root/backup.py,内容如下:

#!/usr/bin/env python # -*- coding: utf-8 -*-'''脚本作者:昨夜星辰脚本作用:配合crond服务实现自定义周期备份MySQL数据库(使用innobackupex进行备份)创建日期:2016年9月22日'''import osimport datetimeimport subprocess# MySQL服务root用户的密码password = 'test'# 用于存放备份的目录path = '/backup'# 备份周期(单位:天)cycle = 30# 获取当天的日期today = datetime.date.today()# 获取昨天的日期yesterday = today + datetime.timedelta(days=-1)# 判断备份目录下的文件数是否等于备份周期,如果是就清空备份目录。if len(os.listdir(path)) == cycle:    os.system('rm -rf %s/*' % path)# 判断备份目录下是否存在以昨天日期命名的目录,如果是就进行增量备份,否则就进行完整备份。if os.path.isdir('%s/%s' % (path, yesterday)):    cmd = 'innobackupex --password=%s --incremental %s --incremental-basedir=%s/%s --no-timestamp' % (password, path, path, yesterday)else:    cmd = 'innobackupex --password=%s %s/%s --no-timestamp' % (password, path, today)# 执行备份命令subprocess.call(cmd, shell=True, stderr=subprocess.PIPE)

读者请注意根据自身实际情况修改脚本中的path、password、cycle变量。

执行下面的命令进入crontab的编辑模式:

crontab -e

新增以下内容:

# 每天凌晨2点自动执行数据库备份脚本 0 2 * * * python /root/python &> /dev/null

 还原

# -*- coding: utf-8 -*-'''脚本作者:昨夜星辰脚本作用:使用innobackupex命令还原MySQL服务创建日期:2016年9月22日'''import osimport subprocess# 用于存放备份的目录path1 = '/backup'# MySQL服务的数据目录path2 = '/wwwroot/mysql'# 获取备份目录下的文件并排序d_list = sorted(os.listdir(path1))# 警告信息alert_message = '''警告!!!请检查脚本中的path1、path2变量是否配置正确。还原操作需要停止MySQL服务并清空数据目录,在生产环境中操作需谨慎!在硬盘空间足够的前提下,建议重命名数据目录,然后再新建一个同名的数据目录。比如您的数据目录是/data,那么你可以这么做:service mysqld stopmv /data /data_bakmkdir /data'''print alert_message# 询问用户是否继续while True:    answer = raw_input('准备好后就输入“Y”继续,或者输入“N”退出:')    if answer == 'Y':        break    elif answer == 'N':        exit(0)    else:        print '输入有误,请重新输入!'# 打印日期列表的序号和日期for i in range(len(d_list)):    print '%d. %s' % (i, d_list[i])# 询问用户需要还原的日期的序号,如果用户输错了,就提示并要求用户重新输入。while True:    try:        SN = int(raw_input('请输入你想还原的日期对应的序号:'))        if SN not in range(len(d_list)):            print '输入有误,请重新输入!'        elif not os.path.isdir('%s/%s' % (path1, d_list[SN])):            print '输入有误,请重新输入!'        else:            break    except ValueError:        print '输入有误,请重新输入!'# 停止MySQL服务os.popen('service mysqld stop')# 清空MySQL服务的数据目录os.popen('rm -rf %s/*' % path2)print# 如果SN的值为真,那就说明用户选择了增量备份,需要将所有增量备份按顺序合并到完整备份中。if SN:    print '开始合并所有增量备份到完整备份中...'    for i in range(SN + 1):        print '正在合并%s的数据...' % d_list[i]        if i == 0:            cmd = 'innobackupex --apply-log --redo-only %s/%s' % (path1, d_list[0])        elif i == SN:            cmd = 'innobackupex --apply-log %s/%s --incremental-dir=%s/%s' % (path1, d_list[0], path1, d_list[i])        else:            cmd = 'innobackupex --apply-log --redo-only %s/%s --incremental-dir=%s/%s' % (path1, d_list[0], path1, d_list[i])        subprocess.call(cmd, shell=True, stderr=subprocess.PIPE)print '正在回滚未提交的事务...'# 回滚未提交的事务cmd = 'innobackupex --apply-log %s/%s' % (path1, d_list[0])subprocess.call(cmd, shell=True, stderr=subprocess.PIPE)print '开始还原...'# 开始还原cmd = 'innobackupex --copy-back %s/%s' % (path1, d_list[0])subprocess.call(cmd, shell=True, stderr=subprocess.PIPE)# 变更MySQL数据目录的属主和数组os.popen('chown -R mysql.mysql %s' % path2)# 启动MySQL服务os.popen('service mysqld start')print '还原完毕!'

读者请注意根据自身实际情况修改脚本中的path1、path2变量。

转载于:https://www.cnblogs.com/yestreenstars/p/5895429.html

你可能感兴趣的文章
地大信工成果快报
查看>>
win10 php7+apache2.4的配置以及遇到的问题及解决
查看>>
透明明兼容
查看>>
大三了,计算机专业学生的困惑。 [转]
查看>>
tinyfox for linux 独立版 fox.sh
查看>>
Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)
查看>>
hdu 1233 最小生成树
查看>>
js作用域与作用域链
查看>>
javascript 反斜杠\
查看>>
iOS linker command failed with exit code 1 (use -v to see invocation)多种解决方案汇总
查看>>
Android学习第十五天----notification应用
查看>>
【GOF23设计模式】迭代器模式
查看>>
递归锁
查看>>
Unix_03_文件系统介绍_2
查看>>
向前插入迭代器
查看>>
Mysql数据导入导出
查看>>
SurfaceView闪烁问题
查看>>
Binder
查看>>
Django--Forms组件使用
查看>>
Distinct源码分析
查看>>