【问题标题】:SQL Server Agent - SSIS Package - Error 0x80131904 - Timeout expiredSQL Server 代理 - SSIS 包 - 错误 0x80131904 - 超时已过期
【发布时间】:2014-09-07 02:13:04
【问题描述】:

最近在 SQL Server 代理计划作业中随机出现以下错误字符串,我一直无法找到解决方案。

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

在我的研究过程中,我遇到很多人建议只需将 SQL Server 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.

【问题讨论】:

  • 您还需要什么信息?我举了一些我尝试过的事情的例子,错误的频率,它不是每次都发生或总是发生在同一个工作中的事实。我还包括了我收到的完整错误消息。我还能补充什么?
  • 就是这样。 SSIS 甚至从不执行开始,因此代码是无关紧要的。它也发生在几个非常不同的 SSIS 包上。我想这是我可以在上面提到的一件事,我会添加它。
  • 在我能找到超时的任何地方,它都被设置为 0(无超时),并且它不执行包,所以我不确定它是否取决于包在做什么。
  • @Ryan 您找到解决问题的方法了吗?我在同一条船上!
  • @Ryan 这个问题有什么解决办法吗?相同的场景

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


【解决方案1】:

我遇到了同样的问题。 SQL 代理运行 SSIS 作业非常好,然后我突然遇到了这个错误。花了大约一个小时在网上寻找修复。发现服务器管理员安装了新的 Windows 更新。

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

希望服务器重启对下一个经历这个的人有用。

【讨论】:

    【解决方案2】:

    我们也遇到了同样的错误。作为一种解决方法,我们创建了以下存储过程。如果你把它放到一个运行每个 f.e. 的工作中。 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
    

    【讨论】:

      【解决方案3】:

      我知道这是一个较老的问题。但我遇到了同样的问题,这没有一个公认的答案。

      作业在 1.5 秒内失败,所以我认为这不是超时问题。

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

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

      希望这对某人有所帮助。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          当包在 SQL 集成服务目录下部署两次时,有时会发生这种错误。您也可能更改了包名称,但还有其他相关的自动生成的配置是唯一的,例如 Environment reference Id 和其他。

          因此,如果您有计划的作业,则需要创建一个新作业并将其指向。

          祝你好运

          【讨论】:

            【解决方案6】:

            检查包失败时实例上正在/正在运行的其他内容(例如,数据库完整性检查或类似的密集操作)。

            SQL 代理与其自己的 SSIS 目录通信超时(30 秒超时)。它实际上并没有执行包,因此与包本身无关,也与执行时实例的繁忙程度无关。

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

            【讨论】:

              【解决方案7】:

              【讨论】:

              • 谢谢,我确实注意到了该错误报告,几乎将其包含在我的描述中,但该错误报告中没有任何内容实际上给出了此错误代码,我不想让人们误会方向。但是,我确实尝试了一种解决方法(确保服务器没有忙于自动增长数据库),但它没有用。此外,这也暗示 SP2 将解决问题,但它没有。不过谢谢:)
              猜你喜欢
              • 1970-01-01
              • 2013-08-16
              • 2011-02-28
              • 2020-02-21
              • 2012-05-26
              • 2017-07-05
              • 1970-01-01
              • 2012-06-01
              • 1970-01-01
              相关资源
              最近更新 更多