基于多系统数据库结构的复制/更新最佳实践

时间:2018-08-29 15:05:51

标签: sql sql-server database copying

因此,在搜索后没有找到类似的案例,我想打开一个新问题。 这样的话: 我们正在使用具有非常复杂的数据结构的大型数据库。另外,我们正在开发多个系统,以确保稳定性(开发,测试,质量和生产性),并且始终难以解决,因此在这些系统之间移动数据。正如我所说的,数据结构非常大,数据库内部也有很多逻辑。客户能够添加新的数据部分作为配置,并且还有静态收入的数据用于统计和监视。因此,让我用一个小例子来说明问题:

enter image description here

让我们以该数据库为例。我们有一些家庭互相竞争。他们将针对他们提出的观点创建一些统计数据。

  • 紫色表是固定配置。它们仅创建一次,只能通过操作员进行更改。这些更改将首先在开发系统中完成并进行测试。
  • 黄表正在更改配置。每个家庭都可以创建或删除多个竞赛并为其分配孩子。
  • 红色表只是纯数据。每次孩子得分时,都会在新行中添加金额,当前时间以及与孩子和比赛的关系。 该表将成为以后的统计信息的基础。

此数据库是在两个系统上开发的,一个是供家庭使用的高效系统,另一个是供程序员/操作员使用的开发系统。

在开发程序员的同时,会添加测试数据,例如儿童家庭竞赛和积分。在使用这些家庭时,将创建新的比赛并分配新的孩子,并填写积分表。

  • 有必要将新的/经过测试的/固定的族从开发复制到生产系统。
  • 还必须将竞赛,竞赛儿童作业和积分从生产者复制到开发系统中,以发现新的错误。
  • 此外,还必须能够更改开发系统上的表结构,并将此更改传递给生产系统。 (这不应该是这里的主要主题,有时它可能是一个很大的更改,以至于没有简单的方法,所以让这一点保持简单,但要牢记在心。)

我想将表的某些部分复制到另一个系统,但是能够忽略某些表(例如:Points),并且我想确保不要复制没有父母家庭的孩子,因此在其中没有“无父母”对象数据库。

问题:什么是一种省事的好方法?

我不需要针对特定​​数据库类型或某些脚本的解决方案。我正在寻找工具,库或良好实践。 (但请注意,我们正在使用mssql。)

我们目前正在为解决此问题制作工具(进展不顺利:不稳定,过于复杂,缓慢且有可能重新发明轮子)。

我知道很多开发人员都只是复制整个数据库(进行备份并将其运行到另一台服务器中),但这也造成了问题:正在复制用户并更改其GUID,因此他们释放了权限等。认为这是一个很好的解决方案。另外,数据库宕机了很长时间,而且从未经历过平稳的过程。

有时候,手动制作是最简单的方法,但是考虑到我们数据结构的大小,这不仅是一项繁重的工作,而且很容易出错。

所以我希望有人知道一种工具或类似的东西可以帮助我。

1 个答案:

答案 0 :(得分:2)

欢迎像数据库这样的有状态实体的发展之痛。 :) RedGate制作了一个称为SQL Source Control的工具,该工具非常适合将更改的数据和模式移至生产环境,并且可以与诸如GIT之类的源代码控制解决方案进行交互。它有点贵,但这是我发现的最好的。我在最后一个工作岗位上炮制了一个使开发人员与生产数据和开发人员变更保持最新的选择,这不是……不是百分百完美,而是总比没有好,而且免费。它是用Powershell开发的,它是这样的:

  1. 创建Pre-restore,Pre-dacpac和Post-dacpac SQL脚本来存储数据和 开发人员和产品之间的权限差异
  2. 使用SQLPackage.EXE制作Dev的DacPac(Dacpac基本上是db的xml架构, 数据)
  3. 执行预恢复过程(通常复制需要保留的测试数据)
  4. 通过Dev恢复产品
  5. 执行Pre-dacpac脚本(任何可能导致数据丢失的DDL都需要转到此处)
  6. 使用SQLPackage.EXE将步骤2中制作的DacPac应用于新还原的数据库
  7. 执行后Dacpac脚本(权限,恢复在步骤3中复制的数据)

再次,就像我说的那样,它可以将产品数据还原到我们的开发环境中并使其自动化,同时保持我们的开发变更完好无损,但是需要大量的维护和维护。另外,请记住,一旦您的数据库达到一定大小,由于需要花费大量的时间进行夜间还原,因此不再可行。