在阅读了几篇文章之后,我意识到开发团队中的数据库版本控制实际上非常重要。
到目前为止,每次有更新时我都使用简单的dump whole database
,如果只有1个表被更改,有时我们可以通过转储单个表然后重新导入来逃脱。不是最好的,但效果很好,对于添加剂的改变,我们还没有任何打嗝。
现在,我将.mwb (Mysql Workbench diagram)
文件保存在我正在处理的项目的git存储库中。
然后我还使用dbv和schema management
以及git,每个分支都根据项目命名,并且它运行得很好。这允许我通过恢复或回滚的功能对原理图进行版本更改。
然而,表中包含的数据如何。怎么能保持这个?也许我只是坚持使用旧方法。我理解具有相同数据库结构但不同数据的项目,但是具有特定数据库数据的站点需要进行版本控制和管理。
另外,已经部署过的需要更改数据库的站点的基础如何,这是如何无缝的。有些人建议使用更新/更改脚本,并且可以使用默认值等。但是,如果我在网站平台上进行了更改,需要更改每个网站数据库并保持数据完好无损呢?
答案 0 :(得分:1)
我主要从事业务应用程序开发和配置管理。您的问题代表了这种环境中的挑战;当您升级实例Microsoft Word时,您不需要立即将所有文档从doc更改为docx。并且文档甚至具有更简单的结构和完整的关系数据库。
商业应用程序不是这样;用户跳过版本,对数据模型进行未经授权的更改,系统需要继续运行并提供正确的数字......
我们用于我们自己的应用程序(最大的一个就像600个表)一个自行开发的CASE工具,包括分支/合并,但这种方法也可以手动完成。
可以以结构化方式记录数据模型。例如,作为表内容(要在带有元数据的表中加载的CSV)或作为检测正在使用的版本的代码,并在缺失时添加列和表,包括非平凡的迁移。
这甚至允许多个用户同时更改数据模型。
当您使用自动检测时(例如,我们使用名为&#34的调用; verify_column"而不是" add_column"),这甚至允许平滑迁移,与客户的版本号无关正在开始升级。这样的过程分析要更改的表,并在列缺失时发出alter table t1 add col1 number not null
的正确DDL,或者当列已存在但可以为空时发出alter table t1 modify col1 not null
。
对于Oracle和SQL Server,我可以为您提供一些示例程序。在MySQL中,我会使用客户端语言对其进行编码,最好是独立于OS,以允许安装在Windows和Linux上运行。如果您有经验,可以使用Apache Ant。
我们将表分为四类:
类别表格的内容' S' (种子数据)置于版本控制之下。我们通常将这些作为元数据注册在我们的案例工具中,然后命名为“数据集”,但您也可以使用例如Microsoft Excel甚至代码。
例如,在Excel中,您将获得种子数据行的列表。在A列中,您可以输入像=B..&"|"&C..& "|" & ...
这样的Excel函数,它连接所有内容并使其适合加载工具加载。
例如,在代码中,您可能会进行如下调用:
verifySeed('TABLE_A', 'CODE', 'VALUE')
在版本控制下,Excel有点难以允许多个用户同时更改内容。使用代码的方法非常简单。
请记住还要添加功能以删除过时的种子数据。例如,通过明确列出过时的种子数据或自动删除表中存在但未被上次安装触及的所有种子数据。
答案 1 :(得分:0)
您需要在数据模型上保留与代码版本同步的事务日志。对于每个添加信息的更新(即新字段),您只需输入“ALTER TABLE x ADD COLUMN y ...”之类的语句,并在更新脚本中提供DEFAULT VALUE(可能带有函数)。下载脚本的'ALTER TABLE x REMOVE COLUMN y ...'。在截断表中的信息之前,您需要导出数据。您可以将转储的表数据转换为SQL以进行反向事务,以便您可以使用这些数据添加缺少的信息。
您可以在数据模型中使用“日记”表,使用表示应用脚本的简单序号来跟踪这些事务。无论何时安装软件,它都可以比较这些数字以创建一个事务列表,以便将数据库从状态N移动到状态X,向后或向前移动,而不会丢失任何数据!