SQL Server代理 - SSIS包 - 错误0x80131904 - 超时已过期

时间:2014-07-16 13:53:10

标签: sql-server ssis sql-server-2012 sql-server-agent

最近在SQL Server代理预定作业中发生了一系列随机出现的以下错误,我无法找到解决方案。

错误很少发生,但通常每周一次,对于每日预定的工作,但在任何数量的不同工作中并不总是相同的工作。每个作业都分享它从运行作业的同一服务器执行SSIS包的事实。它也总是运行几乎正好30秒的时间,我猜是超时阈值。但是我不确定如果服务器只是连接到它自己的SSIS目录,为什么它会超时。另外值得注意的是,它实际上从未达到执行SSIS包的程度,无论尝试执行哪个包,都会发生这种情况。

在我的研究中,我遇到很多人建议只需将SQL Sever 2012更新到最新的CU *或SP2就可以解决问题,但是将服务器升级到SP2则没有。

尝试的一个解决方案(当然是丑陋的)只是在作业步骤失败时进行单次重试,实际上在大约30%的情况下解决了问题。

我欢迎任何有错误经验的人,或任何有任何建议的人。

错误消息如下:

Date        16/07/2014 6:00:11 AM
Log     Job History ({$jobname})

Step ID     1
Server      {$productionserver}
Job Name        {$jobname}
Step Name       {$stepname}
Duration        00:00:31
Sql Severity    0
Sql Message ID  0
Operator Emailed    
Operator Net sent   
Operator Paged  
Retries Attempted   0

Message
Executed as user: {$user}. 
Microsoft (R) SQL Server Execute Package Utility  Version 11.0.5058.0 for 64-bit  Copyright (C) Microsoft Corporation. All rights reserved.    

Started:  6:00:11 AM  Failed to execute IS server package because of error 0x80131904. 
Server: {$productionserver}, 
Package path: {$packagepath}, 
Environment reference Id: NULL.  
Description: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.  
Source: .Net SqlClient Data Provider  
Started:  6:00:11 AM  Finished: 6:00:42 AM  
Elapsed:  31.122 seconds.  The package execution failed.  The step failed.

7 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

在程序包发生故障时检查实例上还有/正在运行的内容(例如,数据库完整性检查或类似的密集操作)。

SQL代理正在与其自己的SSIS目录进行超时(30秒超时)。它实际上并不是在执行包,因此它与包本身无关,而且与执行时实例的繁忙程度有关。

(回答这个问题,因为它出现在Google搜索中)

答案 2 :(得分:1)

尝试在同一时刻启动多个SSIS包时遇到此错误。服务包应该修复它,但没有。我们已经实施了SSIS包的交错计划,因此在任何给定时刻只开始一个包。

答案 3 :(得分:1)

我知道这是一个老问题。但是我遇到了同样的问题,但是这个答案没有被接受。

工作在1.5秒内失败,因此我认为这不是超时问题。

我可以确认0x80131904是(或可以是)权限问题。我的SSIS包在带有SQL代理权限和网络管理员权限的SQL代理作业下运行。当我将其切换到权限较少的帐户时,会出现此错误。

对我来说,问题是因为我没有在所有正确的位置分配权限。我已经在“项目属性”中设置了“读取/执行”权限。然后(这是我没有做的步骤),我必须在包含“项目和环境”的文件夹上分配“读取”权限。

希望这对某人有帮助。

答案 4 :(得分:0)

有时,在SQL Integration Service Catalogs下部署包两次时会发生此类错误。您也可能更改了包名称,但是其他相关的自动生成配置是唯一的,如环境参考ID和其他。

因此,如果您有预定的工作,则需要创建一个新工作并将其指向。

祝你好运

答案 5 :(得分:0)

我们也遇到了相同的错误。作为解决方法,我们创建了以下存储过程。如果您将其放在每隔一周运行一次的工作中10分钟内,如果出现随机故障,可以确保作业连续重启,直到发生故障而没有超时故障。

USE [msdb]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[usp_StartTimedOutJob]
AS

DECLARE @jobid NVARCHAR(100)
    , @jobname NVARCHAR(250)
    , @stepname NVARCHAR(250)
    , @varMail VARCHAR(MAX)

DECLARE cJobs CURSOR FOR 

-- CTE selects all jobs that are currently not running and orders them by most recent
WITH CTE_NotRunning AS (
    SELECT S.job_id
        , S.step_name
        , S.[message]
        , rownum = ROW_NUMBER() OVER (PARTITION BY S.job_id ORDER BY S.run_date DESC, S.run_time DESC)
    FROM msdb.dbo.sysjobhistory AS S
    LEFT OUTER JOIN (SELECT DISTINCT ja.job_id 
                    FROM msdb.dbo.sysjobactivity ja 
                    LEFT JOIN msdb.dbo.sysjobhistory jh ON ja.job_history_id = jh.instance_id
                    JOIN msdb.dbo.sysjobs j ON ja.job_id = j.job_id
                    JOIN msdb.dbo.sysjobsteps js
                        ON ja.job_id = js.job_id
                        AND ISNULL(ja.last_executed_step_id,0)+1 = js.step_id
                    WHERE
                      ja.session_id = (
                        SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC
                      )
                    AND start_execution_date is not null
                    AND stop_execution_date is NULL) AS R
                        ON S.job_id = R.job_id
    WHERE R.job_id IS NULL)

-- only select the jobs into the cursor set for which the most recent job had a timeout issue
SELECT job_id
    , step_name
FROM CTE_NotRunning
WHERE [message] LIKE '%0x80131904%time%out%' -- error message that corresponds to timed out jobs, error code: 0x80131904
    AND rownum = 1

OPEN cJobs

    FETCH NEXT FROM cJobs 
        INTO @jobid, @stepname

    WHILE @@FETCH_STATUS = 0
        BEGIN

            -- for each of the timed out jobs in the cursor, start the job again from the step that caused the timeout

                SET @jobname = (SELECT [name] FROM msdb.dbo.sysjobs WHERE job_id = @jobid)

                EXECUTE dbo.sp_start_job @job_id = @jobid, @step_name = @stepname 

        END

CLOSE cJobs

DEALLOCATE cJobs

GO

答案 6 :(得分:0)

我遇到了同样的问题。 SQL Agent运行SSIS作业完全正常,然后突然我遇到了此错误。花了大约一个小时在网上寻找解决方案。发现服务器管理员已安装新的Windows更新。

我只是重新启动了服务器(托管SSIS目录和SQL Server / Agent)。服务器重新启动后,作业再次运行正常。

希望服务器重启适用于下一个经历的人。