如何在开发,测试和生产中管理数据库?

Mat*_*ler 167 mysql svn

我很难找到如何在开发,测试和生产服务器之间管理数据库模式和数据的好例子.

这是我们的设置.每个开发人员都有一个运行我们的app和MySQL数据库的虚拟机.他们的个人沙箱可以随心所欲.目前,开发人员将对SQL模式进行更改,并将数据库转储到他们提交到SVN的文本文件中.

我们希望部署一个始终运行最新提交代码的持续集成开发服务器.如果我们现在这样做,它将从SVN为每个构建重新加载数据库.

我们有一个运行"候选版本"的测试(虚拟)服务器.部署到测试服务器目前是一个非常手动的过程,通常涉及我从SVN加载最新的SQL并进行调整.此外,测试服务器上的数据不一致.您最终得到了最后一个开发人员在沙盒服务器上提供的测试数据.

一切都崩溃的是部署到生产.由于我们无法使用测试数据覆盖实时数据,因此需要手动重新创建所有架构更改.如果有大量的架构更改或转换脚本来操纵数据,这可能会变得非常毛茸茸.

如果问题只是模式,那将是一个更容易解决的问题,但数据库中存在"基础"数据,在开发过程中也会更新,例如安全性和权限表中的元数据.

这是我在实现持续集成和一步构建方面遇到的最大障碍.如何解决呢?


后续问题:如何跟踪数据库版本,以便了解要运行哪些脚本来升级给定的数据库实例?Lance的版本表是否低于标准程序?


感谢您参考塔伦蒂诺.我不是在.NET环境中,但我发现他们的DataBaseChangeMangement维基页面非常有用.特别是这个Powerpoint演示文稿(.ppt)

我将编写一个Python脚本,它*.sql根据数据库中的表检查给定目录中脚本的名称,并根据构成文件名第一部分的整数按顺序运行那些脚本.如果这是一个非常简单的解决方案,我怀疑它会是,那么我会在这里发布.


我有一个工作脚本.如果数据库不存在,它会处理初始化数据库并根据需要运行升级脚本.还有用于擦除现有数据库和从文件导入测试数据的开关.这是大约200行,所以我不会发布它(虽然如果有兴趣我可能会把它放在pastebin上).

Lan*_*her 52

有几个不错的选择.我不会使用"恢复备份"策略.

  1. 编写所有架构更改脚本,让CI服务器在数据库上运行这些脚本.有一个版本表来跟踪当前数据库版本,并且只有在更新版本时才执行脚本.

  2. 使用迁移解决方案.这些解决方案因语言而异,但对于.NET,我使用的是Migrator.NET.这允许您对数据库进行版本控制,并在不同版本之间上下移动.您的架构在C#代码中指定.


tbr*_*fni 28

您的开发人员需要为他们处理的每个错误/功能编写更改脚本(架构和数据更改),而不仅仅是将整个数据库转储到源代码控制中.这些脚本将当前生产数据库升级到开发中的新版本.

您的构建过程可以将生产数据库的副本还原到适当的环境中,并从源代码控制上运行所有脚本,这将使数据库更新为当前版本.我们每天都这样做,以确保所有脚本都正确运行.


Juh*_*älä 13

看看Ruby on Rails是如何做到这一点的.

首先是所谓的迁移文件,它基本上将数据库模式和数据从版本N转换为版本N + 1(或者在从版本N + 1降级到N的情况下).数据库有表告诉当前版本.

在单元测试之前,测试数据库总是被擦除干净,并且用文件中的固定数据填充.


Esk*_*ola 10

" 重构数据库:进化数据库设计 "一书可能会为您提供有关如何管理数据库的一些想法.http://martinfowler.com/articles/evodb.html上也提供了简短版本

在一个PHP + MySQL项目中,我已将数据库修订号存储在数据库中,当程序连接到数据库时,它将首先检查修订.如果程序需要不同的修订版,它将打开一个用于升级数据库的页面.每个升级都在PHP代码中指定,这将更改数据库架构并迁移所有现有数据.


Rad*_*Rad 5

您还可以考虑使用SQL Compare 之类的工具来编写不同版本数据库之间的差异的脚本,从而使您可以在版本之间快速迁移


Yor*_*iev 5

  • 如下命名数​​据库- dev_<<db>> , tst_<<db>> , stg_<<db>> , prd_<<db>>(显然,您永远不应该对数据库名称进行硬编码
  • 因此,您甚至可以在同一台物理服务器上部署不同类型的数据库(我不建议这样做,但是如果资源紧张,您可能必须...)
  • 确保您将能够自动在这些数据之间移动数据
  • 从填充中分离数据库创建脚本=应该总是有可能从头开始重新创建数据库并填充它(从旧的数据库版本或外部数据源
  • 不要在代码中使用硬编码连接字符串(即使在配置文件中也不使用)-在配置文件中使用连接字符串模板(您会动态填充),需要重新编译的application_layer的每个重新配置都是BAD
  • 确实使用数据库版本控制和数据库对象版本控制-如果您负担得起的话,请使用现成的产品,如果不是自己开发某些产品
  • 跟踪每个DDL更改并将其保存到一些历史记录表中(此处示例
  • 每日备份!测试您能够多快地恢复备份中丢失的内容(使用自动还原脚本)
  • 即使您的DEV数据库和PROD具有完全相同的创建脚本,您也会在数据方面遇到问题,因此允许开发人员创建prod的确切副本并使用它(我知道我会收到与此有关的弊端,但是在思维定势和业务流程将使您的成本降低很多-强迫编码人员合法地进行标刻,但要确保这一点