管理生产环境中的演进

16
我们正在使用Play 2.1.1部署一个新应用程序到生产环境中,但是我们遇到了一些问题,有限的文档并没有帮助太多。因此,我们需要升级到一个新版本,运行通常的停止/升级/启动脚本,但失败了。由于某些原因,Play拒绝应用演进。启动时不断提示“Oops,无法启动服务器。@6elnj89fh:数据库'default'需要演进! ",尽管我们尝试通过命令行和在application_prod.conf文件中设置applyEvolutions.default=true,它还是报错。它还抱怨说:“警告!此脚本包含可能具有破坏性的DOWNS演化”,这对我来说毫无意义,因为我们正在升级版本,所以不应该应用downs。但似乎这可能是它拒绝应用演进的原因。
此时,我并不是很担心,因为我认为手动应用演进的方法。经过广泛搜索,看起来...在Play 1中支持此功能,但在Play 2中没有。在开发模式下,您可以只需按一下浏览器中的按钮即可应用演进,但在生产模式下,我找不到手动应用演进的任何方式。这是真的吗,还是我错过了它?我真的认为这是一个重要的特性!(回想起来,我可以手动应用脚本并禁用evolutions插件,但那样我就会失去有用的演进跟踪。)我也想知道如何“备份”数据库,因为我相信在某个时候我们需要这样做。如果有手动方式来完成它,可能会有一个可选的版本参数来降级数据库。例如,如果您在第5个版本,并且需要回到第4个版本,则运行play apply-evolutions 4,然后将应用从第5个版本开始的“downs”,并相应地更新演进数据库。我可以手动应用这些“downs”,但问题在于演化数据库将再次处于无效状态......
变得更加绝望,我尝试了所有能找到的设置来重新启动服务器,并添加了-DapplyDownEvolutions.default=true选项。我认为此设置仅会在选择降级数据库时应用“downs”(尽管似乎没有这样的选项),但它实际上做的是应用“ups”,然后立即应用“downs”(我稍后在故障排除中发现这一点,因为服务器现在最终启动了 - 没有任何消息 - 但在访问网站时给出了晦涩的错误消息)。这个设置是否就是它的预期功能?如果是的话,我不明白为什么要存在此设置。我想不出任何情况,您想在迁移到新的数据库版本时应用“ups”然后立即“downs”。有人能解释一下这个设置吗?
在这一点上,我最终通过手动重新运行相应的“ups”才能再次启动应用程序。
此时,我们正在基本上自己编写演进处理脚本,以更好地控制要运行的内容,并使其能够回退。使用play功能将会更好,因此我希望有人能提供更多信息。如果不能,也许这篇抱怨可以帮助遇到类似情况的人......

2
对于“我找不到手动应用演化的方法”,请点赞。 - Jarl
1个回答

17

编辑:已更新至Play 2.5


我们自己的生产环境中使用了 Play 的进化功能已经三年多了,这期间从未出现过严重问题。

我推荐建立一个类似于预发布环境的地方,先在测试数据库上运行进化程序。测试数据库应该与生产数据库完全相同的版本。你肯定会犯一些错误,而这种方式可以在将它们部署到生产服务器之前发现它们。

推荐设置

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

play.evolutions.db.default.autoApply=true

设置autoApply可以确保进化自动应用,无需用户交互。显然,在升级我们的生产数据库时,这就是我们想要的。

对于我们的 staging/testing 系统,我们两个设置都启用:

play.evolutions.db.default.autoApply=true
play.evolutions.db.default.autoApplyDowns=true

第二个设置applyDownEvolutions确保自动应用DOWNS evolutions。我们不希望在生产系统上开启它,因为它可能会导致数据丢失(因为DOWNS evolutions通常包含像DROP TABLE等的操作)。
但是,在测试系统中,如果您正在测试应用程序的不同分支或版本,您可能需要在新分支被测试时自动降级和升级数据库。

演进故障后恢复

请记住,如果一个演进由于 SQL 错误而失败(在生产或测试系统上),您必须手动将数据库恢复到健全状态。您可以通过查看play_evolutions表来实现这一点。在那里,Play 会跟踪已应用的演进及其错误。最后一个条目显示了最后一个应用的演进以及遇到的错误。
从错误消息中,您通常可以追踪到错误的 SQL 并修复您的演进脚本。然后,您可以将数据库还原到先前的演进版本,并从play_evolutions表中删除失败的演进条目。Play 然后认为新的演进尚未被应用,将再次运行它。
希望这有所帮助。

在什么情况下会触发自动向下迁移?我认为唯一需要自动向后迁移的时候是回滚代码。然而,由于旧版本的代码中不存在向下迁移,我无法看出Play何时知道要运行它。 - adamnfish
向下演化应仅在测试服务器上启用,并且仅在设置了 applyDownEvolutions 选项时才会运行。在启动时,它会检测到缺少的演化并将数据库降级。它知道如何进行向下迁移,因为它将向下演化存储在 play_evolutions 数据库表中。 - Chris
3
从Play 2.5开始,我认为设置应该是play.evolutions.db.default.autoApply=true - Jacob Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接