管理生产环境的演变

Kri*_*fer 14 production self-hosting playframework playframework-2.1

我们正在使用play 2.1.1将新应用程序部署到生产环境中,并且正在解决它的一些实际问题,并且非常有限的文档没有多大帮助......

所以是时候更新到新版本了,我们运行了常用的停止/升级/启动脚本,但是它们失败了.出于某种原因,游戏拒绝应用演变.开始时一直说

哎呀,无法启动服务器.@ 6elnj89fh:数据库'默认'需要进化!

即使我们尝试applyEvolutions.default=true通过命令行和application_prod.conf文件设置它们.它还抱怨说

警告!此脚本包含可能具有破坏性的DOWNS演变

这对我来说没有多大意义,因为我们在版本上升所以不应该应用下降.但似乎这可能是它拒绝应用演变的原因.

在这一点上,我并不那么担心,因为我认为有一些手动方式来应用进化.经过广泛的搜索后,它看起来好像......在游戏1中有支持,但在游戏中没有.2.在开发模式下,您只需按下浏览器中的按钮即可应用演变,但在生产模式下我找不到任何方式手动应用进化.这是真的还是我错过了?我真的认为这是一个重要的功能!(在后面的视线中我可以手动应用脚本并禁用evolutions插件,但之后我会丢失evolutions跟踪,这很有用..)

我也想知道你将如何"支持"你的数据库,因为我相信我们会在某些时候需要做到这一点.如果有一种手动方式来执行此操作,则可能会有一个可选的版本参数来降级数据库.例如,如果您处于版本5并且需要返回到4,那​​么您将运行play apply-evolutions 4该版本,然后应用版本5的版本并相应地更新evolutions db.我可以手动应用下降,但问题是进化db将再次处于无效状态...

越来越绝望我尝试了所有我能找到的设置再次启动服务器并添加了-DapplyDownEvolutions.default=true选项.我假设这个设置仅在选择降级数据库时会应用下降(虽然似乎没有这样的选项)但实际上做的是应用ups然后立即应用下降(我在故障排除后发现这个服务器现在终于启动了 - 没有任何消息 - 但在访问该站点时给出了一个神秘的错误消息).是这个设置应该做什么?如果是,我无法理解为什么设置甚至存在.我想不出任何你希望在迁移到更新的数据库版本时应用ups然后立即降低的情况.有人可以对这个设置有所了解吗?

此时,我终于可以通过手动重新运行相应的"UP"来再次运行应用程序.

在这一点上,我们正在努力为我们自己的演进处理基本上重新编写脚本,以便更好地控制运行的内容并启用返回..为此能够使用播放功能会更好我希望有人可以对此有所了解.如果没有,也许这个咆哮可以帮助处于类似情况的人......

Chr*_*ris 16

编辑:已更新为Play 2.5


我们大约3年多时间一直在使用Play的生产演变,从未遇到过严重的问题.

我建议您使用暂存环境,首先针对测试数据库运行演进.测试数据库应具有与生产数据库完全相同的版本.您将在演变中犯错误,这是在他们进入生产服务器之前找到它们的一种方法.

推荐设置

对于我们的生产系统,我们启用了以下设置:

play.evolutions.db.default.autoApply=true
Run Code Online (Sandbox Code Playgroud)

该设置autoApply可确保自动应用演变,无需用户交互.显然,这是我们在升级生产数据库时所需要的.

对于我们的暂存/测试系统,我们启用了两个设置:

play.evolutions.db.default.autoApply=true
play.evolutions.db.default.autoApplyDowns=true
Run Code Online (Sandbox Code Playgroud)

第二个设置applyDownEvolutions确保自动应用DOWNS演变.我们不希望在我们的生产系统上使用它,因为它可能导致数据丢失(因为DOWNS演变通常包含DROP TABLE等).

但是,在测试系统上,如果您正在测试应用程序的不同分支或版本,则可能需要在不同的数据库版本之间切换.在这种情况下,您可能希望在测试新分支时自动关闭和升级数据库.

在演变失败后恢复

请记住,如果一个进化由于SQL错误(在生产或测试系统上)而失败,则必须手动将数据库恢复到理智状态.您可以通过查看play_evolutions表格来完成此操作.Play会跟踪应用的演变及其错误.最后一个条目显示最后应用的进化以及遇到的错误.

从错误消息中,您通常可以追踪错误的SQL并修复您的evolutions脚本.然后,您可以将数据库还原到先前的evolution版本,并从play_evolutions表中删除失败的evolution条目.然后Play认为新的进化尚未应用,并将再次运行.

希望这可以帮助.

  • 从Play 2.5开始,我认为设置是`play.evolutions.db.default.autoApply = true` (3认同)