当前位置: 首页 > news >正文

软件开发阶段数据库升级维护策略

 

 

软件开发阶段数据库升级维护策略

 

一 为什么要维护升级

  1.1 现状和出现的问题

如果你开发一个的项目,没有用到数据库,那么你不用维护数据库。

如果你开发一个项目,用到数据库了,但是从不用修改,那么数据库的维护也相对的简单。

当你开发一个大的项目,数据库有很多表,视图,存储过程,数据库分成了几个,开发的团队很大,开发的周期很长,由于业务的需求数据库的变动相对较大(没有好的DBA,这个已经是事实,就不要再这方面下工夫了),此时数据库的维护应该采用什么样的策略?

先不说我们采用什么样的策略,看看我们会遇到什么样的问题:

a. 每次发版本的时候,数据库的脚步或数据总是拖后腿的关键东西

b. 谁有改了视图?

c. 谁又改了字段?谁删除了表?谁添加了字段?

d. 上次发版本就修改过什么字段?

e. 客户正式机上跑的数据库是V1.0 的,但是我们的新版本是V3.0的,数据库就变了什么?

f.现在都是V2.0的程序了,但是测试要测试V1.0的版本,那么?

为什么会出现这样的问题?对于这些问题我们又该采取什么应对措施?

出现这样的问题原因很简单,我们没有做好数据库版本的管理,没有统一的入口对数据库进行修改操作,每个人在需要的时候,都自己在数据库中添加,删除或修改某些表,试图,存储过程等,造成混乱的效果。

问题的根源找到了,那么就没有问题了,毕竟没有解决不了的问题,关键是别再问题的基础之上去处理问题,那样问题没有尽头。

1.书库库的修改工作有统一的入口点,由一个人或几个人来协同处理,但是要保证唯一的一份修改记录文档(当然可以备份,最好是一个人来处理,如果几个人来协同处理,那么一定要保证操作的是同一份文档)。

2.制定数据库的备份还原策略,没有必要天天备份数据库,但是每次发版本或者有重大变化的时候一定要备份数据库,同时备份的策略中,包含数据库备份的地址,备份的规则(如按时间或版本进行命名)。

3.从数据库的初始原型搭建开始,建立一个跟踪数据库变化记录的升级程序,该程序可以是读取每次修改脚本(如果采用脚本的形式,脚本命名很关键,毕竟我们要保证每次升级都需要执行的脚本),还有一种比较笨拙但是比较有效的方式将脚本根据时间,版本,维护的人维护记录等写入到程序中,但是要不断的维护数据库的升级程序,但是小小的开销却能够带来不错的效果。

4.制定严格的数据库修改制度,如果没有制度,所有的准备都没有用,每个人还是我行我素,修改了也不通知那个入口,跟没有维护一样。

 

 

1.2 分析

  首先从数据库的结构入手,我们知道数据库组成结构有:二维表,视图,存储过程,函数,索引等,他们一些相互独立,一些相互依赖的关系化存在,共同组成了一个完整的数据库。

 

1.2.1 二维表

  最简单的数据库是由多张二维表构成,只要维护好每一张表就维护好了整个数据库,那么我们维护的基本单元就是二维表。一张二维表的生命周期大致分为,原型期,升级期。所谓原型期是我们在最初设计数据库的时候所确定下来的表结构,也就是创建并初始化表。升级期则是对表的结构进行增加,删除,修改的过程。从这两点可以看出,我们只需要保持一份完整的表创建并初始化数据sql脚本,和记录每一次表的修改记录即可。对于每一次修改我们都去更新我们的创建并初始化数据sql脚本,以保持他的完整性

1.2.2 视图

  视图依赖于一张或多张二维表,也就是说视图维护的基础在于二维表首先是完整的。那么视图在很大程度上接近二维表的维护,在他的生命周期中也就是维护完整的创建sql脚本,不需要记录每一次修改脚本。

1.2.3 存储过程与函数

  在ddd之后这种数据库特性的接口使用并不多,但是也是一个非常重要的组成要素。存储过程的维护应该是比较简单的,我们不需要记录他的变更过程,只需要一直维护他的完整的定义sql脚本即可,函数与存储过程也一样,他们都是在表的基础上相对独立的,只需要维护他的sql完整性即可。

 

