# coding:utf-8
# encoding=UTF-8
# !/usr/bin/python3
# encoding: utf-8
# filename: meb-mysql-backups.py
# author: gaohaixiang
# writetime:202208241705import subprocess
import time
import os
import re
import sys"""
使用说明:
需要数据库对应版本的 mysqlbackup
运行脚本之前,需要主机只保留备份数据库的运行
恢复数据之前,需要清除被恢复数据库存放数据目录中内容
运行被恢复数据库之前需要授权数据存放目录脚本运行需要的数据:
备份数据库的账密,数据备份目录,被恢复数据库的配置文件脚本运行命令:
压缩备份
python3 meb-mysql-backups.py InputCompressedBackup全量备份
python3 meb-mysql-backups.py InputFullBackup增量备份
python3 meb-mysql-backups.py InputIncrementalBackupSecond压缩备份还原
python3 meb-mysql-backups.py InputCompressedBackupReduction全量备份还原
python3 meb-mysql-backups.py InputFullBackupReduction增量备份还原
python3 meb-mysql-backups.py InputIncrementalBackupReduction
"""# 数据库信息获取,备份数据库的配置文件,socket文件
def MysqlInformationGet():commands = " ps -ef |grep mysql|grep pid-file"getoutput = subprocess.getoutput(commands)if getoutput:BackDefaultsFile = ""BackSocket = ""for lines in getoutput.split():if re.findall("defaults-file", lines):BackDefaultsFile = lines.split("=")[1]elif re.findall("socket", lines):BackSocket = lines.split("=")[1]return BackDefaultsFile, BackSocketelse:print("无数据库进程")# 目录结构获取
def DirStructureGet(dirname):dirnames = []if os.path.exists(dirname):dirnames = os.listdir(dirname)else:os.makedirs(dirname)dirnames.sort()return dirnames# 实时时间格式获取
def TimestapGet():gettimestamp = time.strftime('%Y%m%d%H%M%S')return gettimestamp# 压缩备份
def CompressedBackup(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, CompressedDirName):commands = "mysqlbackup --defaults-file=%s  --user=%s --password=%s \--socket=%s --compress-level=1 --backup-dir=%s  backup" % (BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, CompressedDirName)getoutput = subprocess.getoutput(commands)ff.writelines(getoutput)# 全量备份
def FullBackup(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, FullDirName):commands = "mysqlbackup --defaults-file=%s  --user=%s --password=%s \--socket=%s --backup-dir=%s backup" % (BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, FullDirName)getoutput = subprocess.getoutput(commands)ff.writelines(getoutput)# 增量备份,第一次
def IncrementalBackupFirst(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, IncrementalBackupFirstDirName,LastFullBackupDirName):commands = "mysqlbackup  --defaults-file=%s  --user=%s \--password=%s --socket=%s \--incremental --incremental-backup-dir=%s \--incremental-base=dir:%s  backup" % \(BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, IncrementalBackupFirstDirName,LastFullBackupDirName)getoutput = subprocess.getoutput(commands)ff.writelines(getoutput)# 增量备份,第二次,及第 N 次
def IncrementalBackupSecond(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, IncrementalBackupNDirName,LastIncrementalBackupDirName):commands = "mysqlbackup  --defaults-file=%s  --user=%s \--password=%s --socket=%s  \--incremental --incremental-backup-dir=%s  \--incremental-base=dir:%s  backup" % \(BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, IncrementalBackupNDirName,LastIncrementalBackupDirName)getoutput = subprocess.getoutput(commands)ff.writelines(getoutput)# 压缩备份还原
def CompressedBackupReduction(ff, RdeuctionMysqlFile, LastCompressedBackupDirName):# 第一步:检测事务日志,并解压commands1 = "mysqlbackup --defaults-file=%s  --uncompress \--backup-dir=%s apply-log" % (RdeuctionMysqlFile, LastCompressedBackupDirName)getoutput1 = subprocess.getoutput(commands1)ff.writelines(getoutput1)# 第二步:copy物理文件commands2 = "mysqlbackup --defaults-file=%s \--backup-dir=%s copy-back" % (RdeuctionMysqlFile, LastCompressedBackupDirName)getoutput2 = subprocess.getoutput(commands2)ff.writelines(getoutput2)# 全量备份还原
def FullBackupReduction(ff, RdeuctionMysqlFile, LastFullBackupDirName):# 第一步:检测事务日志commands1 = "mysqlbackup --defaults-file=%s  \--backup-dir=%s  apply-log" % (RdeuctionMysqlFile, LastFullBackupDirName)getoutput1 = subprocess.getoutput(commands1)ff.writelines(getoutput1)# 第二步:copy物理文件commands2 = "mysqlbackup --defaults-file=%s \--backup-dir=%s  copy-back" % (RdeuctionMysqlFile, LastFullBackupDirName)getoutput2 = subprocess.getoutput(commands2)ff.writelines(getoutput2)# 增量备份还原,一次增量
def IncrementalBackupReductionOne(ff, RdeuctionMysqlFile, LastFullBackupDirName, FirstIncrementalBackupDirName):# 1. 全备检测匹配释放事务日志commands1 = "mysqlbackup --defaults-file=%s  \--backup-dir=%s apply-log" % (RdeuctionMysqlFile, LastFullBackupDirName)getoutput1 = subprocess.getoutput(commands1)ff.writelines(getoutput1)# 2. 检测匹配释放第一次的增量备份commands2 = "   mysqlbackup  --backup-dir=%s  \--incremental-backup-dir=%s  apply-incremental-backup" % (LastFullBackupDirName, FirstIncrementalBackupDirName)getoutput2 = subprocess.getoutput(commands2)ff.writelines(getoutput2)# 4. 最后进行物理文件复制commands4 = "mysqlbackup --defaults-file=%s  \--backup-dir=%s copy-back" % (RdeuctionMysqlFile, LastFullBackupDirName)getoutput4 = subprocess.getoutput(commands4)ff.writelines(getoutput4)# 增量备份还原,N次增量
def IncrementalBackupReductionN(ff, RdeuctionMysqlFile, LastFullBackupDirName, IncrementalDir,IncrementalBackupDirNameList):# 1. 全备检测匹配释放事务日志commands1 = "mysqlbackup --defaults-file=%s  \--backup-dir=%s apply-log" % (RdeuctionMysqlFile, LastFullBackupDirName)getoutput1 = subprocess.getoutput(commands1)ff.writelines(getoutput1)LenNumberIncrementalDir = len(IncrementalBackupDirNameList)for i in range(LenNumberIncrementalDir):if i == 0:FirstIncrementalBackupDirName = IncrementalDir + IncrementalBackupDirNameList[0]# 2. 检测匹配释放第一次的增量备份commands2 = "   mysqlbackup  --backup-dir=%s  \--incremental-backup-dir=%s  apply-incremental-backup" % (LastFullBackupDirName, FirstIncrementalBackupDirName)getoutput2 = subprocess.getoutput(commands2)ff.writelines(getoutput2)else:NIncrementalBackupDirName = IncrementalDir + IncrementalBackupDirNameList[i]# 3.检测匹配释放第 N 次的增量备份commands3 = "  mysqlbackup  --backup-dir=%s  \--incremental-backup-dir=%s  apply-incremental-backup" % (LastFullBackupDirName, NIncrementalBackupDirName)getoutput3 = subprocess.getoutput(commands3)ff.writelines(getoutput3)# 4. 最后进行物理文件复制commands4 = "mysqlbackup --defaults-file=%s  \--backup-dir=%s copy-back" % (RdeuctionMysqlFile, LastFullBackupDirName)getoutput4 = subprocess.getoutput(commands4)ff.writelines(getoutput4)"""压缩备份"""
def InputCompressedBackup(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, CompressedDir):ff.writelines("压缩备份\n")CompressedDirName = CompressedDir + gettimestampDirStructureGet(CompressedDirName)  # 创建备份使用的目录CompressedBackup(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, CompressedDirName)"""全量备份"""
def InputFullBackup(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, FullDir):ff.writelines("全量备份\n")FullDirName = FullDir + gettimestampDirStructureGet(FullDirName)  # 创建备份使用的目录FullBackup(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, FullDirName)"""增量备份"""
def InputIncrementalBackupSecond(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket, FullDir, IncrementalDir):ff.writelines("增量备份\n")# 增量备份# 获取最后一次全量备份目录LastFullBackupDirName = ""LastFullBackupDirNameList = DirStructureGet(FullDir)if LastFullBackupDirNameList:if LastFullBackupDirNameList[-1] == "incremental":LastFullBackupDirName = FullDir + LastFullBackupDirNameList[-2]else:LastFullBackupDirName = FullDir + LastFullBackupDirNameList[-1]else:ff.writelines("无全量备份,请先全量备份,后再进行增量备份")print("无全量备份,请先全量备份,后再进行增量备份")# print(LastFullBackupDirName)if LastFullBackupDirName:# 判断增量备份是否是多次IncrementalBackupDirNameList = DirStructureGet(IncrementalDir)# print(IncrementalBackupDirNameList)# 最后一次增量备份if IncrementalBackupDirNameList:LastIncrementalBackupDirName = IncrementalDir + IncrementalBackupDirNameList[-1]# 第 N 次增量备份IncrementalBackupNDirName = IncrementalDir + gettimestampDirStructureGet(IncrementalBackupNDirName)  # 创建备份使用的目录IncrementalBackupSecond(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket,IncrementalBackupNDirName,LastIncrementalBackupDirName)# 第一次增量备份else:IncrementalBackupFirstDirName = IncrementalDir + gettimestampDirStructureGet(IncrementalBackupFirstDirName)  # 创建备份使用的目录IncrementalBackupFirst(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket,IncrementalBackupFirstDirName, LastFullBackupDirName)"""压缩备份还原"""
def InputCompressedBackupReduction(ff, RdeuctionMysqlFile, CompressedDir):ff.writelines("压缩还原\n")LastCompressedBackupDirNameList = DirStructureGet(CompressedDir)if LastCompressedBackupDirNameList:LastCompressedBackupDirName = CompressedDir + LastCompressedBackupDirNameList[-1]CompressedBackupReduction(ff, RdeuctionMysqlFile, LastCompressedBackupDirName)else:ff.writelines("无压缩备份,无法进行压缩备份还原")print("无压缩备份,无法进行压缩备份还原")"""全量备份还原"""
def InputFullBackupReduction(ff, RdeuctionMysqlFile, FullDir):ff.writelines("全量还原\n")LastFullBackupDirNameList = DirStructureGet(FullDir)if LastFullBackupDirNameList and LastFullBackupDirNameList[-1] != "incremental":LastFullBackupDirName = FullDir + LastFullBackupDirNameList[-1]FullBackupReduction(ff, RdeuctionMysqlFile, LastFullBackupDirName)elif LastFullBackupDirNameList and LastFullBackupDirNameList[-1] == "incremental":LastFullBackupDirName = FullDir + LastFullBackupDirNameList[-2]FullBackupReduction(ff, RdeuctionMysqlFile, LastFullBackupDirName)else:ff.writelines("无全量备份,无法进行全量备份还原")print("无全量备份,无法进行全量备份还原")"""增量备份还原"""
def InputIncrementalBackupReduction(ff, RdeuctionMysqlFile, FullDir,IncrementalDir):ff.writelines("增量还原\n")LastFullBackupDirName = ""LastFullBackupDirNameList = DirStructureGet(FullDir)if LastFullBackupDirNameList and LastFullBackupDirNameList[-1] != "incremental":ff.writelines("无增量备份,无法进行增量备份还原")print("无增量备份,无法进行增量备份还原")elif LastFullBackupDirNameList and LastFullBackupDirNameList[-1] == "incremental":LastFullBackupDirName = FullDir + LastFullBackupDirNameList[-2]else:ff.writelines("无全量备份,无法进行增量和全量备份还原")print("无全量备份,无法进行增量和全量备份还原")IncrementalBackupDirNameList = DirStructureGet(IncrementalDir)LenNumberIncrementalDir = len(IncrementalBackupDirNameList)if LenNumberIncrementalDir == 1:FirstIncrementalBackupDirName = IncrementalDir + IncrementalBackupDirNameList[-1]IncrementalBackupReductionOne(ff, RdeuctionMysqlFile, LastFullBackupDirName, FirstIncrementalBackupDirName)elif LenNumberIncrementalDir > 1:IncrementalBackupReductionN(ff, RdeuctionMysqlFile, LastFullBackupDirName, IncrementalDir,IncrementalBackupDirNameList)else:ff.writelines("增量备份目录无文件,不能进行增量备份还原")print("增量备份目录无文件,不能进行增量备份还原")if __name__ == '__main__':# 获取现在的时间格式gettimestamp = TimestapGet()print(gettimestamp)# 压缩备份目录CompressedDir = '/data/databak/compress/'# 全量备份目录FullDir = '/data/databak/backup/'# 增量备份目录IncrementalDir = '/data/databak/backup/incremental/'# 创建备份目录DirStructureGet(CompressedDir)  # 创建压缩备份使用的目录DirStructureGet(FullDir)  # 创建全量备份使用的目录DirStructureGet(IncrementalDir)  # 创建增量备份使用的目录# 还原数据的配置文件RdeuctionMysqlFile = "/data/mysql-8.0.30/mysql.cnf"# 备份及还原日志文件LogFileName = "/data/databak/mysqlbakup.log"ff = open(LogFileName, "a+", encoding="UTF8")ff.writelines("#########\n" * 50)ff.writelines(gettimestamp + "\n")# 获取备份数据库信息BackDefaultsFile, BackSocket = MysqlInformationGet()MysqlUser = "mysqluser"MysqlPassword = "a123456b"if sys.argv[1] == "InputCompressedBackup":"""压缩备份"""InputCompressedBackup(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket,CompressedDir)elif sys.argv[1] == "InputFullBackup":"""全量备份"""InputFullBackup(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket,FullDir)elif sys.argv[1] == "InputIncrementalBackupSecond":"""增量备份"""InputIncrementalBackupSecond(ff, BackDefaultsFile, MysqlUser, MysqlPassword, BackSocket,FullDir,IncrementalDir)elif sys.argv[1] == "InputCompressedBackupReduction":"""压缩备份还原"""InputCompressedBackupReduction(ff, RdeuctionMysqlFile,CompressedDir)elif sys.argv[1] == "InputFullBackupReduction":"""全量备份还原"""InputFullBackupReduction(ff, RdeuctionMysqlFile,FullDir)elif sys.argv[1] == "InputIncrementalBackupReduction":"""增量备份还原"""InputIncrementalBackupReduction(ff, RdeuctionMysqlFile, FullDir,IncrementalDir)else:ff.writelines("请输入正确的参数")print("请输入正确的参数")ff.close()

