2

我们的客户出于无可争辩的原因不能使用 SQL Server 的内置备份功能,因为它备份了整个数据库。这些客户需要将数据库拆分并备份到拥有数据的人的子集中,以便相关方可以根据自己的规则备份自己的数据。我的问题有两个:

  1. 我该怎么做这样的事情?
  2. 您是否曾被要求像这样对备份进行分区?如果没有,您是否曾被要求做一些看似违背行业标准的事情?我们公司的人建议我们/我应该简单地“推出我们自己的”备份过程,只备份所需的数据子集。当然,这意味着我们/我应该简单地“推出我们自己的”恢复过程。当我认为这是重新发明轮子的定义以及我们首先选择 SQL Server 的部分原因时,我感觉到他们认为我是一个技术势利小人和/或懒惰的人。

我怀疑他们的意见是基于对另一个基于 Access 的产品的经验,并将每个逻辑单元存储在一个单独的数据库中,可以简单地复制。

更新:我终于通过使用 SMO 备份“完整”数据库、恢复备份以及从备份中删除不属于子集的记录来实现这一点。我很失望地发现这导致事务日志在 5 分钟内增长到 5GB 以上。似乎创建一个空数据库并插入会更容易,但是如何在没有更新数据库时需要更新的静态脚本的情况下复制模式?

4

5 回答 5

1

我明白为什么要这样做,这是一种为高级客户打开数据库并让客户只工作和处理自己的数据的简单方法。他们可以使用它来创建自己的报告,并直接访问数据源并使用它做任何他们想做的事情。

我称之为数据的“导出”和“导入”,而不是“备份”。但它是在玩文字游戏。在我们的一些系统中,我们经常进行这种导出。

在“如何”上,我必须了解更多信息,他们是否希望将其导出到另一台服务器、相同的服务器但另一个数据库或其他什么?

它可以通过夜间运行的作业或推送数据的服务来完成。为此也存在其他工具。也许使用在夜间运行或触发的 DTE 包。或者让一个程序在请求时获取数据。

编辑:回答评论:
在大多数情况下,我们删除现有的子集数据库,然后恢复一个空数据库并用过滤后的数据填充它。另一种方法是完全备份,恢复为新数据库并删除不属于子集的行。

我认为subsetdb更像是一个带有统计数据的“只读”-db,所以你不必担心重写更改等等。

于 2009-01-20T00:52:52.320 回答
1

我完全可以理解公司为什么要这样做,特别是如果他们提供托管解决方案并在多个客户之间共享单个数据库或类似的东西。似乎通过 customerId 字段过滤记录并将它们放到文件中就可以了,这就是它的结束......但是,他们在这个问题上搞砸了。

如果不查看有问题的数据库,就很难指出为什么这是一个坏主意。但有几个立刻浮现在脑海:

  1. 事务日志备份丢失。

  2. 自动递增 ID 不适合手动插入“丢失”记录,并且在插入期间关闭 IDENT 功能和/或约束只是询问参照完整性问题。

  3. 共享数据呢?是否有多个客户正在使用任何表格?当数据随时间变化时会发生什么……您将在哪里检索该数据的最新备份?它将如何影响生活在同一数据库中的其他客户?

  4. 外键...您必须分析所有表并确保首先插入没有外键的表。这不是不可能的,但有相当多的错误空间。

  5. 当架构改变时会发生什么?如果您将所有这些数据作为单独的插入进行备份,那么如果不匹配备份的模式,它们将不再按原样工作。

有各种各样的事情要考虑。就个人而言,如果我是他们,我会从整个数据库的单个 SQL Server 备份开始(更好的是,将他们的客户分开到不同的数据库中,而不是让他们都共享一个大数据库),每天创建差异(或任何最好的时间表符合他们的需求)。然后,作为一项附加服务,他们可以提供一些导出和导入数据的方法,无论是通过 XML、CSV 还是其他方式。允许客户通过导出对他们的数据进行备份,如果需要,他们可以随时重新导入,允许重复检查等。

使用这种方法,您始终可以保证您有一种恢复符合 Microsoft 标准的备份的方法。数据不是玩具,SQL Server 也不是一无是处的野兽……当涉及到 SQL Server 的备份过程时,不仅仅是从数据库中提取数据并将其扔到某处。整个公司可能会因为未能正确保护他们的数据而陷入困境,最糟糕的是,他们中的大多数人直到最后一刻才意识到他们的自定义备份过程在恢复时不起作用......哎哟

最后但并非最不重要的一点是,可能会有适合这项工作的工具。Red Gate 提供了许多出色的 SQL Server 工具,例如 SQL Server Compare、Data Compare 和他们自己的自定义备份应用程序。无论如何,我会把它们作为最后的手段......

http://www.red-gate.com/

于 2009-01-20T01:05:03.887 回答
1

简短的回答是没有本地方法来处理这个问题。

更长的答案是,如果您只使用架构创建了一个新数据库,然后从主数据库加载客户数据,您可以将较小的数据库备份到单个备份文件中并将其提供给他们。

SSIS 可能是您最好的选择,因为您可以使用它的本机任务来获取所有表模式并将它们创建为空,然后为客户特定的表定义转换,然后遍历查找表,复制所有这些表的数据。

于 2009-01-20T02:14:35.463 回答
0

您可以选择创建多个数据库吗?您可能能够得出一个解决方案,其中一个“中央”数据库包含有效地将其他数据库的表联合在一起的视图。我知道一些网络过滤应用程序会这样做,当然,他们不会以这种方式进行更新。但它可能是可行的。在这种情况下,每个数据库都可以使用本地方式进行备份。

于 2009-01-20T02:19:36.047 回答
0

好吧,如果您真的必须做这样的事情,那么可能最安全的方法是将子集 od 数据的某种数据传输(复制、服务代理等)到他们自己的数据库中(每个可备份子集 1 db)。然后您可以备份这些数据库。

因为您只处理子集,所以我会为此使用服务代理,因为它保证不会丢失数据。

于 2009-01-20T11:06:58.133 回答