最近遇到一个很奇怪的问题:
sql server 定时job调用SSIS,SSIS再调用执行存储过程,有出现如下异常.
很奇怪的是并非一直报错,发生频率是偶尔、有时会出错.
存储过程加上try catch异常捕获机制 或者 @@ERROR全局变量中也抓不到错误
sql server 日志中也没有异常记录,就感觉突然中止了
异常的存储过程中并不连接其他数据库,仅本地表进行数据转换计算.
只剩job的执行的异常信息如下:(有时也报 执行的网络名不可用或信号灯超时时间已到)
消息
已以用户 NT Service\SQLSERVERAGENT 的身份执行。 Microsoft (R) SQL Server 执行包实用工具 Version 11.0.7001.0 for 64-bit 版权所有(C) Microsoft Corporation。保留所有权利。 开始时间: 0:42:19 由于错误 0x80131904,无法执行 IS 服务器包。服务器: ************,包路径: \SSISDB\Projection\Projection\PPM_Daily_Process_2.dtsx,环境引用 ID: NULL。 说明: 在从服务器接收结果时发生传输级错误。 (provider: TCP Provider, error: 0 - 信号灯超时时间已到) 源: .Net SqlClient Data Provider 开始时间: 0:42:19 完成时间: 0:59:36 占用时间: 1036.84 秒. 包执行失败。. 该步骤失败。
为了追踪异常,我在存储过程逐行打了日志:发现每次都是停在存储过程里的一行SQL,如下:
SELECT DISTINCT C.MAIN_ROUTE_ID, C.OP_NO, C.SEQ, C.DIFF_SEQ, CONVERT(INT,NULL) AS N_DIFF_SEQ
, CONVERT(INT,NULL) AS BLOCK_NAME
INTO #T_CT
FROM PPM.M_CYT_STD_CT C
WHERE (C.DIFF_SEQ IS NULL
OR ISNULL(C.DIFF_SEQ,999999) <> (SELECT TOP 1 ISNULL(DIFF_SEQ,999999) FROM PPM.M_CYT_STD_CT
WHERE MAIN_ROUTE_ID = C.MAIN_ROUTE_ID
AND SEQ = C.SEQ-1))
ORDER BY 1, 3
将SQL 拆开:透过执行日志发现每次停在CYT_STEP_075 和 CYT_STEP_076之间,问题应该在这句SQL上.
但是手动执行也是没错的,问题时偶然性的.
-- 2021/7/6 分次写入临时表
SELECT DISTINCT C.MAIN_ROUTE_ID, C.OP_NO, C.SEQ, C.DIFF_SEQ, CONVERT(INT,NULL) AS N_DIFF_SEQ
, CONVERT(INT,NULL) AS BLOCK_NAME
INTO #T_CT_1
FROM PPM.M_CYT_STD_CT C
WHERE C.DIFF_SEQ IS NULL
EXEC P_COM_LOG @MODULE,'CYT_STEP_075', @START_TIME, 0
** SELECT DISTINCT C.MAIN_ROUTE_ID, C.OP_NO, C.SEQ, C.DIFF_SEQ, CONVERT(INT,NULL) AS N_DIFF_SEQ
, CONVERT(INT,NULL) AS BLOCK_NAME
INTO #T_CT_2
FROM PPM.M_CYT_STD_CT C
WHERE ISNULL(C.DIFF_SEQ,999999) <> (SELECT TOP 1 ISNULL(DIFF_SEQ,999999) FROM PPM.M_CYT_STD_CT
WHERE MAIN_ROUTE_ID = C.MAIN_ROUTE_ID
AND SEQ = C.SEQ-1)**
EXEC P_COM_LOG @MODULE,'CYT_STEP_076', @START_TIME, 0
SELECT DISTINCT T.MAIN_ROUTE_ID, T.OP_NO, T.SEQ, T.DIFF_SEQ, T.N_DIFF_SEQ,T.BLOCK_NAME
INTO #T_CT
FROM
(SELECT MAIN_ROUTE_ID, OP_NO, SEQ, DIFF_SEQ, N_DIFF_SEQ,BLOCK_NAME
FROM #T_CT_1
UNION ALL
SELECT MAIN_ROUTE_ID, OP_NO, SEQ, DIFF_SEQ, N_DIFF_SEQ,BLOCK_NAME
FROM #T_CT_2) AS T
EXEC P_COM_LOG @MODULE,'CYT_STEP_077', @START_TIME, 0
DROP TABLE #T_CT_1
DROP TABLE #T_CT_2
请教有没有遇到这样的问题,该如何排查错误?