基于多系统数据库结构的 copying/updating 最佳实践
Multi System Database structure based copying/updating best practice
所以在搜索后没有找到类似的案例我想打开一个新问题。
情况是这样的:
我们正在处理一个具有非常复杂数据结构的大型数据库。此外,我们还在多个系统上工作以确保稳定性(开发、测试、质量和生产力),这始终是一场斗争,因此在这些系统之间移动数据。正如我所说,数据结构非常大,数据库内部也有很多逻辑。客户可以添加新的数据部分作为配置,也有数据的静态收入,用于统计和监控。那么让我用一个小例子来解释这个问题:
让我们以这个数据库为例。我们有一些家庭互相比赛。他们将创建一些关于他们所做的点的统计数据。
- 紫色Table是固定配置。它们被创建一次,并且只能通过操作员进行更改。这些更改将首先在开发系统中完成和测试。
- 黄色 Table 正在更改配置。每个家庭都可以创建或删除多个比赛并分配他们的孩子。
- 红色 Table 只是普通数据。每次孩子得分时,都会添加一个新行,其中包含数量和当前时间以及与孩子和比赛的关系。
这个table会作为后面统计的基础
这个数据库是在两个系统上开发的,一个是家庭使用的生产系统,另一个是 programmers/operators 使用的开发系统。
在开发过程中,程序员将添加测试数据,如儿童家庭竞赛和积分。在使用家庭的同时,将创建新的比赛并分配新的孩子,并将填补积分 table。
- 需要将 new/tested/fixed 系列从开发系统复制到生产系统。
- 还需要将Contests、Contest-Kid-Assignments和Points从生产系统复制到开发系统,以发现新的错误。
- 还必须可以在开发系统上更改 table 结构并将此更改传输到生产系统。 (这不应该是这里的主题,有时它可能会发生如此大的变化,以至于没有简单的方法,所以让这一点保持简单,但请牢记。)
我想将 table 的部分内容复制到另一个系统,但可以忽略一些 table(例如:积分),并且我想确保在没有复制的情况下不会复制孩子他们的 parent 家族,所以数据库中没有 "parentless" object。
问题:什么方法既好又省事?
我不需要特定数据库类型或某些脚本的解决方案。我正在寻找工具、库或良好实践。 (但请注意,我们使用的是 mssql。)
我们目前正在为这个问题制作一个工具(进展不顺利:unstable,过于复杂、缓慢并且可能重新发明轮子)。
还有很多我认识的开发者只是复制整个数据库(制作备份然后 运行 到另一台服务器)但这也造成了问题:用户被复制并且他们的 guid 改变所以他们松散权限等。我认为这不是一个好的解决方案。此外,数据库已关闭很长时间,而且过程从来都不是一帆风顺的。
有时手动制作是最简单的方法,但考虑到我们的数据结构的大小,这不仅是一项巨大的工作,而且很可能会出错。
所以我希望有人知道一个工具或类似的东西来帮助我。
欢迎来到像数据库这样的有状态实体的开发过程中。 :) RedGate 制作了一个名为 SQL Source Control 的工具,它非常适合将更改的数据和 Schema 移动到生产环境中,并且它可以与 GIT 等源代码控制解决方案交互。它有点贵,但它是我发现的最好的。让开发人员与产品数据和开发人员更改保持同步的一种选择是我在上一个工作地点编造的,它……不是 100% 完美,但总比没有好,而且是免费的。它是在 Powershell 中开发的,它是这样的:
- 创建预还原、预 dacpac 和 Post-dacpac SQL 脚本来存储数据和
dev 和 prod 之间的权限差异
- 使用SQLPackage.EXE制作Dev的DacPac(Dacpac基本上是db的xml模式,不
数据)
- 执行Pre-restore Proc(经常拷贝出需要持久化的测试数据)
- 通过开发恢复产品
- 执行pre-dacpac脚本(任何可能导致数据丢失的DDL都可能需要到这里)
- 使用SQLPackage.EXE将步骤 2 中制作的 DacPac 应用到新恢复的数据库
- 执行Post-Dacpac脚本(权限,恢复步骤3复制的数据)
再次,就像我说的,它可以自动将产品数据恢复到我们的开发环境中,同时保持我们的开发更改完好无损,但它需要大量的维护和维护。另外,请记住,一旦您的数据库达到一定大小,由于恢复需要时间,每晚进行恢复就不再是一个可行的选择。
所以在搜索后没有找到类似的案例我想打开一个新问题。 情况是这样的: 我们正在处理一个具有非常复杂数据结构的大型数据库。此外,我们还在多个系统上工作以确保稳定性(开发、测试、质量和生产力),这始终是一场斗争,因此在这些系统之间移动数据。正如我所说,数据结构非常大,数据库内部也有很多逻辑。客户可以添加新的数据部分作为配置,也有数据的静态收入,用于统计和监控。那么让我用一个小例子来解释这个问题:
让我们以这个数据库为例。我们有一些家庭互相比赛。他们将创建一些关于他们所做的点的统计数据。
- 紫色Table是固定配置。它们被创建一次,并且只能通过操作员进行更改。这些更改将首先在开发系统中完成和测试。
- 黄色 Table 正在更改配置。每个家庭都可以创建或删除多个比赛并分配他们的孩子。
- 红色 Table 只是普通数据。每次孩子得分时,都会添加一个新行,其中包含数量和当前时间以及与孩子和比赛的关系。 这个table会作为后面统计的基础
这个数据库是在两个系统上开发的,一个是家庭使用的生产系统,另一个是 programmers/operators 使用的开发系统。
在开发过程中,程序员将添加测试数据,如儿童家庭竞赛和积分。在使用家庭的同时,将创建新的比赛并分配新的孩子,并将填补积分 table。
- 需要将 new/tested/fixed 系列从开发系统复制到生产系统。
- 还需要将Contests、Contest-Kid-Assignments和Points从生产系统复制到开发系统,以发现新的错误。
- 还必须可以在开发系统上更改 table 结构并将此更改传输到生产系统。 (这不应该是这里的主题,有时它可能会发生如此大的变化,以至于没有简单的方法,所以让这一点保持简单,但请牢记。)
我想将 table 的部分内容复制到另一个系统,但可以忽略一些 table(例如:积分),并且我想确保在没有复制的情况下不会复制孩子他们的 parent 家族,所以数据库中没有 "parentless" object。
问题:什么方法既好又省事?
我不需要特定数据库类型或某些脚本的解决方案。我正在寻找工具、库或良好实践。 (但请注意,我们使用的是 mssql。)
我们目前正在为这个问题制作一个工具(进展不顺利:unstable,过于复杂、缓慢并且可能重新发明轮子)。
还有很多我认识的开发者只是复制整个数据库(制作备份然后 运行 到另一台服务器)但这也造成了问题:用户被复制并且他们的 guid 改变所以他们松散权限等。我认为这不是一个好的解决方案。此外,数据库已关闭很长时间,而且过程从来都不是一帆风顺的。
有时手动制作是最简单的方法,但考虑到我们的数据结构的大小,这不仅是一项巨大的工作,而且很可能会出错。
所以我希望有人知道一个工具或类似的东西来帮助我。
欢迎来到像数据库这样的有状态实体的开发过程中。 :) RedGate 制作了一个名为 SQL Source Control 的工具,它非常适合将更改的数据和 Schema 移动到生产环境中,并且它可以与 GIT 等源代码控制解决方案交互。它有点贵,但它是我发现的最好的。让开发人员与产品数据和开发人员更改保持同步的一种选择是我在上一个工作地点编造的,它……不是 100% 完美,但总比没有好,而且是免费的。它是在 Powershell 中开发的,它是这样的:
- 创建预还原、预 dacpac 和 Post-dacpac SQL 脚本来存储数据和 dev 和 prod 之间的权限差异
- 使用SQLPackage.EXE制作Dev的DacPac(Dacpac基本上是db的xml模式,不 数据)
- 执行Pre-restore Proc(经常拷贝出需要持久化的测试数据)
- 通过开发恢复产品
- 执行pre-dacpac脚本(任何可能导致数据丢失的DDL都可能需要到这里)
- 使用SQLPackage.EXE将步骤 2 中制作的 DacPac 应用到新恢复的数据库
- 执行Post-Dacpac脚本(权限,恢复步骤3复制的数据)
再次,就像我说的,它可以自动将产品数据恢复到我们的开发环境中,同时保持我们的开发更改完好无损,但它需要大量的维护和维护。另外,请记住,一旦您的数据库达到一定大小,由于恢复需要时间,每晚进行恢复就不再是一个可行的选择。