SQL Server Agent偶发报错2812找不到存储过程问题咨询
根因分析
这类无规律偶发的2812找不到存储过程错误,90%以上的场景是目标数据库myDB开启了AUTO_CLOSE属性:
- 开启
AUTO_CLOSE后,数据库在无活跃连接时会被SQL Server自动关闭、释放所有资源,下次有连接访问时再重新启动加载 - 在数据库重新启动的极短窗口(通常是几百毫秒)内,系统元数据还未完成初始化,此时Agent会话发起的存储过程调用扫描系统目录时找不到对应对象,就会抛出该错误
- 由于只有作业执行时间刚好撞上数据库从关闭状态唤醒的窗口才会触发,因此表现为绝大多数运行正常、报错无规律。
剩下少部分场景是作业执行时间刚好撞上数据库冷启动窗口:比如SQL Server服务重启、Always On可用性组故障转移、数据库手动脱机联机后,数据库还处于恢复、缓存预热阶段,短时间内对象解析失败触发错误,这类报错通常集中在运维操作后的第一次作业执行,不会长期无规律出现。
已确认存储过程、Agent权限都没有变更的前提下,可以直接排除对象被删除重建、权限不足这类持续性问题。
排查步骤
- 执行以下语句检查
myDB的AUTO_CLOSE配置:
SELECT name, is_auto_close_on FROM sys.databases WHERE name = 'myDB'
- 如果返回结果中
is_auto_close_on值为1,即可确认根因。 - 如果值为0,核对SQL Server错误日志、Agent历史记录,确认报错时间点是否存在服务重启、故障转移、数据库状态切换类操作。
修复方案
- 生产环境必须关闭
AUTO_CLOSE属性,该选项本身就不适合生产场景,除了偶发对象解析错误,还会导致连接性能差、查询计划缓存频繁失效等问题,执行以下语句关闭即可:
ALTER DATABASE myDB SET AUTO_CLOSE OFF WITH ROLLBACK IMMEDIATE;
- 对作业步骤做加固,将原有执行语句改为完全限定名写法,彻底规避极端场景下数据库上下文异常的问题:
EXEC myDB.dbo.myProc
- 可选加固:给作业配置失败重试规则,设置失败后重试1-2次,每次间隔30秒,即使撞上极短的数据库初始化窗口,重试时也能正常执行。
- 如果排查确认是冷启动窗口导致的报错,可以将SQL Server Agent服务的启动类型调整为「自动(延迟启动)」,给数据库预留足够的恢复、预热时间,避免服务刚启动时就触发作业。
内容的提问来源于stack exchange,提问作者Prefect73
相关产品推荐
相关产品推荐

