项目组数据库脚本的维护方案

背景

  • 版本发布密集,为满足客户和领导的要求,项目经理决定每周必须发布并上线一个版本。
  • 功能修改频繁,相应的表结构、表数据的变动也比较频繁。
  • 产品满足两种部署方案,一是总部部署,由项目组直接来维护,供内部客户使用;二是客户自行安装、升级和维护,项目组提供版本和技术支持。
  • 项目选型使用MySQL作为数据存储软件。

方案

针对现状,设计出数据库脚本的维护方案,脚本分为全量脚本和升级脚本两套。
全量脚本,包括

  • 表结构定义,包括表结构定义、列的索引定义。
  • 初始化数据,包括系统正常运行时需要的初始化数据。
  • 存储过程定义,包括系统运行时使用到的存储过程的集合。
  • 函数定义,包括系统运行时使用到的、自定义的MySQL

升级脚本,相比于全量脚本,升级脚本的构成相对简单一些,以天为单位来维护脚本,比如2015年8月10日脚本有变化,那么就创建一个脚本文件,名为2015-08-10.sql,这个文件里保存对原有数据库表对象进行增量修改的语句。

方案的问题

由于团队成员中以刚毕业、工作不满一年的新员工为主,前述方案在实际使用时遇到几个问题:

  • 全量脚本和升级脚本中,经常会出现不一致。比如升级脚本中增加了字段,但全量脚本中没有增加;全量脚本中增加字段时出现了重复增加,导致建失败,等等。
  • 数据库脚本中存在语法错误,比如语句末尾的“;”经常忘记增加,导致同一文件中后面的脚本执行失败。
  • 数据库脚本中存在乱码,比如书写脚本时经常忘记切换输入法,导致分号、逗号等是中文符号,执行时失败。
  • 数据库脚本缺少注释,尤其是升级脚本中缺少注释,更别提场景描述,测试人员验证升级脚本时需要大量时间来确认脚本使用的场景。
  • 升级脚本的场景存在设计遗漏,测试经常在版本临上线前突然发现脚本未能覆盖全部场景,此时往往需要安排脚本的开发人员及骨干开发放下手上的工作,临时救场。
  • 。。。

针对遇到的问题,项目组在例会上时安排骨干开发人员来讲解脚本的作用及开发说明,但收效不明显。脚本中依然不断出现各式的问题,导致日常特性测试、数据库对象升级测试、性能测试过程中,测试人员和骨干开发人员花费大量时间来排查此类错误,极大的降低了团队的效率,相应的团队自身也很疲惫。

解决方法

经过分析,前述问题主要分为几类:

  • 注释不足,比如注释不全,缺少场景说明等;
  • 脚本维护中的低级错误,比如遗漏、语法错误、非法字符等;
  • 场景设计遗漏,场景考虑不全面,导致脚本实现不合理,不满足业务需求。

解决方案如下:

  • 注释不足。项目组周例会上宣讲脚本的注释要求,并指定专人负责检查脚本的规范符合度,不合要求的脚本直接要求提交人修改,同时作为关键事件通报批评;
  • 脚本维护中的低级错误。由于脚本比较多,代码量比较大,靠人去对比不太现实,因此利用MySQL备份工具mysqldump的能力,开发脚本对比工具来完成数据库表定义差异的对比,简化了人的操作,降低了脚本检查的工作量,人只需要查看报告即可以找到脚本中存在的问题。项目组指定专人负责阅读工具输出的报告,当发现脚本存在低级错误时,则要求提交人修改,同时通报批评;
  • 场景设计遗漏。修改当前的Story开发流程,增加专门章节,要求开发人员务必分析当前待开发特性在生产环境上线时的数据库对象升级策略;Story评审时,本章节作为必须评审的主题,如果开发人员未准备或者准备不足,测试人员有权要求Story重新评审,项目经理将此事件作为关键事件记录,迭代总结或者项目总结时将有专门议题要求开发人员作出解释。

脚本对比工具的工作流程比较简单,如下:

  1. 导出生产环境的数据库表结构定义,R.sql。
  2. 本地的数据库。
  3. 创建本地数据库DB_upgrade。
  4. 打开DB_upgrade,导入R.sql,同时导入本周内,从周一到周六的升级脚本,如无则直接跳过。
  5. 导出DB_upgrade的表结构定义,upgrade.sql。
  6. 创建本地数据库DB_install。
  7. 打开DB_install,导入全量数据库脚本,包括表定义、索引定义。
  8. 导出DB_install的表结构定义,install.sql。
  9. 使用工具对比upgrade.sql和install.sql。

工具开发过程中应用到了mysqldump、mysql、msys、jrunscript。

  • mysqldump,MySQL数据库自带的备份工具,通过指定选项可以只导出表定义。
  • mysql,MySQL数据库自带的客户端软件,用于执行脚本。
  • msys,有了它就可以在windows环境直接运行shell脚本。
  • jrunscript,JDK1.6版本起自带的js执行器,1.8版本还可以执行其它类型的脚本。shell虽然强大,但仍然有些工作不太方便完成,此时即可编写js代码来访问JDK中的API完成那部分操作,同时不需要引入更多的jar,使用时相当方便。

欢迎访问Jackie的家,http://jackieathome.sinaapp.com/,如需转载文章,请注明出处。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章