必须升级数据库架构使得安装新版软件变得更加棘手。这样做的最佳做法是什么?
我正在寻找行动项目的清单或时间表,例如
等,展示如何最大限度地降低风险和停机时间。
等问题特别感兴趣。
答案 0 :(得分:5)
我对此有很多经验。我的应用程序是高度迭代的,并且模式更改经常发生。我大约每2到3周进行一次生产发布,每个FogBugz列表中有50-100项清除。我们在过去几年中完成的每个版本都需要更改架构以支持新功能。
关键是在实际服务器上实际更改之前,在测试环境中多次练习更改。
我保留了一个部署清单文件,该文件是从模板中复制的,然后针对每个版本进行大量编辑,包含任何与众不同的内容。
我在数据库上运行了两个脚本,一个用于架构更改,一个用于可编程性(过程,视图等)。更改脚本是手动编码的,带有procs的脚本是通过Powershell编写的。更改脚本在所有内容都关闭时运行(您必须为此选择惹恼最少量用户的时间),并且它是手动命令运行,以防万一有什么奇怪的事情。我遇到的最常见问题是添加由于重复行而失败的唯一约束。
在准备集成测试周期时,我会在测试服务器上查看我的清单,就像该服务器是生产一样。然后,除此之外,我得到一个生产数据库的实际副本(这是交换你的异地备份的好时机),我在恢复的本地版本上运行脚本(这也很好,因为它证明了我的最新的备份是健全的)。我在这里一举杀死了很多鸟。
总共有4个数据库:
你真的,真的需要在生产时做到这一点。支持架构更改很难。
就修补程序而言,我只会修改程序,而不是架构,除非它是一个非常孤立的变化,对业务至关重要。
答案 1 :(得分:2)
我猜你考虑过Scott Ambler的读物? http://www.agiledata.org/essays/databaseRefactoring.html
答案 2 :(得分:1)
这是我刚刚在工作中谈论的话题。主要问题是,除非您的框架很好地为您处理数据库迁移,例如rails和它们的迁移脚本,否则它由您自己决定。
我们目前的做法有明显的缺陷,我对其他建议持开放态度。
这绝不是最佳选择,实际上并不打算作为“备份”数据库。它只是简单地推动生活,并使开发人员保持在同一页面上。就自动将sql文件应用到数据库而言,你可以用capistrano设置一些很酷的东西。
Db特定版本控制将非常棒。可能有一些东西可以做到这一点,如果没有,可能应该有。
答案 3 :(得分:1)
如果Scott Ambler的文章激起你的胃口,我可以推荐他的书Pramod J Sadolage称为“重构数据库” - http://www.ambysoft.com/books/refactoringDatabases.html
雅虎的敏捷数据库小组还提供了许多有用的建议和信息 - http://tech.groups.yahoo.com/group/agileDatabases/
答案 4 :(得分:1)
两个快速说明:
不言而喻......所以我会说两次 确认您有有效的备份 确认您有有效的备份。
@mk。查看数据库版本控制的Jeff's blog post(如果您还没有)