SQL Server 2012 Agent作业无历史记录、无失败通知排查咨询
SQL Server 2012 Agent作业异常排查指南
核心日志核查路径
以下日志不受作业历史记录配置限制,可直接定位作业是否启动、是否被外部进程中断:
- SQL Server Agent错误日志
默认路径为实例安装目录下的MSSQL\Log\SQLAGENT.OUT,例如默认实例的典型路径为C:\Program Files\Microsoft SQL Server\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Log\SQLAGENT.OUT。该日志会完整记录所有作业的触发时间、启动状态、运行进程ID、异常退出错误码,哪怕作业刚启动就被终止、作业历史记录被覆盖,这里的记录也不会丢失。核查时直接搜索异常作业名称,匹配对应运行时间窗的条目,就能明确作业是否正常触发、终止原因是内部报错还是外部干预。 - SQL Server数据库引擎错误日志
和Agent日志存放在同目录,文件名为无后缀的ERRORLOG,可直接通过文本编辑器打开,也可在SSMS的「管理-SQL Server日志」节点可视化查看。重点筛选作业运行时间段内的三类记录:- 会话终止类信息:包括会话被KILL、死锁被选为牺牲品、事务回滚的详细记录,可直接定位到终止作业会话的来源进程
- 维护操作记录:包括备份、索引重建、数据库状态变更的精确时间点,可核对是否和作业运行时间冲突——如果备份操作占用了排他锁、或者维护计划配置了阻塞进程自动清理逻辑,就会直接中断作业执行
- 存储过程底层报错:包括事务日志满、磁盘空间不足、权限不足、锁超时等错误,这类错误如果作业步骤没配置输出捕获,不会写入Job History,但会完整记录在引擎错误日志中
- 系统默认跟踪文件
同Log目录下的log_*.trc滚动跟踪文件,可通过系统内置函数fn_trace_gettable读取内容,里面记录了所有作业执行事件、对象修改操作、进程终止事件、备份操作的完整上下文,可通过作业启动时关联的会话ID,追溯整个运行周期的所有操作,确认是否被其他进程打断。
Job History无记录、无失败通知的常见原因
- 作业历史保留配置不合理:SQL Server 2012默认配置下,作业历史总记录上限为1000条,单作业最多保留100条历史,实例上作业运行频繁时,旧记录会被新记录直接覆盖,导致看不到异常时段的执行记录。建议在SQL Server Agent属性的「历史记录」页,调整为按时间保留历史(比如保留4周),取消固定条数限制。
- 作业通知配置错误:核查作业的「通知」页配置,确认失败触发的通知对象配置正确,触发条件选择的是「作业失败」而非「作业成功」「作业完成」;同时核查作业步骤的高级配置,确认步骤失败后的动作是「退出作业并报告失败」,而非继续执行下一步。
- 作业启动后瞬时终止:如果作业触发后立刻被外部进程终止,还没走到写入作业历史的逻辑,Job History里就不会留下执行记录,但这类启动-终止事件一定会记录在前面提到的
SQLAGENT.OUT日志中。
补充验证点
当前场景下「目标表为空」的状态,刚好对应存储过程里DELETE逻辑执行完成、INSERT逻辑未执行/执行失败的状态。建议核查存储过程是否加了显式事务和TRY/CATCH异常处理:如果没有显式事务,DELETE语句默认自动提交,后续INSERT一旦报错中断,就会留下空表;如果加了显式事务但没做异常回滚,也可能出现锁等待超时后事务隐式回滚不完整的问题。
内容的提问来源于stack exchange,提问作者jeff
相关产品推荐
相关产品推荐

