SQL Server:是否可以防止SQL Agent在出错时失败?

时间:2010-03-17 16:44:18

标签: sql sql-server tsql sql-server-2000

我有一个存储过程,可以为大约60个SQL服务器运行自定义备份(混合2000到2008R2)。

有时,由于我无法控制的问题(备份设备无法访问,网络错误等),一个或两个数据库上的单个备份将失败。这会导致整个步骤失败,这意味着不会执行任何后续备份命令,并且可能无法备份给定服务器上的一半数据库。

在2005+框中,我使用TRY / CATCH块来管理这些问题并继续备份剩余的数据库。但是,在2000服务器上,我无法阻止此错误导致整个步骤失败:

消息3201,级别16,状态1,行1无法打开备份设备'db-diff(\ PATH \ DB-DIFF-03-16-2010.DIF)'。操作系统错误5(访问被拒绝。)。 Msg 3013,Level 16,State 1,Line 1 BACKUP DATABASE正在异常终止。

我只是想问一下在SQL 2000中是否可以使用TRY / CATCH这样的东西?我意识到没有内置的方法,所以我想我正在寻找一些创造力。

即使通过sp_executesql包装每个备份(或任何失败的语句),作业也会立即失败。例如:

DECLARE @x       INT,
        @iReturn INT

PRINT 'Executing statement that will fail with 208.'
EXEC @iReturn = Sp_executesql N'SELECT * from TABLETHATDOESNTEXIST;'
PRINT Cast(@iReturn AS NVARCHAR) --In SSMS this return code prints. Executed as a job it fails and aborts before this statement.

3 个答案:

答案 0 :(得分:1)

我通过为每个数据库重新创建作业步骤而不是一个迭代DB的作业来解决这个问题。

也就是说,确保在备份开始时为每个数据库创建一个作业步骤。然后继续失败。

答案 1 :(得分:0)

简短回答:不。

还有什么可以做的,试图抢先避免错误吗?检查连接/交易等。你知道为什么它被认为是拒绝访问(我假设它在“使用中”)。

可以将基本proc拆分为每个db 1个多个段吗?即同一个proc通过批处理文件或其他根文件多次调用?

您可以将其上移一个级别,以便在另一个管理应用或图层中支持该来电吗?

使用像RedGates SQL Backup这样的第三方工具会更好吗?这种工具的前期费用可能不仅可以节省成本支持。 http://www.red-gate.com/products/SQL_Backup/index.htm

答案 2 :(得分:0)

如果启用了XP_CmdShell,则可以将其用于SQL2000系统。您将失去一些错误处理,并且必须在捕获日志文件的输入方面发挥创意。