在公司经常要做测试环境的升级、备份、维护;升级后台的应用,不可避免要进行数据库的升级与备份,花了一个上午琢磨了一个脚本分享给大家。

ToB的业务,在做环境维护的时候,有初始化环境和增量升级的环境,在测试阶段,几乎每轮都会动数据库脚本,那么测试环境每轮都需要进行数据库的升级维护

对应业务,基本上会出现以下三种场景:

1、初始化环境,在业务上对应新的B端客户需要安装系统

  需要将数据库删除以后重建(必须要这么做,否则可能会出现上一轮的初始化脚本中用到的表,这一轮脚本中删除了,如果不删库重建,可能会存在冗余的表)

2、升级环境,业务上对应现有客户,需要进行系统升级,需执行增量脚本

  不论是测试环境还是线上环境,在升级执行之前都需要将数据库进行备份,防止升级失败需要回滚

3、升级环境(非首次),业务上仅会在测试环境上出现,如第一轮测试以后,升级脚本有更新了,在第二轮测试前,需要将数据库恢复到升级之前,再进行升级

设计思路:

执行脚本,需要传入4个参数,

第一个参数是sql脚本名称,因为每轮升级时,名称都可能不一样

第二个参数是要做升级或者初始化的数据库的名称

第三个参数是升级标识,

第四个参数是数据库备份的文件版本标识,例如升级前的版本是1.0.1,升级后的版本是1.0.2,那么将1.0.1传入,这样可以标识每次备份的文件版本

# coding=utf-8
import MySQLdb
import sys,os
from subprocess import Popen,PIPE db_file=sys.argv[1]
db_name = sys.argv[2]
update_flag = sys.argv[3]
#upadte_flag是升级表示,为1:表示是初始化环境,只需要删除数据库实例,并重建 2:首次进行升级,需要备份数据库 3:非首次升级,需要将数据库先进行回滚再升级
db_back_file_version = sys.argv[4]
db_back_path = '/home/DB'
db_host = 'localhost'
db_port = 3306
db_user = 'root'
db_passwd = 'password'
file_name = db_back_path+"/"+db_name+'_'+db_back_file_version+'.sql' if not os.path.exists(db_file):
print('升级脚本不存在,请检查') #如果备份文件存在,重命名
if os.path.exists(file_name):
os.rename(file_name,file_name+'bak') #如果是首次执行数据库升级,先备份
if update_flag == "2":
print('开始备份数据库…………………………')
dumpcmd = "mysqldump -u" + db_user + " -p" +db_passwd+" -h"+db_host+ " -R " + db_name + " > " + file_name
os.system(dumpcmd) conn = MySQLdb.connect(host=db_host,port=db_port,user=db_user,passwd=db_passwd,db=db_name)
c = conn.cursor()
process = Popen('mysql -u %s -h%s -p%s %s' %(db_user,db_host,db_passwd,db_name),stdout=PIPE, stdin=PIPE, shell=True)
if update_flag == "1":
c.execute('Drop database %s' %db_name)
c.execute('create database %s' %db_name)
c.execute('use %s' %db_name)
output = process.communicate('source '+db_file)
elif update_flag == "2":
c.execute('use %s' %db_name)
output = process.communicate('source '+db_file)
elif update_flag == "3":
c.execute('Drop database %s' %db_name)
c.execute('create database %s' %db_name)
c.execute('use %s' %db_name)
print('开始恢复数据库并升级数据库')
cmd = 'source '+file_name +';'+'source '+db_back_path+'/'+db_file+';'
output = process.communicate(cmd) c.close()
print('run success')

有问题欢迎大家拍砖,还有很大优化的空间

