python脚本–mysql数据库升级、备份

释放双眼,带上耳机,听听看~!

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

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

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

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

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

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

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

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

 

设计思路:

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

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

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

第三个参数是升级标识,

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
1# coding=utf-8
2import MySQLdb
3import sys,os
4from  subprocess import  Popen,PIPE
5
6
7db_file=sys.argv[1]
8db_name = sys.argv[2]
9update_flag = sys.argv[3]  
10#upadte_flag是升级表示,为1:表示是初始化环境,只需要删除数据库实例,并重建 2:首次进行升级,需要备份数据库    3:非首次升级,需要将数据库先进行回滚再升级
11db_back_file_version = sys.argv[4]
12db_back_path = '/home/DB'
13db_host = 'localhost'
14db_port = 3306
15db_user = 'root'
16db_passwd = 'password'
17file_name =  db_back_path+"/"+db_name+'_'+db_back_file_version+'.sql'
18
19if not os.path.exists(db_file):
20    print('升级脚本不存在,请检查')
21
22#如果备份文件存在,重命名
23if os.path.exists(file_name):
24    os.rename(file_name,file_name+'bak')
25
26#如果是首次执行数据库升级,先备份
27if update_flag == "2":
28    print('开始备份数据库…………………………')
29    dumpcmd = "mysqldump -u" + db_user + " -p" +db_passwd+" -h"+db_host+ " -R " + db_name + " > " + file_name
30    os.system(dumpcmd)
31    
32
33
34conn = MySQLdb.connect(host=db_host,port=db_port,user=db_user,passwd=db_passwd,db=db_name)
35c = conn.cursor()
36process = Popen('mysql -u %s -h%s -p%s %s' %(db_user,db_host,db_passwd,db_name),stdout=PIPE, stdin=PIPE, shell=True)
37if update_flag == "1":
38    c.execute('Drop database %s' %db_name)
39    c.execute('create database %s' %db_name)
40    c.execute('use %s' %db_name)
41    output = process.communicate('source '+db_file)
42elif update_flag == "2":
43    c.execute('use %s' %db_name)
44    output = process.communicate('source '+db_file)
45elif update_flag == "3":
46    c.execute('Drop database %s' %db_name)
47    c.execute('create database %s' %db_name)
48    c.execute('use %s' %db_name)
49    print('开始恢复数据库并升级数据库')
50    cmd = 'source '+file_name +';'+'source '+db_back_path+'/'+db_file+';'
51    output = process.communicate(cmd)
52
53c.close()
54print('run success')
55

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

转载于:https://www.cnblogs.com/andr/p/10756639.html

给TA打赏
共{{data.count}}人
人已打赏
安全技术

c++ list, vector, map, set 区别与用法比较

2022-1-11 12:36:11

病毒疫情

招之即战,守门又守人

2020-3-12 8:11:00

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索