如何管理生产数据库的模式升级?

时间:2008-08-27 08:36:37

标签: oracle database-administration

这似乎是一个被忽视的领域,可以真正使用一些洞察力。您的最佳做法是什么:

  • 进行升级程序
  • 出现错误时退出
  • 同步代码和数据库更改
  • 部署前的测试
  • 修改表的机制

等...

8 个答案:

答案 0 :(得分:8)

Liquibase

liquibase.org:

  1. 它了解hibernate的定义。
  2. 它比hibernate生成更好的架构更新sql
  3. 记录已对数据库进行的升级
  4. 它处理两步更改(即删除列“foo”,然后将其他列重命名为“foo”)
  5. 它处理条件升级的概念
  6. 开发人员实际上是在监听社区(如果你不在“in”人群中或者是新手,那就是hibernate - 你基本上被忽略了。)
  7. http://www.liquibase.org

答案 1 :(得分:6)

<强>看来

应用程序永远不会处理架构更新。这是一场等待发生的灾难。数据比应用程序更长,一旦多个应用程序尝试使用相同的数据(例如生产应用程序+报告应用程序),他们就有可能使用相同的基础公司库......然后两个程序都决定做他们自己的数据库升级...玩 混乱。

答案 2 :(得分:4)

一般来说,我的规则是:“应用程序应该管理它自己的架构。”

这意味着架构升级脚本是应用程序的任何升级包的一部分,并在应用程序启动时自动运行。如果出现错误,应用程序将无法启动,并且未提交升级脚本事务。这样做的缺点是应用程序必须具有对模式的完全修改访问权限(这会使DBA烦恼)。

我使用Hibernates SchemaUpdate功能管理表结构取得了巨大成功。保留升级脚本只处理实际数据初始化和偶尔删除列(SchemaUpdate不这样做)。

关于测试,由于升级是应用程序的一部分,因此测试它们将成为应用程序测试周期的一部分。

事后的想法:在这里接受其他帖子中的一些批评,注意规则说“它是自己的”。它仅适用于应用程序拥有模式的情况,通常是作为产品销售的软件的情况。如果您的软件与其他软件共享数据库,请使用其他方法。

答案 3 :(得分:4)

我是Red Gate产品的忠实粉丝,帮助创建SQL包以更新数据库模式。可以将数据库脚本添加到源代码管理中,以帮助进行版本控制和回滚。

答案 4 :(得分:3)

答案 5 :(得分:2)

这些都是重要的主题,但这是我的更新建议。

您没有指定您的平台,但对于NANT构建环境,我使用Tarantino。对于您准备提交的每个数据库更新,您可以创建更改脚本(使用RedGate或其他工具)。当您构建到生产环境时,Tarantino会检查脚本是否已在数据库上运行(它会向您的数据库添加一个表以便跟踪)。如果没有,则运行脚本。它不需要管理数据库版本的所有手动工作(读取:人为错误)。

答案 6 :(得分:1)

答案 7 :(得分:0)

Pat说,使用liquibase。特别是当你有几个开发人员拥有自己的开发数据库时 进行更改将成为生产数据库的一部分。

如果只有一个开发人员,就像我现在正在进行的一个项目(ha),我只是将架构更改作为SQL文本文件提交到CVS仓库中,我在生产服务器上批量检查代码变化进入。

但liquibase比那更有条理!