python脚本--mysql数据库升级、备份的更多相关文章

  1. mysql数据库分库备份脚本

    mysql数据库分库备份脚本 版本1 for dbname in `mysql -uroot -poldboy123 -e "show databases;" |grep -Evi ...

  2. 企业级mysql数据库完全备份、增量备份脚本

    企业完全备份脚本 [root@client ~]# vim /opt/mysql_bak_wanbei.sh #!/bin/bash #MySQL数据库完全备份脚本 #设置登录变量 MY_USER=& ...

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

    Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁 一丶安装 pip install PyMySQL 二丶pymysql连接数据库 ### 语法: ...

  4. 使用python操作mysql数据库

    这是我之前使用mysql时用到的一些库及开发的工具,这里记录下,也方便我查阅. python版本: 2.7.13 mysql版本: 5.5.36 几个python库 1.mysql-connector ...

  5. 【Python】使用python操作mysql数据库

    这是我之前使用mysql时用到的一些库及开发的工具,这里记录下,也方便我查阅. python版本: 2.7.13 mysql版本: 5.5.36 几个python库 1.mysql-connector ...

  6. mysql安装和简要操作命令+python基本操作mysql数据库

    mysql数据库是一种关系型数据库管理系统.  一. windows平台安装Mysql数据库. Mysql数据库官网 :https://dev.mysql.com/downloads/windows/ ...

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

    mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump ...

  8. [知了堂学习笔记]_Java代码实现MySQL数据库的备份与还原

    通常在MySQL数据库的备份和恢复的时候,多是采用在cmd中执行mysql命令来实现. 例如: mysqldump -h127.0.0.1 -uroot -ppass test > d:/tes ...

  9. 使用percona-xtrabackup工具对mysql数据库的备份方案

    使用percona-xtrabackup工具对mysql数据库的备份方案 需要备份mysql的主机 172.16.155.23存放备份mysql的主机 172.16.155.22 目的:将155.23 ...

随机推荐

  1. Lodop提示BarCode Type(ena13)Invalid!

    前段时间遇到过一个奇怪的问题,就是代码里本身都是ENA13大写,却提示条码类型无效,而且进入打印设计后,选中打印项,条码类型变成了code39,但是实际是还有条码类型参数都是正确的,代码看上去没有问题 ...

  2. mock详解

    一.Mock在单元测试中扮演一个什么角色 有时,你需要为单元测试的初始设置准备一些“其他”的代码资源.但这些资源兴许会不可用,不稳定,或者是使用起来太笨重.你可以试着找一些其他的资源替代:或者你可以通 ...

  3. mysql left join 优化

      参考 https://www.cnblogs.com/zedosu/p/6555981.html

  4. python学习日记(初识递归与算法)

    递归函数 定义 递归的定义——在一个函数里再调用这个函数本身 递归的最大深度——997,即栈溢出. 使用递归函数需要注意防止栈溢出.在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进 ...

  5. 「LibreOJ β Round #4」框架 [bitset]

    题面 loj #include <cmath> #include <cstring> #include <cstdio> #include <cstdlib& ...

  6. python中的技巧——杂记

    杂记 zip的用法 对于 a = [1,2,3] b = [3,2,1] 若要同时遍历 for x, y in zip(a, b): pass zip(a, b)=> [(1,2,3),(3,2 ...

  7. UOJ 7 NOI2014 购票

    题意:给一棵树计算一下各个点在距离限制下以一定的费用公式通过不停地到祖先最后到达一号点的最小花费. 第一种做法:线段树维护带修凸壳.显然的,这个公式计算是p*x+q 所以肯定和斜率有关系.然后这题的d ...

  8. CF集萃2

    CF1155D - Beautiful Array 题意:给你一个序列和x,你可以选择任意一个子串(可以为空)乘上x,使得得到的序列最大子串和最大.求这个最大值.30w,2s. 解:设fi,0/1/2 ...

  9. C++: 类成员初始化列表语法

      类的成员初始化列表的初始化的基本语法,类的构造函数还可以运用此语法为其变量初始化: class Class { private: int a; int b; char ch; public: Cl ...

  10. c do{}while(0)

    1 goto bool foo(){ int *p = (int*)malloc(5*sizeof(int)); bool bOk = true;//执行并处理错误 if(!fun1()) goto ...