在理想的世界里,升级生产数据库的过程应该是经过精心打磨的,任何变更都可以在版本控制系统(VCS)中进行,经过严格的集成和测试,然后迅速且自信地部署到生产环境中,并有适当的回滚路线。然而,现实情况是,许多团队在发布数据库变更时,更像是在按下“Go”按钮的同时,默念着古老的咒语“请不要出错,请别出错”。与快速、自动化和可预测的过程相比,数据库部署更像是一个障碍,引发了许多最后一刻的问题,导致深夜疯狂重写代码,延迟向客户交付功能。
在最近的一篇文章中,Phil Factor描述了数据库持续交付的挑战和好处,特别指出,“如果团队开始早期部署,并继续完善他们的构建、测试和部署流程,最明显的好处就是可预测性。”如果数据库的持续交付是梦想,那么许多团队发布数据库变更的现实更像是“按下Go按钮的同时,默念着古老的咒语请不要出错”。与快速、自动化和可预测的过程相比,数据库部署更像是一个障碍,引发了许多最后一刻的问题,导致深夜疯狂重写代码,延迟向客户交付功能。
在这种混乱的发布之后,用户发现的bug和其他问题会周期性地引发“爆炸”。在这一点上,人们可能会想要绕过最初造成如此痛苦的“官方”部署流程,直接对生产数据库进行任何后续升级,尤其是那些“快速但紧急”的修复。即使存在可靠且自动化的部署流程,通过源代码控制完全测试任何规模的数据库变更也可能需要几个小时而不是几分钟。如果生产数据库应用程序中的bug直接影响到客户,因此,也影响到了整个业务,那么很可能会有强烈的需求立即进行修复,而不是几个小时后。
因此,在努力实现所有数据库部署都通过源代码控制完全自动化和测试的持续交付目标时,如何最好地应对现实,即要么没有设置数据库源代码控制,要么团队没有人一致使用数据库VCS,或者正在尝试,但还没有学会正确使用它。所以,虽然持续交付的目标是隧道尽头的光,但可能还没有到达入口。
以下是应该做的七件事,以“整理家”并避免在被迫进行直接生产升级时发生灾难,以应对那些在初始部署后出现的、对业务至关重要的数据库bug。
如果数据库甚至没有在源代码控制中,能做的最好的事情就是把数据库脚本和文件放入VCS。源代码控制使数据库开发更可靠、可审计,更容易部署。它提供了将帮助管理数据库复杂性的功能,随着它们的成长,使它们更容易维护。
如果团队没有一致地使用数据库源代码控制,以下是一些建议:团队应该能够从源代码控制中构建任何版本的数据库。这意味着生产数据库的“2.1.0.1”架构应该与VCS中的“2.1.0.1”架构完全匹配。如果被迫直接修改生产数据库,需要立即将更改重新整合到VCS中,以避免版本漂移。
没有想到这是一个许多人面临的问题,但不断听到由于在部署前没有进行数据库备份而使灾难加剧的故事。如果是一个大型数据库的紧急修复,并且正在运行企业版SQL Server,那么数据库快照可能是一个有用且更快的替代方案。
一位自由开发者告诉,他为一个客户工作,这个客户公然拒绝在部署前进行备份。当部署出现问题时,客户会回来找他,要求他恢复他们的系统。这种情况发生得如此频繁,浪费了他这么多时间,以至于他启动了一个“未经授权的备份制度”,现在已经无数次派上用场。教训很简单——在做出那个改变之前,进行数据库备份或快照!
换句话说,每个“向上”(迁移)脚本都需要一个“向下”(回滚)脚本。如果没有将数据库放在源代码控制中,回滚在所有意图和目的上都是保险单。有些人会告诉,如果有一个好的备份,就不需要回滚脚本,但这是坏建议。从备份中恢复是一个全有或全无的命题,当时间最重要时,可能会浪费大量时间;而且还会丢失自备份开始以来发生的所有数据更改。在对生产进行更改时,会想要在需要依赖它们之前,检查回滚脚本是否按照期望的方式工作。在飞机着火之前检查降落伞是否有洞。
当部署数据库更改到生产环境时,在BEGIN TRANSACTION….ROLLBACK TRANSACTION块内执行脚本。执行脚本(不包括ROLLBACK),验证对象和行的更改是否完全符合预期。如果符合,就提交;如果不符合,就回滚,并进行进一步的测试。请记住,如果数据库在线,这可能会导致对受影响表的并发事务阻塞。
GUI不是朋友。当然,它会在数据库设计和开发的日常过程中节省时间,但在部署数据库更改时,它会狠狠地反击。需要从完全记录的迁移脚本中工作,并将它们存储在VCS中。脚本驱动的部署是可重复的,更容易记录和检查。它们也不太可能出现人为错误(见第6和第7条建议)。当爆炸开始发生时,会感激在VCS中有更改脚本,团队中的任何人都可以快速参考。
“在机器上有效”在那些直接升级导致实时数据库性能严重下降时是不够的。必须有一些现实的测试环境,与实时数据在数量和分布上尽可能接近,可以在那里进行一些基本测试。否则,就没有办法知道更改在生产环境中的表现如何。
这与第6点相辅相成,因为没有人是完美的。如果可能的话,在部署之前,让某人检查计划推送到生产环境的内容。小错误可能会导致大问题。一些建议,为团队建立一些源代码实践的代码审查,它不难管理,但可以产生很大的不同。
如果想继续沿着数据库源代码控制的道路前进,这本电子书提供了概念的详细演练,包括代码示例。
下载免费电子书