用于集成测试的SQL Server数据库快照


14

我正在尝试为集成测试定义一种使用测试数据库(在SQL Server中)的方法。

我的想法是在集成测试程序集启动时执行以下步骤:

  • 创建一个完全空的数据库
  • 运行“创建数据库对象”脚本以创建所有相关的数据库对象(表,视图,序列等)
  • 填写“基础数据”(查找值等)
  • 拍摄称为(db)_Basis“基准” 的数据库快照,以进行将来的集成测试

现在,在每个测试类(包含1-n个测试)之前,我打算简单地执行“从快照还原”以返回到数据库定义良好的或多或少的“空”状态。到目前为止,它就像一个魅力。

但是,有一组集成测试需要在大型测试数据库上进行操作-所以我希望在每个测试装置(具有n个单独测试的类)之前进行此操作

  • (db)_Basis快照还原数据库
  • 将那5万多行数据插入数据库
  • 创建另一个快照(db)_With_Testdata快照

然后对于每个测试,将数据库重置为定义良好的(db)_With_Testdata快照版本,运行测试,验证结果等等。

问题是:我似乎无法同时拥有两个数据库快照-一旦这样做,就无法将我的数据库还原到其中任何一个....我一直收到此错误:

消息3137,级别16,状态4,第9行
数据库无法还原。错误地指定了主要名称或快照名称,未删除所有其他快照或缺少文件。

消息3013,级别16,状态1,第9行
RESTORE DATABASE正在异常终止。

这真的就是SQL Server数据库快照的工作方式吗?似乎有严格的限制.....我会理解是否不能直接返回到原始的“(db)_Basis”快照-但是仅由于我现在有两个快照,我什至无法返回最新的一个?!?!?


插入50,000行需要多长时间?您可以重新申请吗?
RBarryYoung

Answers:


12

不幸的是,这是设计使然。

取自BOL页面“ 将数据库还原为数据库快照 ”:

局限性

在以下情况下,不支持还原:

  • 该数据库当前必须仅具有一个计划恢复到的数据库快照
  • 数据库中存在任何只读或压缩文件组。
  • 现在,所有文件都处于脱机状态,但在创建快照时处于联机状态

或者,您可以删除第一个快照(db)_Basis。我可以理解,这似乎很有局限性,但可以这样看:快照是基于原始数据文件的稀疏文件,因此还原到特定快照将使所有快照无效(通过还原操作将更改基本数据文件) 。该限制可能很烦人,但看起来并不合理。


4

另一个角度是进行备份并还原它们-因为您只是使用一些查找值创建空的数据库和架构。

而且,仅插入5万行,数据库就不会那么大。如果使用压缩,则备份大小也将减小。

您可以拥有一个TSQL Agent作业,也可以只有脚本(也许您可以创建存储过程,并根据获得的输出在测试后调用它)。

  • 基本备份- (db)_Basis
  • 使用testdata备份- (db)_With_Testdata

让您的集成脚本运行,并根据最终输出,您可以运行以上任一作业以恢复到所需的任何位置。

我觉得在您的方案中,备份/还原方法非常理想,因为您遇到数据库快照限制。此外,Paul Randal在博客中发布了有关SQL Server 2012之前含)的所有版本中的一个讨厌的错误的博客(不确定是否在以后的CU中修复了该错误)

还原到数据库快照时,将剥离源数据库的事务日志文件,并替换为带有两个0.25MB VLF的0.5MB日志文件。


是的,我们一直在使用备份/还原-但这是在5到7秒的范围内,而从数据库快照还原的时间大大低于1秒-这就是为什么我们正在寻找备份/还原的替代方法
marc_s

@marc_s对我来说,没有限制和错误的情况下,可以接受5-7秒,而具有限制和可能的错误则是1秒:-)
Kin Shah

对我们来说,这是不是可以接受的-我们正在寻找一个更快的解决方案
marc_s

@marc_s我明白你的意思是接受的。但是您已经在设计上遇到了限制。您只能使用1个快照,但仍需要备份才能还原。选择权由您决定-将单个快照(例如,与测试数据一起使用)并使用备份来还原到基础数据。
Kin Shah
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.