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