【问题标题】:What are some good methods to push schema updates to end user databases?将模式更新推送到最终用户数据库有哪些好的方法?
【发布时间】:2012-08-03 15:52:37
【问题描述】:

这可能太宽泛了,但这是一个我有时间处理的问题。我们有一个分发给最终用户的应用程序。它运行在德比后端之上。我们可以相当轻松地推出代码更改,它会发送到我们的服务器,查看有新版本,下载,覆盖旧代码,然后重新启动。

但是,当我们更改代码时,我们也会更改 derby 数据库的架构。我们没有很好的方法来更新它。目前我们可以通过 FTP 推送 SQL 更新。当程序连接到 Internet 时,它会查找新的 SQL 文件,下载并运行它们。

很遗憾,我们的许多客户的互联网访问受限,因此他们会间歇性地获得这些更新。有时因为它们的变化足够大,它们的本地数据库模式与我们想要的不同步。或者他们通过 CD 获得代码更改,而不是 SQL 更改(有人将 CD 邮寄给他们)。

我一直在尝试创建一个 SOAP 服务,该服务可以提供模式的 XML 表示。到目前为止,这是一个巨大的 PITA。

人们目前使用哪些方法来维护这样的数据库?我觉得我不是第一个这样做的人,所以可能有比我正在做的更好的方法。

根据这里的一些 cmets,这里有一个更新: 基本上,我认为我们很早就没有遵守严格的数据库版本控制,所以我不知道每个人的数据库情况如何。很多人都建立了自定义安装(随意呻吟)。我需要一个工具来区分他们的数据库和“官方”副本之间的差异。

我已经构建了一个工具,它有点工作,但是有这么多……要跟踪的东西。

【问题讨论】:

    标签: sql database database-administration


    【解决方案1】:

    您能否将数据库更改作为代码更改的一部分进行分发?然后,当应用重新启动时,它会检查是否需要在数据库上运行任何更新。

    显然,您需要对数据库架构进行版本控制以避免多次应用相同的更新。

    我知道一些应用程序可以做到这一点(主要是在 Ruby 中,但也在 Java 中)。

    【讨论】:

    • 理想情况下是的,但问题是人们通过邮寄的 CD 获得了代码更改,而没有 SQL 更新。所以有些人处于这种我们不知道他们究竟需要什么更新的潮流中。我们正在逐一进行修复,但现在有数百名用户,这不是一种选择。
    • 我认为您遇到了未对架构进行版本控制的问题,所以现在您不知道您的客户需要哪些补丁。您可以(可能)编写一个脚本来检测哪个是模式的版本(例如,如果 x 列存在,则版本至少为 1.3),然后从那里运行更新模式的过程。我想说的是,无论您找到什么解决方案,您都可能真的想要开始对架构进行版本控制,以防止这种情况再次发生。
    【解决方案2】:

    如果您的应用程序中已有更新机制,可以下载程序以更改已安装的源代码,为什么不打包并运行架构更改作为升级过程的一部分?然后我将把更新作为 Java 应用程序的一部分运行。

    我的工作团队使用MyBatis Migration tool 处理这些更改,它将每个架构更改表示为包含“进行更改”和“回滚”步骤的单个迁移脚本。 changelog 表存储在数据库中,其中列出了已应用到该数据库的更新,这使得migrate 命令可以轻松确定在运行时需要应用哪些更新。这个特定工具可能仅在您控制数据库并能够运行 shell 命令和脚本来更改数据库时才真正有用,但您可以在您的方法中使用相同的概念 - 将每个模式更改打包为一个原子单元并运行它们从您的程序中将架构升级到当前版本,您可以在数据库本身中对其进行跟踪。

    【讨论】:

      【解决方案3】:

      您需要一个包含用户正在运行的数据库版本的表,然后您需要代码从版本 n 升级到版本 n+1。假设您有一个有权进行架构更改的数据库用户,您可以像现在应用代码更改一样应用架构更改。

      【讨论】:

        猜你喜欢
        • 2022-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        相关资源
        最近更新 更多