我试图找出是否可以通过仅恢复主文件组来使 SQL Server 2016 Enterprise 数据库联机。我的场景是,我们有一个相当大的 OLTP 数据库,大约 2TB。大约 25% 的大小是一个“历史”表,顾名思义,它只是跟踪活动。
每天,这个数据库(在完全恢复模式下)都会被备份并恢复到其他几个环境中,在这些环境中它被用于各种,通常不是关键的目的。由于数据库大小,这个恢复过程很慢,而“历史”表显然是一个重要的贡献者。
尽管这个“历史”表需要存在于这些其他环境中(它被许多存储过程引用),但它不需要包含任何数据。我们只需要它存在,但它可以是空白的,或者理想情况下,只包含几千个最近的行(不是必需的)。
我实现这一目标的第一个想法是:
- 将“历史”表移动到辅助文件组(数据库当前只有一个主文件组)
- 仅对主文件组执行备份(这可能是额外的“copy_only”备份)。
- 将此备份还原到其他环境。
问题是,在第 3 步之后,我可以使数据库联机,但是,我显然无法引用“历史”表,因为它属于尚未恢复的 FG。如果这样做,我会收到预期的错误:
查询处理器无法为表或视图“历史”生成计划,因为该表位于未联机的文件组中。
所以我的问题是:
- 使用这种(或类似的)方法,我想要实现的目标是否可行?
- 在第 3 步之后,有没有办法可以“删除”辅助文件组并在主文件组中重新创建“历史”表的空白副本?这将允许依赖于它的存在(但不是它的数据)的应用程序/存储过程起作用。如果不先恢复辅助文件组,这似乎是不可能的。
- 有没有我没有考虑过的更好的方法?
注意 - 任何 FK 都不会引用“历史”表,因此不会因为那里没有数据而导致数据完整性问题。
我知道有“同步”多个数据库的替代方法,而不是备份/恢复(复制是一种)。不幸的是,这有点超出我的控制,所以现在,我想专注于备份/恢复方法。当然,我很高兴听到建议。
更新 - 需要明确的是,每个环境都需要数据库中的其余数据,但要减去“历史”表。
由于 JD 已经为您提供了一些关于替代方案的好建议,我将添加您如何具体实现您所要求的内容,如果您仍然认为这是解决您的问题的好方法,您可以使用它。
对于此示例,这是一个包含两个文件组的数据库:
现在我们在该数据库上创建两个表(每个位于不同的文件组中):
之后,我们备份我们稍后要恢复的文件组:
Users
您可以删除 Lab 数据库并仅使用我们的表恢复文件组:最后,在线拥有一张空
History
表的技巧:我知道您提到这有点超出您的控制,但是如果您根本不需要数据而只需要架构本身,那么在 2 TB 数据库上进行备份和恢复将是完成效率最低的方法到目前为止,您的目标可能有 10 个不同的选项。(您应该熟悉替代方案,并将其提请控制它的人注意。)
其中一些替代选项是复制(如您所述)、SSIS、使其他实例保持最新的SQL 代理作业、编写数据库脚本或使用DACPAC仅部署架构,这将是我的选择这是最简单的/最有意义的。(此外,如果您使用不同功能的限制是因为您不允许在服务器上设置任何内容,那么 DACPAC是一个已启用的功能,并且该过程比备份更简单,因为您只需使用SSMS为您生成文件,类似于如果您正在生成脚本。无需安装或设置任何东西。)
如果您的架构不经常更改,您甚至可以将数据库的一个空副本用作您的“模型”,它始终保持无数据并且可以轻松用于生成新数据库(即使您仍然坚持备份和恢复方法,因为它将是一个小型数据库)。或者即使它经常更改,您仍然可以仅备份和恢复到这个模型数据库,然后截断数据或使用DACPAC生成其他实例,这样您就不需要等待2 TB 多次恢复。