SQL Server Agent作业异常并行执行(错误6535)原因排查咨询
针对你遇到的SQL Server Agent作业重复执行和错误6535的问题,我结合实际运维经验梳理下可能的成因、机制和排查思路:
一、作业同一时刻并行执行的成因与发生机制
这种数月一次的偶发重复执行,大概率和SQL Server Agent的调度逻辑、外部程序交互或系统层面的异常有关,具体来说:
- Agent调度引擎的线程同步问题:SQL Server Agent的调度核心由
SQLAgentScheduler线程负责,当服务器出现瞬时资源过载(比如CPU/内存 spike),这个线程可能被挂起;当线程恢复时,可能会重复处理之前未完成的调度触发事件,导致同一时刻生成两个作业实例。另外,如果系统时钟出现跳变(比如NTP同步导致时钟回拨),也会干扰Agent的计时逻辑,触发重复调度。 - CLR存储过程的反馈延迟:你的作业通过CLR存储过程启动控制台程序,如果控制台程序启动耗时较长(比如依赖的数据库连接建立慢、资源初始化久),CLR存储过程可能无法及时向Agent返回“步骤已启动”的信号。Agent在等待超时后,可能误以为作业触发失败,从而再次触发同一调度,最终导致两个实例并行运行。
- 作业步骤的隐性重试配置:虽然你确认只有一条调度配置,但要检查作业步骤的重试设置——如果重试次数大于0且重试间隔设为0,一旦第一次执行出现瞬时失败,Agent会立刻启动第二个实例,看起来就像是同一时刻并行执行。
二、错误6535的关联分析与排查方向
错误6535虽然常被提及在SQL Server 2005中,但2008 R2里也可能因CLR与外部程序交互的问题触发,结合你的场景:
- CLR权限与运行上下文异常:CLR存储过程调用外部程序需要
EXTERNAL_ACCESS或UNSAFE权限,如果权限配置不全,或者运行时的用户上下文(比如Agent服务账户)没有足够权限启动外部程序,就会触发6535错误。第一次执行时可能因资源竞争(比如程序依赖的文件被锁定)启动失败,第二次执行时资源释放,所以出现“步骤成功”的附加提示。 - 外部程序的启动逻辑缺陷:如果控制台程序本身存在启动时的资源竞争问题(比如多个实例同时尝试获取同一个数据库锁、文件句柄),第一个实例启动失败触发6535,第二个实例启动时资源已释放,从而成功。这种情况下,Agent的重复触发和程序自身的问题叠加,就会出现你看到的日志现象。
- Agent日志与系统日志的线索:一定要去查
SQLAGENT.OUT日志(默认在MSSQL\Log目录下),对应时间点的日志会记录作业触发的详细过程,比如是否有两次调度触发的记录;同时查看Windows系统的应用程序日志和系统日志,看是否有Agent服务异常、CLR运行错误或系统资源不足的告警。
三、具体排查步骤
确认调度与作业配置的准确性
- 执行以下查询验证作业的调度关联,确保没有重复的调度绑定到该作业:
SELECT j.name AS JobName, s.* FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id WHERE j.name = '你的作业名称'; - 打开作业步骤的属性,检查“重试”选项卡的配置,确认重试次数和间隔是否合理,避免短时间内重复执行。
- 执行以下查询验证作业的调度关联,确保没有重复的调度绑定到该作业:
增加日志追踪
- 在CLR存储过程中添加日志记录,比如每次被调用时写入自定义日志表,记录调用时间、进程ID、外部程序的启动状态(成功/失败),这样下次出现异常时能明确是Agent重复调用了CLR,还是CLR内部重复启动了程序。
- 开启SQL Server Agent的详细日志:在Agent属性的“日志”选项卡中,勾选“写入SQL Server日志”并选择“详细信息”,这样能捕获更细粒度的调度触发日志。
单独测试CLR与外部程序
- 手动调用CLR存储过程多次,模拟高负载环境(比如同时打开多个SSMS窗口调用),看是否会出现重复启动程序或触发6535错误的情况。
- 检查控制台程序的启动逻辑,添加启动日志,看第一次启动失败的具体原因(比如资源占用、权限问题)。
系统层面的健康检查
- 查看异常时间点的服务器性能监控数据(CPU、内存、磁盘IO),确认是否存在资源瓶颈。
- 检查系统时钟的稳定性,查看事件日志中是否有NTP同步导致的时钟跳变记录,这可能是Agent调度异常的诱因。
内容的提问来源于stack exchange,提问作者fio
相关产品推荐
相关产品推荐

