一个job运行问题的排查过程

今天产品线的一个同事过来,说在某台数据库服务器上有两个job似乎是死在那里了,几个小时了,看状态一直是Executing。这种Debug的事情肯定轮不到我这样的新手,但我站在manager的身后,大概学习了一下他的排查过程。

1.运行 sp_who2, 看看有没有什么其他的进程阻塞了这个job
结果:没有发现,甚至也没发现这个job和数据库服务器间的连接。(job本身是一个SSIS的应用,用来把数据从文件加载入数据库)

2.运行 dbcc opentran
可能是怕有事务的死锁之类的东西吧,反正也没有看出结果

3.dbcc imputbuffer(spid)
查了一下文档,才知道这是用来返回一个客户进程发送给一个sql server实例的最后一个语句

4.远程登录到数据库服务器上,查看 DTExec.exe 进程的资源占用情况
我们的数据库服务器是64位的,而这个命令是在64位机上部署或者运行SSIS包的工具,这里有一个简单的调用示例:
EXEC xp_cmdshell 'dtexec /f "C:\UpsertData.dtsx"'
结果:也没有太多发现

5.接下来就是仔细分析msdb里面的记录job执行情况的表
select * from sysjobhistory
select * from sysjobs
最后的结论是,发现这两个job在启动的时候,另外还有一个job也在启动。如上面所说,这些job都要运行ssis的包,需要适量内存;而在我们的数据库服务器上,我们给sql server所能使用的内存设置了一个最大值。这就可能出现一个情况,就是sql server把所有内存都吃掉了,导致ssis进程内存不足,所以就莫名死掉了。

当然,最后的结论比较牵强,也纯属推测,需要我们更改数据库服务器的最大内存使用量,然后再看看以后还会不会出现类似的错误...

原文地址:https://www.cnblogs.com/xingyukun/p/1124740.html