Playframework 在生产环境中管理演进

Playframework 在生产环境中管理演进,playframework,playframework-2.1,production,self-hosting,Playframework,Playframework 2.1,Production,Self Hosting,我们正在使用play 2.1.1将一个新的应用程序部署到生产环境中,并且遇到了一些实际问题,而且非常有限的文档对我们帮助不大 所以是时候更新到一个新版本了,我们运行了通常的停止/升级/启动脚本,但是失败了。出于某种原因,play拒绝应用进化。开始的时候,它一直在说 哦,无法启动服务器@6elnj89fh:数据库“默认”需要改进 即使我们尝试通过命令行和application_prod.conf文件设置applyEvolutions.default=true,也会出现这种情况。它还抱怨说 警告!此

我们正在使用play 2.1.1将一个新的应用程序部署到生产环境中,并且遇到了一些实际问题,而且非常有限的文档对我们帮助不大

所以是时候更新到一个新版本了,我们运行了通常的停止/升级/启动脚本,但是失败了。出于某种原因,play拒绝应用进化。开始的时候,它一直在说

哦,无法启动服务器@6elnj89fh:数据库“默认”需要改进

即使我们尝试通过命令行和application_prod.conf文件设置
applyEvolutions.default=true
,也会出现这种情况。它还抱怨说

警告!此脚本包含可能是破坏性的向下演进

这对我来说没有多大意义,因为我们正在升级版本,所以无论如何都不应该应用down。但这似乎是它拒绝应用进化论的原因

在这一点上,我并没有那么担心,因为我认为有一些手动方式来应用进化。经过广泛的搜索,它看起来似乎。。。在第1场比赛中对此有支持,但在第2场比赛中没有。在开发模式下,你只需按下浏览器中的一个按钮就可以应用进化,但在prod模式下,我找不到手动应用进化的方法。这是真的还是我错过了?我真的认为这是一个重要的功能!(事后看来,我本可以手动应用脚本并禁用evolutions插件,但那样的话,我将失去有用的evolutions跟踪功能。)

我还想知道您将如何“支持”您的数据库,因为我相信我们将在某个时候需要这样做。如果有一种手动方式,它可能会有一个可选的版本参数来降级数据库。例如,如果您使用的是版本5,需要返回到版本4,则运行
播放apply evolutions 4
,然后应用版本5中的down并相应地更新evolutions db。我可以手动应用downs,但问题是evolutions db将再次处于无效状态

更绝望的是,我尝试了所有我能找到的设置来重新启动服务器,并添加了
-DapplyDownEvolutions.default=true
选项。我假设此设置仅在选择降级DB时应用向下(尽管似乎没有这样的选项),但实际上它所做的是应用向上,然后立即应用向下(我后来在故障排除中发现了这一点,因为服务器现在终于启动了——没有任何消息——但在访问站点时给出了一条神秘的错误消息)。这就是这个设置应该做的吗?如果是的话,我不明白为什么会有这个设置。我想不出有任何情况,在迁移到较新的数据库版本时,您希望先应用ups,然后立即应用downs。有人能解释一下这个设置吗

在这一点上,我终于可以通过手动重新运行适当的“UPs”让应用程序再次运行

在这一点上,我们正在致力于基本上重新编写脚本,用于我们自己处理进化,以便更好地控制运行的内容,并支持返回。能够使用播放功能将更好,因此我希望有人能够对此有所了解。如果没有,也许这篇文章可以帮助类似站点的人编辑:为播放2.5更新


我们从大约3年多以来一直在使用Play的演进进行生产,从未遇到过严重的问题

我建议您使用一个登台环境,在该环境中,您首先对测试数据库运行演进。测试数据库的版本应与生产数据库完全相同。您将在演进中出错,这是在它们进入生产服务器之前找到它们的一种方法

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

play.evolutions.db.default.autoApply=true
设置
autoApply
确保自动应用演进,而无需用户交互。显然,这是我们在升级生产数据库时所需要的

对于我们的登台/测试系统,我们启用了两种设置:

play.evolutions.db.default.autoApply=true
play.evolutions.db.default.autoApplyDowns=true
第二个设置
applyDownEvolutions
确保自动应用DOWNS evolutions。我们不希望在生产系统中使用此设置,因为这可能会导致数据丢失(因为DOWNS evolutions通常包含DROP TABLE等内容)

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

进化失败后的恢复 请记住,如果一个演进由于SQL错误而失败(在生产或测试系统上),您必须手动将数据库恢复到正常状态。您可以通过查看
play\u evolutions
表来执行此操作。play跟踪应用的演变及其错误。最后一个条目显示了上次应用的演变以及遇到的错误

从错误消息中,您通常可以跟踪错误的SQL并修复演进脚本。然后,您可以将数据库还原到以前的演进版本,并从
play\u evolutions
表中删除失败的演进条目。play然后认为新的演进尚未应用,并将再次运行它


希望这能有所帮助。

在什么情况下自动向下迁移会生效?我原以为只有在回滚代码时才会自动向后迁移。但是,由于向下迁移在部署的旧版本代码中不存在,我看不出Play何时知道运行它。向下演化应仅在上启用ion