我们的IT商店首先开始建立一组DBA。我们所有人(包括我自己)都来自应用程序开发/建筑世界,因此DBA世界对我们来说仍然是新的。

除了构建DBA组外,我们还希望建立更改管理程序和流程(希望基于最佳实践),以便何时需要移动更改。

我找到了 以下帖子 这对主要触发,存储过程和/或DDL更改有用。但这不一定要解决索引或供应商数据库。

我们既有自己和供应商数据库的混合物。在我们的情况下,一些供应商(尽管不是全部)正在与我们的公司合作构建数据库和应用程序。我们正在进行性能测试我们的应用程序“上线”之前的应用程序。因此,我们正在大量分析索引(或缺乏索引)。

当我们遇到我们认为应该制定的索引时,对于我们自己的数据库和任何供应商,我们如何最好地处理变更管理?

您在商店做什么?我不担心工具,而不是这个过程。

编辑: 到目前为止,我感谢此问题的反馈,评论和答案。我注意到某些答案是特定于工具的。如果可以的话,我正在寻找更多的“不可知论”实践。

但是,如果不可能不可知,那么对于工具集,我们主要使用IBM DB2 LUW(实际上是在AIX上)。我们在Windows上有一些DB2和I(IBM i5/OS)的DB2,但我们主要是AIX DB2。我们确实使用源控制,特别是颠覆。

同样,寻找一般最佳实践,但上面是我们使用的特定于供应商的方法。

编辑: 当前决定: 我们打算跟踪我们的推理以及我们的变化。因此,我们将在发行跟踪软件(在我们的情况下是JIRA)中打开一个问题。现在,我们可以添加有关更改的优先级的文档,可以支持更改应该是什么,更改以及更改结果的结果。

然后,我们还打算跟踪我们在SVN中脚本的更改(就像下面建议的一样)。这样,我们可以跟踪哪个版本的存在。这可以记录在我们的JIRA问题(以及我们使用的任何其他审核软件中,即粘贴链接)。我们可以更确定地知道什么环境和原因发生了什么变化。然后,我们还可以跟踪索引是否是我们在供应商实施之外添加的索引,还是在实施之前等等。)

有帮助吗?

解决方案

我强烈建议您与处理应用程序代码相同的方式对待数据库。您可以将数据库拼写到其组件零件中,并将其检查到源控件中,然后使用与应用程序使用的相同标签和版本。

为了使对象进入源控件,您可以使用许多工具。微软有一个被昵称为数据花花公子的工具。它与Visual Studio合作。他们还准备再次与Visual Studio一起发布一种名为SQL Server数据库工具(SSDT)的新工具。我的公司Red Gate Software制作了一种工具,可与称为SQL源控制的SSM一起使用。

在过程方面,我为这本书写了几章 团队发展指南. 。它可以作为免费下载(或者想杀死一棵树,可以从亚马逊purcahse)。我详细介绍了有关在那里开发团队中数据库工作的更多详细信息。

其他提示

  1. 我们将数据库脚本维护为在版本控制下维护的应用程序代码库的一部分。但是,我们将不同的“流程”用于开发和生产代码

  2. 开发我们维护以下脚本:

    • base.sql-创建模式表和示例数据
    • stagingchanges.sql-更改base.sql,以供分期环境,主要是电子邮件地址,路径和其他可能更改的资产
    • prodchanges.sql-对生产部署的base.sql进行更改。对于新项目,我们通常可以在实际生产环境中测试这些项目
  3. 维护

    • base.sql-生产数据库的消毒版本
    • stagingchanges.sql和prodchanges.sql-如上所述
    • changerequest.sql(通常具有更改请求的ID),该架构适用于我们正在处理的当前更改请求的任何架构更改
    • changerequest-rollback.sql-逆转更改请求的更改,并将数据库重置为生产
    • 先前更改请求脚本的存档(文件夹)

因此,在维护模式下,我们要做的就是在部署过程中应用ChangerQuest.sql脚本进行生产

在数据库版本控制空间中使用5年(担任产品管理总监 dbmaestro)并在DBA工作了二十年之后,我可以告诉您一个简单的事实,即您在处理Java,C#或其他文件时无法处理数据库对象。

有很多原因,我会说几个:

  • 文件在本地存储在开发人员的PC上,更改为S/HE
    使得不要影响其他开发人员。同样,开发人员也不受同事的变化影响。在数据库中,这是
    (通常)不是这种情况,开发人员共享相同的数据库
    环境,因此对数据库进行的任何更改都会影响他人。
  • 发布代码更改是使用签入 /提交更改 /等完成的(取决于您使用的源控制工具)。那时,插入了开发人员本地目录的代码
    进入源控制存储库。想要获得的开发人员
    最新代码需要从源控制工具请求它。在
    数据库已经存在并影响其他数据,即使未签入存储库。
  • 在文件签到过程中,源控制工具执行冲突检查,以查看在修改本地副本时,其他开发人员是否修改了同一文件并由另一个开发人员进行了检查。同样,数据库中没有对此进行检查。如果您从本地PC更改过程,同时我会用代码形式修改相同的过程,那么我们互相覆盖对方的更改。
  • 代码的构建过程是通过将代码的标签 /最新版本输入空目录来完成的,然后执行构建 - 编译。输出是我们复制和替换现有的二进制文件。我们不在乎以前是什么。在数据库中,我们无法在需要维护数据时重新创建数据库!部署也执行在构建过程中生成的SQL脚本。
  • 执行SQL脚本(使用DDL,DCL,DML(对于静态内容)命令)时,您假设在创建脚本时,环境的当前结构与结构匹配。如果没有,那么您的脚本可能会失败,因为您尝试添加已经存在的新列。
  • 将SQL脚本视为代码并手动生成它们将导致语法错误,数据库依赖性错误,不可重复使用的脚本,这会使开发,维护,测试这些脚本的任务变得复杂。此外,这些脚本可能会在一个与您的环境不同的环境上运行。
  • 有时,版本控制存储库中的脚本与已测试的对象的结构不匹配,然后在生产中会发生错误!

还有更多,但我认为您得到了照片。

我发现有效的是:

  1. 使用强制版本控制系统,该系统在数据库对象上强制执行签出/签入操作。这将确保版本控制存储库匹配已签入的代码,因为它读取了入住操作中对象的元数据,而不是手动完成的分离步骤
  2. 使用利用基线作为比较的影响分析来识别冲突并识别更改(在源控制存储库和数据库之间比较对象的结构时)是一个真正的变化,它是从开发或来自原点的变化来源的。一条不同的路径,然后应跳过,例如不同的分支或紧急修复。

我写的一篇文章已发表 这里, ,欢迎您阅读。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top