我们经常需要修改生产数据库的结构。在许多情况下,这些更改对应于引用新更改的代码库中的更改。
我们通常会在我们提取新的更改并运行新的SQL查询时最终建立一个失败的鲸鱼页面,但我有兴趣编写一个组件或其他东西来动态运行SQL查询,所以不需要停机时间。
我还没有尝试过,但这是我的计划:
IF EXISTS
之类的检查,因此它们只运行一次。我认为它也必须清除模型/持久性缓存。beforeFilter
。这是一个疯狂的想法吗?这是我的问题: A.这样的事情会起作用吗? B.有没有更好的办法让我失踪? C.我需要了解模型缓存以避免抛出错误。据推测,调试级别将设置为0(因为该站点将在生产中)。
顺便说一句,似乎有必要提一下我们不是在负载平衡系统上。我们在一台专用服务器上。
答案 0 :(得分:3)
这样的事情会起作用吗?
排序。您可能仍会遭受停机。即使只是在查询完成运行时短暂。如果站点在部署期间流量很大,您可能还会遇到并发问题。
有没有更好的方法来做到这一点,我错过了?
使用负载平衡系统,您可以一次更新一个系统,同时将流量转移到另一个系统,直到所有系统都更新为止。
你可以feature flag你的代码。在启用此功能之前,代码将不会运行。因此,启动代码并在数据库更新完成后启用该功能。
我需要了解哪些模型缓存可以避免抛出错误。
我对缓存不够熟悉,但缓存可能会提供网站可用的错觉。但任何动态请求(表单提交)仍可能导致错误。
顺便说一句,如果您还没有,请查看Schema Migrations。
答案 1 :(得分:0)
这样的事情会起作用吗?
我确信它会起作用,但是如果你用力足够的话,你也可以用钉子敲钉子。
有更好的方法吗?
Jason McCreary绝对是正确的,他的评论提到了代码不应该部署自己以及你应该使用部署过程 - 无论是(至少)自定义脚本,迁移,还是像我这样的自定义工具公司的工具BuildMaster,它将数据库部署作为一流的概念来处理。
使用这样的工具来充实你的过程将允许你轻松地逐步建立一个完全自动化的系统,这样你就可以添加你没有的负载平衡(或其他一些额外的基础设施)花费大量时间在整个地方更新部署过程。您还可以通过将部署代码放在应用程序代码中来规划回滚,高级部署方案和其他无法实现的很酷的事情。
具体而言,对于数据库部署,BuildMaster可以管理脚本,并在使用适当的部署操作时自动以相同的顺序部署它们。这将最大限度地减少您尝试手动运行它们时遇到的任何停机时间。您还可以设置停止/启动应用程序操作,以清除任何服务器端缓存。但是,总会出现ViewState或其他客户端持久性问题,但这完全是另一个问题。