我们的客户由于无懈可击的原因,无法使用SQL Server的内置备份功能,因为它会备份整个数据库。这些客户需要将数据库拆分并备份到拥有数据的子集中,以便相应的各方可以根据自己的规则备份自己的数据。我的问题有两方面:
我怀疑他们的意见是基于另一种基于访问的产品的经验,并将每个逻辑单元存储在一个可以简单复制的单独数据库中。
更新:我终于通过使用SMO备份“完整”数据库,恢复备份以及从备份中删除不属于子集的记录来实现此目的。我很失望地发现这导致事务日志在5分钟内增长到5GB以上。看起来像创建一个空数据库并且插入会更容易,但是如何在没有需要在数据库更新时更新的静态脚本的情况下复制模式?
答案 0 :(得分:1)
我可以理解为什么人们会这样做,这是为高级客户打开数据库的一种简单方法,让客户只能工作并乱搞自己的数据。他们可以使用它来创建自己的报告,可以直接访问数据源,并随心所欲地做任何事情。
我称之为“导出”和“导入”数据,而不是“备份”。但它玩的话。我们在一些系统中做了很多这样的出口。
在“如何”我必须获得更多信息,他们是否希望将其导出到另一台服务器,同一服务器,另一台数据库或其他东西?
可以通过夜间运行的作业或推送数据的服务来完成。其他工具也存在。也许使用DTE包在晚上运行或触发。 或者让程序在请求时获取数据。
编辑:回答评论:
在大多数情况下,我们删除现有的subsetdb,然后恢复一个空数据库,并用过滤后的数据填充它。另一种方法是仅备份完整,恢复为新数据库并删除不属于子集的行。
我认为subsetdb更像是一个带有统计数据的“只读”-db,所以你不必担心写更改等等。
答案 1 :(得分:1)
我完全理解公司为什么要这样做,特别是如果他们提供托管解决方案并在多个客户之间共享单个数据库或类似的东西。看起来像是通过customerId字段过滤掉记录并将它们放到一个文件中就行了,这就是它的结束......然而,他们却在这一点上惹火了。
如果不查看相关数据库,很难指出为什么这是一个坏主意。但是有一些人立即浮现在脑海中:
丢失事务日志备份。
自动递增ID不需要亲自插入“缺失”记录,并且在插入期间关闭IDENT功能和/或约束只是要求引用完整性问题。
共享数据怎么样?是否有多个客户使用的表格?当数据随时间变化时会发生什么...您将在哪里检索仅针对该数据的最新备份?它会如何影响生活在同一数据库中的其他客户?
外键...您必须分析所有表并确保首先插入没有外键的表。这不是不可能,但有很多错误的余地。
架构发生变化时会发生什么?如果您将所有这些数据作为单独的插入备份,那么它们将不再按原样运行,而不会重新匹配模式。
需要考虑各种各样的事情。就个人而言,如果我是他们,我会从整个数据库的单个SQL Server备份开始(更好的是,将他们的客户分成不同的数据库,而不是让他们共享一个大数据库),每天创建差异(或最好的时间表)符合他们的需要)。然后,作为一项附加服务,他们可以提供一些导出和导入数据的方法,无论是通过XML,CSV还是其他方式。允许客户通过导出执行数据备份,如果需要,他们可以随时重新导入,允许重复检查等。
使用这种方法,您始终可以保证有一种方法可以恢复符合Microsoft标准的备份。数据不是玩具,SQL Server不是什么都没有的东西......除了从数据库中提取数据并将其扔到SQL Server的备份过程中之外,还有很多东西。只是因为未能正确保护他们的数据而使整个公司陷入困境,最糟糕的是,大多数公司直到最后一刻才意识到他们的自定义备份过程在恢复时不起作用...... 哎哟
最后,但并非最不重要的是,可能有适合这项工作的工具。 Red Gate提供了许多出色的SQL Server工具,如SQL Server Compare,Data Compare和他们自己的自定义备份应用程序。无论如何,我会把它们作为最后的手段......
答案 2 :(得分:1)
简短的回答是,没有一种本地方式可以解决这个问题。
更长的答案是,如果您只使用架构创建了一个新数据库,然后从主数据库加载客户数据,则可以将较小的数据库备份到单个备份文件中并将其提供给它们。
SSIS可能是您最好的选择,因为您可以使用它的本机任务来获取所有表模式并将其创建为空,然后定义客户特定表的转换,然后循环查找表复制所有数据那些表格。
答案 3 :(得分:0)
您是否可以选择创建多个数据库?您可能能够推导出一个解决方案,其中一个“中央”数据库包含有效地将其他数据库的表联合在一起的视图。我知道有些网络过滤应用会这样做,当然,他们不会这样做更新。但它可能是可行的。在这种情况下,可以使用本机方式备份每个数据库。
答案 4 :(得分:0)
如果你真的必须做这样的事情那么可能最安全的方法是将子集数据的某些(复制,服务代理等)数据传输到他们自己的数据库中(每个可退出子集1分贝) 。然后你可以备份这些数据库。
因为你只处理我使用服务代理的子集,因为它保证不会丢失数据。