mysql meb物理备份脚本相关推荐

  1. mysql meb物理备份

    ''' 参考 https://blog.csdn.net/m582445672/article/details/7649944注意: 在数据还原时,需要将需要还原数据库停止并将存放数据的目录删除,还原 ...

  2. MySQL逻辑物理备份测试

    MySQL逻辑物理备份测试 目录 逻辑备份 mysqldump普通备份 mysqlpump并行备份 mysqlpump压缩并行备份 mydumper并行备份 mydumper并行压缩备份 小结 物理备 ...

  3. mysql 备份脚本 linux,LINUX中MySQL如何按时备份脚本

    LINUX中MySQL如何按时备份脚本 发布时间:2020-06-02 17:09:34 来源:51CTO 阅读:212 作者:三月 本篇文章给大家主要讲的是关于LINUX中MySQL如何按时备份脚本 ...

  4. 转 基于MySQL MEB的备份恢复

    几种备份方式的介绍 mysqlbackup是一个热备份工具.也就是说它不像mysqldump那样给表上一个全局锁,由于mysqldump上了这个锁,所以就造成客户端只能对 数据库进行读操作不能写,这也 ...

  5. meb备份mysql_基于MySQL MEB的备份恢复

    MEB是MySQL商业版中提供的备份工具,属于物理备份. 同XtraBackup一样,mysqlbackup的使用过程同样包含如下三个步骤: 备份(--backup)=> 应用日志(--appl ...

  6. mysql自动异地备份脚本_MYSQL数据库自动本地/异地双备份/MYSQL增量备份

    构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是 ...

  7. mysql 集群备份脚本_MysqlBackup

    #MYSQL 多方式备份脚本 简单介绍 xtrabackupex: 200G数据:在线1小时备份并完成恢复,innodb不锁表 mydumper: 多线程备份,会锁表,备份快,恢复慢 mysqldum ...

  8. mysql 集群备份脚本_mysqldump结合脚本的备份方案

    1.备份脚本的简介 脚本分为两个部分,主控脚本与备份子脚本. 1.1.备份子脚本 -完成mysql基本的备份功能 -自动日期时间命名备份文件(不产生重复名称的备份) -提供压缩(节省大量的空间) 1. ...

  9. 如何对mysql做物理备份_如何创建物理MySQL备份

    前提条件 在开始之前,确保你有一个有sudo权限的用户和一个MySQL数据库服务器. 查找数据目录 使用root密码登录到MySQL服务器.$ sudo mysql -u root -p 下面的SQL ...

最新文章

  1. 刀塔传奇服务器维护,刀塔传奇360专服合服维护补偿公告
  2. golang mysql商业用例_完美起航-golang操作mysql用例
  3. Numpy-随机生成以及矩阵的运算
  4. Struts2(一)— 入门
  5. 开发自己的框架——(二)数据库工具类的封装
  6. HDU1576(欧几里得算法)
  7. 高杰:对撞机的历史回顾与展望
  8. VS中监视窗口,即时窗口和输出窗口的使用
  9. Python crypto模块实现RSA和AES加密解密
  10. html鼠标滑动代码,jQuery鼠标滚动设置input的值代码
  11. 测试类什么时候初始化
  12. ZOJ 3993 2017CCPC秦皇岛 M:Safest Buildings
  13. css定位、position与float同时使用的情况
  14. linux系统的ftp命令大全,Linux-FTP命令大全(完整版)
  15. 网络安全——kali_Linux基本命令大全
  16. 深刻对比一下阿里云服务器和腾讯云服务器的优劣和区别
  17. 对巴什博奕和尼姆博弈的理解
  18. 浅谈vue的生命周期
  19. Python——列表的方法
  20. 微信小程序 java音乐播放器系统python php

热门文章

  1. next cloud_Google Cloud Next '17主题演讲的5个重要要点
  2. 人生之路 — 学会寡言
  3. A slap on the back 祝贺一下
  4. Vscode上使用opencv(C++接口,Windows篇)
  5. Code Review的亲身实践
  6. 从单体架构到分布式微服务架构的思考
  7. java里面floors是什么意思,floors是什么意思_floors怎么读_floors翻译_用法_发音_词组_同反义词_底( floor的名词复数 )-新东方在线英语词典...
  8. 【模版】背包问题汇总
  9. Android 9.0默认支持的语言
  10. 测试手机速度的软件叫什么,怎样用手机测wifi网速 手机测网速用什么软件