将SQL Server数据库返回到时间点的最快方法是什么?

将SQL Server数据库返回到时间点的最快方法是什么?,sql,sql-server,sqlcmd,Sql,Sql Server,Sqlcmd,业务问题:我们希望在已知状态下运行一系列自动化测试,每个测试针对一个数据库 现在,我所知道的确保数据库在测试开始时处于原始状态的最佳方法是在每次测试之前从.bak备份文件中恢复数据库,但这很慢 有没有更快的办法 我们使用的是SQL Server 2016,主要是.NET技术 (注意:我知道有更多以数据库为中心的论坛,但因为我是从开发人员的角度出发,所以从这里开始似乎是合理的。)似乎可以以最小的开销完成我想要的 创建快照: CREATE DATABASE t19314_ss ON ( NAME

业务问题:我们希望在已知状态下运行一系列自动化测试,每个测试针对一个数据库

现在,我所知道的确保数据库在测试开始时处于原始状态的最佳方法是在每次测试之前从
.bak
备份文件中恢复数据库,但这很慢

有没有更快的办法

我们使用的是SQL Server 2016,主要是.NET技术

(注意:我知道有更多以数据库为中心的论坛,但因为我是从开发人员的角度出发,所以从这里开始似乎是合理的。)

似乎可以以最小的开销完成我想要的

创建快照:

CREATE DATABASE t19314_ss ON
  ( NAME = TimeStar,
    FILENAME = 'C:\temp\snappy.ss' ) AS SNAPSHOT OF t19314
RESTORE DATABASE t19314 from DATABASE_SNAPSHOT = 't19314_ss';
恢复到快照:

CREATE DATABASE t19314_ss ON
  ( NAME = TimeStar,
    FILENAME = 'C:\temp\snappy.ss' ) AS SNAPSHOT OF t19314
RESTORE DATABASE t19314 from DATABASE_SNAPSHOT = 't19314_ss';

您是否考虑过在事务中运行脚本,然后将其回滚?请注意,这对
IDENTITY
列的影响与还原(使用时间点)的效果并不完全相同,因为仍将使用标识值。您可以创建并还原到它。我似乎记得(但不要引用我的话,因为我已经测试了很长一段时间了),这可能比恢复完整备份更快,这取决于您对它所做的操作。从2016 SP1开始,所有版本都支持此功能。这仍然比回滚事务或正确模拟数据库要慢得多,这样您的测试就不再依赖它(当然,如果他们不是专门测试数据库代码的话)。如果“原始状态”不涉及大量数据,在一次彻底的扫描中,截断所有表并插入测试首先需要的任何数据,可以在速度上击败所有这些方法。此外,为初始状态(在运行所有测试之前)部署DACPAC或BACPAC可能比恢复备份(后者与特定版本的SQL Server绑定,不会在早期版本上恢复)更快、更方便。作为奖励,您可以使用数据库项目,这对保持代码的可维护性有积极的影响?在每次测试期间,DB模式将发生多少新信息或更改?您是否考虑过对数据库副本运行测试?如果您有事务日志,您可以恢复第一次备份,然后根据日期运行事务日志。