软件开发阶段数据库升级维护策略sql
一 为何要维护升级数据库
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,让他修复,从新发版。