这似乎是一个不断回归每个Web应用程序的问题;您正在改进后端代码,并且需要更改数据库中的表才能执行此操作。在开发系统上手动执行没有问题,但是当您将更新的代码部署到生产服务器时,他们也需要自动更改数据库表。
我已经看到了处理这些情况的各种方法,所有这些方法都带来了好处和自身的问题。粗略地说,我有以下两种可能性;
专用更新脚本。需要手动启动更新。要求所有表格更改都按预定义的顺序完成(严格的发布计划,对数据库没有简单的快速修复)。通常需要维护单独的更新过程以及记录和管理版本号的某种方式。好处是它不会影响运行代码。
在运行时检查表属性并在需要时更改它们。不需要手动交互,表格更改可能以任何顺序发生(因此可以轻松部署数据库的快速修复)。另一个好处是代码通常更容易维护。显而易见的问题是它需要检查表属性的次数远远超过它所需要的。
在应用程序更新时是否有任何其他一般可能性或方法来处理更改数据库表?
答案 0 :(得分:1)
我会分享我所见过的最好的作品。它只是扩展你的第一个选择。
我在生产中更新模式时经常看到的步骤:
取下前端应用程序。这可以防止在架构更新期间写入任何数据。我们不希望写入失败,因为关系混乱或表突然与应用程序不同步。
可能会断开数据库连接,因此无法建立连接。有时使用您甚至不知道的数据库有代码!
按照第一个选项中的描述运行脚本。一定要仔细规划。您是正确的,需要预先定义的订单才能应用更改。此外,我经常会注意到您需要两组脚本,一组用于架构更新,另一组用于数据更新。例如,如果要添加不可为空的字段,可以先添加可空字段,然后运行脚本以输入默认值。
手头有回滚脚本。这是至关重要的,因为您可能会进行您认为需要的所有更改(因为它在开发中都很有效),然后发现应用程序在将其重新联机之前不起作用。有一个退出策略是好的,所以你不会在“糟糕的地方,我们打破了应用程序,我们已经离线了几个小时,我们做了什么?!”
确保准备好备份以防万一(4)真的坏。
协调应用程序更新和数据库更新。通常先进行数据库更新,然后再推出新代码。
(可选)很多公司都会进行部分推广测试。我从来没有这样做,但如果你有5个应用服务器和5个数据库服务器,你可以先推出1个应用程序/ 1数据库服务器,看看它是怎么回事。然后,如果你继续使用其他生产机器,那就好了。
找出最适合自己的方法肯定需要时间。根据我从事大量生产数据库更新的经验,没有灵丹妙药。最重要的是花时间和纪律跟踪变化(像你提到的版本控制)。