当出现报错时,如何使sp继续执行(在job中)

lchstudy 2009-11-09 05:48:54
如何捕获错误:
 我写了一个自动还原的sp,大体流程是这样的:1先还原全备份(此步借,则直接跳出),2再还原日志备份,3无论日志备份还原是否成功最终都还原db为online状态。
我的问题主要是集中在日志的还原,但当指定的日志文件不存在或还原的日志序列不正确时,将收到错误信息(我试了发现此异常无法try-catch到)。若在查询窗口中调用此sp,即是还原日志时发生这样的报错信息,但脚本仍可向下全部执行完,此时不影响整个sp的执行。
 但是我将sp放在job中调用时,当指定的日志文件不存在或还原的日志序列不正确时,作业将报错,并且脚本将不能被完全执行。即无法再执行将db变为online状态的操作。
 有谁知道遇到此问题吗?可以分离一下吗?
...全文
267 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jack_ailly 2009-11-10
  • 打赏
  • 举报
回复
up
xman_78tom 2009-11-10
  • 打赏
  • 举报
回复
日志还原找不到备份文件的错误,其严重度是 16,是可以被 try...catch 捕获到的。
lchstudy 2009-11-10
  • 打赏
  • 举报
回复
顶一个
lchstudy 2009-11-10
  • 打赏
  • 举报
回复
谢谢大家的建议。
  我之所以没有将此三步分到作业中的三步,是因为我需要还原的不止一个DB,在这三步外有个外循环。即根据配置表还原所有要还原的DB.
  同时放在一个sp中(其实是两个sp,即在还原全备份的sp_full中调用sp_log),方便部署到作业中。
  有知道能解决我这样的问题的,可以共享一下(写详细一点噢!谢啦!)
lchstudy 2009-11-10
  • 打赏
  • 举报
回复
自顶一个。
  找不到好的解决办法。我就只能在作业在发二步了。
  在第一步正常调用sp,并将报错信息插入到表中。当第一步报错后,转到第二步。
  第二步,据所报错信息进行相应处理:
    1.错误属于全备份错,则抛出异常,让job再次报错,从而job失败。
    2.错误属于日志还原错误,则执行online,并赋权。若本过程无异常则,job执行成功。否则也报job失败。
  关键是我现在还不想这么做,我想知道在job中报错的机制是什么?有谁知道吗,有什么文章可以介绍看一下的?
fwacky 2009-11-10
  • 打赏
  • 举报
回复
定一个!
lchstudy 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sql77 的回复:]
引用 4 楼 fcuandy 的回复:
错误是有严重级别区分的,try catch并不能处理所有级别的错误。
最好的作法是事先判断。

可以预知的错误不能用try catch,  它只用来处理不可预知的错误, 这是所有语言中开发时要注意的。
可预知的错误要先检测, 比如明明知道文件可能不存在,还try catch, 就算可以处理也会有额外很多的消耗

同意,先判断是否成功,然后 再做其它
[/Quote]
    这样办法不错,可以是判断这个文件是否存在。但每次判断日志序列文件的话可能复杂点。这个也可以考虑。谁已经这样处理过的可以分享一下。
lchstudy 2009-11-10
  • 打赏
  • 举报
回复
补充一下,采用litespeed还原也出现这样的问题。即采用litespeed提供的xp_restore_database,xp_restore_log。这两个sp虽都有返回值:0成功,非0失败。
  在文件不存在或日志还原序列不正确时,是可以接收到非0的返回值,但同时也会收到系统的异常信息,
这在窗口中也不会影响脚本继续向下执行,但在job中执行就会报错,问题同上。
lchstudy 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xman_78tom 的回复:]
日志还原找不到备份文件的错误,其严重度是 16,是可以被 try...catch 捕获到的。
[/Quote]
  兄弟,我试了下,restore database/log 当文件不存在或日志序列错误时的确可以try...catch,但可惜的是catch到了,但系统仍然后报错。这在query中不影响执行,但要是放到job中执行,job就会失败,导至整个脚本不能被全部执行。
  奇怪的是当在job中收到报错后,作业停止执行。而脚本并不是在报错点就停止了,而后在脚本出现异常的语句后,还会向下执行一小段代码。(我测试了N次都是这样,而向下执行到哪并不统一,即向下执行多少行不固定)。
  我实在找不到根据,只能猜想了,是不是因为当发生异常时,系统做两种事:1。继续执行出现异常点以后的脚本 2。系统将异常抛向job异常处理程序。而job接到异常后,则1。job报错;2。同时使仍在执行的脚本中断。
  有谁可以试验一下。
fenshm 2009-11-09
  • 打赏
  • 举报
回复
标记。
VincentLiang 2009-11-09
  • 打赏
  • 举报
回复
既然是放JOB 那就分成多个TASK,即使出错也可以让他继续向下执行
xman_78tom 2009-11-09
  • 打赏
  • 举报
回复
可以在作业中将操作分为三个步骤,步骤一执行数据还原,并定义步骤成功继续执行下一步骤;步骤二还原日志备份,步骤失败和成功都继续执行下一步骤;步骤三让数据库上线。

try...catch 只能捕获严重度 11 至 19 的错误。
SQL77 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fcuandy 的回复:]
错误是有严重级别区分的,try catch并不能处理所有级别的错误。
最好的作法是事先判断。

可以预知的错误不能用try catch,  它只用来处理不可预知的错误, 这是所有语言中开发时要注意的。
可预知的错误要先检测, 比如明明知道文件可能不存在,还try catch, 就算可以处理也会有额外很多的消耗
[/Quote]
同意,先判断是否成功,然后 再做其它
--小F-- 2009-11-09
  • 打赏
  • 举报
回复
先写一个事务来判断 如果可以 继续执行 否则回滚

4楼FC说得很清楚了 TRY...CATCH不是万能的
fcuandy 2009-11-09
  • 打赏
  • 举报
回复
错误是有严重级别区分的,try catch并不能处理所有级别的错误。
最好的作法是事先判断。

可以预知的错误不能用try catch, 它只用来处理不可预知的错误, 这是所有语言中开发时要注意的。
可预知的错误要先检测, 比如明明知道文件可能不存在,还try catch, 就算可以处理也会有额外很多的消耗
bancxc 2009-11-09
  • 打赏
  • 举报
回复
buhui
mingjunwang 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ws_hgo 的回复:]
关注
[/Quote]
continue
ws_hgo 2009-11-09
  • 打赏
  • 举报
回复
关注

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