【发布时间】:2015-01-10 07:41:28
【问题描述】:
我编写了一个从给定 .bak 文件恢复数据库的存储过程,并在 SQL Server 代理的作业中安排了这个过程。现在有时发生的情况是 .bak 文件不可用,或者被防病毒软件复制或扫描,或者上帝知道在我的还原过程中还有什么引发操作系统错误(文件被另一个进程访问)(并非总是但有时) . 为了绕过它,我将我的 Restore 语句放在循环中的 try-catch 块中,如下所示,假设这可能会解决问题,但它不是那样工作的。以下是我的程序:
DECLARE @Repeat INT
SET @Repeat = 1
WHILE (@Repeat = 1)
BEGIN
BEGIN TRY
IF DB_ID('MyDBName') IS NOT NULL
BEGIN
DROP DATABASE MyDBName
END
SET @File = @Path+@File --@File contains valid values, no problem in them
print @File
RESTORE FILELISTONLY FROM DISK = @File
--print 'Restore Filelist Successful'
RESTORE DATABASE BSG FROM DISK = @File
WITH REPLACE, MOVE 'ABC_Data' TO 'D:\MyDBName\MyDBName.mdf',
MOVE 'ABC_Log' TO 'D:\MyDBName\MyDBName_1.ldf'
SET @Repeat = 0
--print 'Restore Database Successful'
--print 'Move Successful'
END TRY
BEGIN CATCH
print 'Error Occured'
SET @Repeat = 1
END CATCH
END
请注意,我的程序在 7 月 10 日的大部分时间都运行良好,但有时当我查看作业历史记录时,我会在失败报告中看到以下错误:
Executed as user: NT AUTHORITY\SYSTEM. In Transaction [SQLSTATE 01000] (Message 0)
'*MyBackupDBFilePath*' [SQLSTATE 01000] (Message 0) Cannot open backup device
'*MyBackupDBFilePath*'. Operating system error 32(The process cannot access the file
because it is being used by another process.). [SQLSTATE 42000] (Error 3201).
The step failed.
我可以看到在访问我的 .bak 文件时出现了一些问题,但我没有得到的是为什么我的程序不尝试再次恢复数据库(基本上为什么失败没有被我的 catch 设置为 @重复值到 1
【问题讨论】:
-
@usr 伙计他们是怪物:P ppl 的投票率高于我的总代表 O.O
标签: sql-server try-catch database-restore