二 怎样维护升级

  有了前面提到的一些现状,产生问题的原因,以及一些分析思路,那么我们怎么来维护数据库的升级呢?

  首先这里解决的数据库升级是在开发阶段,因为开发阶段数据库处于极不稳定期,他的变更是时常的。我们维护数据库的思路:

1)      数据库变更是必须的,也就是在原型基础上确实不能满足需要的,进行变更升级

2)      在每一次变更过程中都需要确保整个表,视图,存储过程,函数是完整的,然后在确保我们的数据库是完整的,这里的完整性是指创建一个数据库的初始化sql脚本,他包括了创建语句和初始化数据语句,且需要确保他们的顺序关系和依赖关系。

3)      数据库的升级分为初始化和补丁升级,所谓的初始化是执行一个数据库初始化sql脚本,补丁升级在已经经过了初始化过程的数据库基础上进行的一些列变更。

4)      变更,是指对表,视图的字段的增加,删除,修改记录,每一次变更应确保他的影响达到最低,因为数据库有可能已经存在一些数据了。同时变更应尽量降低sql脚本的bug。

 

三 数据库升级维护实现

3.1 sql脚本记录

  每一个表,每一个视图,存储过程,函数有且仅有一个sql创建和初始化脚本,以表名,视图名,存储过程名,函数名创建文件夹,每一次变更均放置在各自的文件夹下面以日期命名,同一天只能有且仅有一个变更文件。初始化脚本与文件夹同名。

3.2 程序化升级

  开发一桌面程序,提供初始化数据库和升级功能。其中初始化数据库是用于创建并初始化数据库。升级功能则会在程序每次启动过程中检测有无升级脚本,以提示用户是否需要升级该提示可以通过程序扫描sql脚本文件是否与上一次已升级的脚本文件一致如果不一致则提示升级,以实现精准化变更升级补丁执行。

3.3 sql脚本源码托管

  将sql脚本以文本文件形式保存,但是托管在tfs中,每一个sql脚步内部写明本次sql补丁的原因,时间,由谁编写。并且该文件保存在vs的工程中以assets静态资源形式保存,在vs中修改他的属性为不编译,且每次重新生成即可。

3.4 用户使用

  用户在首次使用该程序时候,在部署的版本中找到升级程序,打开执行初始化数据库即可。对于以后的每次部署版本时候,只需要打开升级程序查看有无升级提示即可,如果有则执行升级即可,如果升级的过程中出现bug,可到bug日志文件中查找到sql执行异常对应的sql编写者,然后告知他出现bug,让他修复,重新发版。

转载于:https://www.cnblogs.com/rjjs/p/7660364.html

相关文章:

  • web基础,用html元素制作web页面
  • js 右键菜单
  • Vue与swiper相结合封装全屏轮播插件
  • 201621123058《java程序设计》第四周学习总结
  • Mixed Reality-宁波市VR/AR技术应用高研班总结
  • 将tomcat以普通用户启动
  • java final使用
  • 微信小程序前端坑整理
  • CF441D
  • path--diff
  • 前端基础之html
  • MySQL半同步复制
  • 通过ldap验证svn服务
  • codevs 2620 战壕
  • vue-cli脚手架安装
  • CentOS 7 修改主机名
  • CSS实用技巧干货
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • php中curl和soap方式请求服务超时问题
  • SpringCloud集成分布式事务LCN (一)
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 包装类对象
  • 分布式熔断降级平台aegis
  • 关于List、List?、ListObject的区别
  • 基于组件的设计工作流与界面抽象
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 王永庆:技术创新改变教育未来
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • - 转 Ext2.0 form使用实例
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #if 1...#endif
  • #ifdef 的技巧用法
  • ${ }的特别功能
  • (AngularJS)Angular 控制器之间通信初探
  • (C#)获取字符编码的类
  • (编译到47%失败)to be deleted
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (接口封装)
  • (十六)串口UART
  • (四)linux文件内容查看
  • (算法设计与分析)第一章算法概述-习题
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (学习日记)2024.01.19
  • (转)项目管理杂谈-我所期望的新人
  • *p++,*(p++),*++p,(*p)++区别?
  • .bat批处理出现中文乱码的情况
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 回调、接口回调、 委托
  • .NET 药厂业务系统 CPU爆高分析
  • .NET框架
  • .py文件应该怎样打开?
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林