【问题标题】:Need a 10% Copy of my SQL Server Database for Development work需要我的 SQL Server 数据库的 10% 副本用于开发工作
【发布时间】:2018-09-05 12:12:23
【问题描述】:

我想在生产数据库中获取 10% 的数据副本,保持其完整性并将其还原到新数据库中。

是否有允许在 SQL Server 中完成此操作的方法?我已经研究过创建一个导出数据库架构和数据的 SSIS,然后执行行采样任务以减少流入新数据库的数据量,但我想知道是否有更好的方法来做到这一点?

【问题讨论】:

  • 10% 复制... 什么?表格或所有表格的内容?
  • 是的。所有表格和其中 10% 的数据。大约,由于依赖关系,这在某些表等中可能会更大。
  • 询问工具建议是题外话,而且您的问题太宽泛,因此您不太可能得到答案。尝试进行一些研究并解决问题,然后提出有关您遇到问题的具体问题,然后您将获得所需的帮助。我的建议是在源代码控制中编写一个空的开发数据库,​​并使用脚本填充虚拟数据以用于开发目的。查看dbup 我过去曾将其用于我的建议。
  • 根据您的建议,我已经更新了我的问题。

标签: sql-server sample-data copy-database-wizard


【解决方案1】:

这是一个很难的话题,确实需要一些工作。这里有几种方法,除了 HoneyBadger 指出的内容之外,我将添加一些内容。

首先,我知道 Data Bee 可以对数据库进行子集化,但这对您来说可能还不够。您可以试用一下,看看它是否有效。

其次,我通常建议您为开发领域(开发、测试、UAT 等)获取精选数据集,其中包含您需要解决的问题域的案例。有两种方法可以做到这一点。一种是数据虚拟化软件,这是 Redgate 在 SQL Clone、Delphix 和其他一些产品中使用的软件。这基本上复制了一次生产,然后将其共享给所有开发人员/质量保证/等。它减少了获取副本所需的大部分时间/存储空间。这会有所帮助。

另一种方法是构建数据集,这就是我为一些客户所做的。

如果您从事抵押贷款业务,正如 HoneyBadger 所指出的,您可能需要考虑固定贷款、可变 APR、各种条款等。通常最简单的方法是了解您的客户要求新功能的案例,或者业务分析师使用什么,然后将这些项目复制到新数据库中。这些可能是相对较少的交易数据行和所有查找类型的数据。

当您意识到自己错过了一些事情时,这也是一个持续的过程。将该数据库保存在 VCS 或已知位置,并将其用作系统的源。如果您的开发人员、构建系统、QA 都从这里提取,您将获得一组一致的数据。您可以使用随机数据(例如 Redgate 数据生成器)对其进行扩充,以帮助填充一些值。

加法方法通常比减法方法容易得多。因此,还要记住屏蔽/混淆敏感数据很重要。随着 GDPR 和其他立法的实施,我会更加小心。

披露:我为 Redgate Software 工作。

【讨论】:

  • 太棒了,谢谢你。我肯定会看看 Redgate 数据生成工具,因为我已经使用了其他几个产品。
【解决方案2】:

虽然与 SO 无关,但我确实想提供一些您可以遵循的准则:

我经常这样做,但主要是手工。首先,您必须确定数据库的“主要实体”是什么:它涉及人员、帐户、信用卡还是其他什么?我主要在金融部门工作,所以对我来说通常是账户/抵押贷款等。但它可以是任何东西,真的。 您必须决定数据库中的所有内容都与什么相关,可以说是“基本实体”。

一旦你决定了你的主要实体,你就可以选择你数据库的 10%。例如,如果您的主要实体是 Accounts,您可以从 Account 表中选择 10% 的 AccountId。这 10% 你可以放在一张桌子上。

接下来是艰苦的工作:您必须为每个表编写查询,将各自的实体与您的主要实体相关联。因此,如果您的主要实体是一个人,您需要所有这些人的地址、他们的所有帐户、他们的所有电话号码以及与他们相关的所有历史记录。这些查询可能会变得相当复杂,您确实需要很好地了解您的数据库。您会收到如下查询:

SELECT      Src.*
INTO        [dbo].[GTP_MSI_MORTGAGERELATION_MORTGAGE_RELATION]
FROM        [ATV].[GTP_MSI_MORTGAGERELATION_MORTGAGE_RELATION] AS Src 
INNER JOIN  atv.GTP_MSI_MORTGAGEREQUEST_APPLICANT APP
        ON  APP.MORTGAGE_RELATION_ID = Src.MORTGAGE_RELATION_ID
INNER JOIN  ATV.GTP_MSI_MORTGAGELOAN_LOAN MLL
        ON  MLL.MORTGAGE_REQUEST_ID = APP.REQUEST_ID
INNER JOIN  dbo.DOOR D
        ON  CONVERT(VARCHAR(255), D.NUMHYP) = MLL.LOAN_NUMBER

在此示例中,dbo.DOOR 表包含范围内的一系列mortgageId(该示例查找与抵押相关的所有个人/组织之间的所有关系)。

我最常做的是在某些模式中拥有生产数据(及时提取),并使用上述查询来填充 dbo 模式。因此,上面示例中的[ATV].[GTP_MSI_MORTGAGERELATION_MORTGAGE_RELATION] 将包含生产数据,而其同名的dbo 包含一组较小的生产数据(与范围内的抵押贷款相关的数据)。一旦我填充了 dbo 模式,我就可以使用匿名化软件(我倾向于使用 Red Gate Datagenerator)来删除私人/业务敏感信息。然后我可以提取匿名数据,并将其用作我的开发数据库的源。

另见this(不幸的是,目前只有荷兰语,但如果你把它推给翻译器,它仍然应该很有意义。)

【讨论】:

  • 感谢您为我指明了这个方向。我不反对编写人口脚本的艰苦工作。我想知道是否有更有效的方法来做到这一点。再次感谢您。
  • 有些事情你可以自动化来让事情变得更简单。我使用动态 SQL 为我编写大部分脚本,大多数关系都非常简单。一个表address 有一个列personId,你可能可以只加入一个person 表,PK 列Id(例如)。通常我必须完全手动编写大约 25% 的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多