代码之家  ›  专栏  ›  技术社区  ›  Kenneth

SQL Server:是否可以防止SQL代理在出错时执行步骤失败?

  •  0
  • Kenneth  · 技术社区  · 16 年前

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

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

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

    msg 3201,级别16,状态1,行1无法打开备份设备“db diff(\path\db-diff-03-16-2010.dif)”。操作系统错误5(访问被拒绝)。消息3013,级别16,状态1,行1备份数据库异常终止。

    我只是问在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 回复  |  直到 16 年前
        1
  •  0
  •   jasonk    16 年前

    简而言之:不。

    你还有什么办法可以先发制人地避免这个错误吗?检查连接/事务等。你知道为什么它被认为访问被拒绝(我假设它“正在使用”)。

    基本进程可以分成多个段,每个db一个吗?也就是说,同一进程通过批处理文件或其他根文件多次调用?

    你能把它移到另一个管理应用程序或层的外壳调用吗?

    使用第三方工具如redgates sql backup会更好吗?随着时间的推移,这种工具的前期费用可能不仅仅是节省成本支持。 http://www.red-gate.com/products/SQL_Backup/index.htm

        2
  •  1
  •   gbn    16 年前

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

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

        3
  •  0
  •   Raj More    16 年前

    如果启用了xp_cmdshell,则可以将其用于sql2000系统。您将丢失一些错误处理,并且必须在捕获日志文件的输入方面有所创新。