生产数据库中的架构迁移?

Schema migrations in Production database?

我已经开始学习网络开发(具体来说是Flask和Django),无论在哪里,我看到的数据库总是从迁移开始。

根据我对更新数据库的理解,应该

  1. 运行 a "something to generate migrate script" 生成一个迁移脚本,它将区分您当前的模型文件和当前的数据库。
  2. 在您的本地数据库上测试迁移脚本。
  3. 提交迁移脚本,使其到达您的生产环境,其中 运行 脚本再次更新您的生产数据库。

但后来在维基百科上阅读 Schema Migrations link Schema Migration 我发现了以下文字:

schema migration is typically only used when the data held in the database is not real nor valuable, such as in software development, where developers work only with (possibly generated) test data.[citation needed] Programmatic schema migrations are almost never performed in production for the same reason.

它说应该避免生产中的迁移,那么你应该如何更新你的数据库?

我不知道维基百科文章的作者是从哪里得到这个想法的;根据历史,它已经在第一次修订中,对我来说,这种任意限制没有意义。

迁移数据库和程序版本是经常需要的,这意味着生产数据库也是必需的。我在这里不区分行中的数据和模式,因为这有点随意。从代码的角度来看,数据库是一种编码数据的方式,编码方案直接影响行中数据的模式和编码。

也许谈论此类迁移的风险是有意义的(生产数据库有时包含损坏数据、已被 运行 和 SQL 查询手动修改的数据等意外情况)或复杂性(如添加和删除外键)。但是我看到很多产品在发布新版本时会迁移数据和模式。

更新:我更新了维基百科页面,让我们看看编辑能持续多久:-)

我相信作者的意思是自动模式迁移应该只在开发阶段,在开发或测试环境中完成,因为在大型生产数据库中可能在架构迁移期间出现一些可用性或性能问题。

例如,在 MySQL 到 5.6 中,没有本地在线架构更改,因此您必须有一个 table 锁,而 ALTER TABLE 是 运行.如果它是一个小的 table,或者是一个带有生成数据的测试环境,那通常不是问题——一个小的会很快完成,你可以放弃一个测试 table 并重新生成数据——但是一个大的table 在生产环境中可能会被锁定数小时,如果不是数天或数周的话,导致系统无法进行涉及该 table 的任何交互。您必须采用替代的迁移方法来以最短的停机时间执行更改,并且它们的自动化既不简单也不安全。

是的,这很荒谬。模式迁移一直在生产数据库中完成。随着需求的变化,通常还需要更改底层数据库。 Django 和 Flask 都有执行数据库更新的路径,Django 在当前版本中是内置的 mirgrate 命令,而在以前的版本中是 South。 Flask/SQLAlchemy 有 alembic 用于处理架构更改。话虽这么说,它仍然可能是一种痛苦并且可能是危险的,所以测试测试并制定回滚计划。

是否通过生产中的迁移应用自动模式更改,基本上是组织的政策问题。数据价值较低的较新组织 and/or 较小的数据库倾向于使用这些 - 直到他们遇到迁移需要一天或更长时间甚至可能崩溃的情况。如果重要数据丢失,数据库更改策略通常会变得更加保守,并且不太可能由编写应用程序的开发人员驱动,而更多是由 DBA 或 DevOps 人员在层层审查后驱动。所以恕我直言,这些陈述反映了组织经验和成熟度,而不是绝对的。换句话说,它已经完成,直到它不起作用,然后其他一些过程就位。