这是我的设置。每天一次,从生产服务器检索我的数据库的完整备份,并将其还原到本地SQL Server实例。每隔15分钟,就会从生产中检索一个SQL事务日志并在本地恢复。
RESTORE DATABASE [DBNAME] from disk=@path with NORECOVERY, REPLACE)
RESTORE LOG [DBNAME] from disk=@path with NORECOVERY
如果生产环境出现故障,我需要能够使用本地数据库。这意味着“完成恢复”并更改一些配置值,如下所示:
RESTORE DATABASE [DBNAME] with RECOVERY
UPDATE [DBNAME].dbo.[TABLE] SET [COL1] = 1
我已将此代码放在存储过程中(在同一SQL Server实例上的另一个DB中)。但是,由于第二行导致错误,我无法执行它:
无法打开数据库'DBNAME'。它正处于恢复过程中。
我认为这是由于SQL Server引擎的预验证(因为在执行RESTORE查询之前数据库不可用),但我想知道如何尽可能干净地解决它。我找到了一个解决方法,我在下面给出了答案,但它确定不是解决问题的好方法。
感谢您的帮助!
答案 0 :(得分:1)
您应该可以通过将第二个语句放在EXEC
:
RESTORE DATABASE [DBNAME] with RECOVERY
EXEC('UPDATE [DBNAME].dbo.[TABLE] SET [COL1] = 1')
您可能会遇到的问题是SQL Server希望在开始执行之前编译整个存储过程。为了编译UPDATE
,它至少需要确认所涉及的表和列的存在。
所以,把它放在EXEC
中,这样就不会编译它,直到达到程序的那一部分。
答案 1 :(得分:0)
我发现的解决方法很简单:
但是,如果可能的话,我想避免使用不必要的存储过程来混乱我的SQL Server数据库!
答案 2 :(得分:0)
如果你知道恢复需要很长时间,你可能会延迟它吗?
restore database [DBName] with recovery;
Begin
waitfor delay '00:01'; --one minute delay
update [DBTable] set [Col1]= 1;
END;