SSIS服务器维护作业错误

时间:2018-05-24 20:17:54

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

我在负责删除旧执行日志的维护作业的sql server 2017代理作业中收到以下错误消息:

Date        5/23/2018 12:18:45 AM
Log     Job History (SSIS Server Maintenance Job)

Step ID     1
Server      KARABL3
Job Name        SSIS Server Maintenance Job
Step Name       SSIS Server Operation Records Maintenance
Duration        00:02:34
Sql Severity    16
Sql Message ID  16916
Operator Emailed    
Operator Net sent   
Operator Paged  
Retries Attempted   3

Message
Executed as user: ##MS_SSISServerCleanupJobLogin##. A cursor with the name 'execution_cursor' does not exist. [SQLSTATE 34000] (Error 16916).  NOTE: The step was retried the requested number of times (3) without succeeding.  The step failed.

一段时间后,当日志计数超过正常计数时,会导致所有作业因超时而失败。enter image description here

3 个答案:

答案 0 :(得分:2)

这实际上是SQL Server 2017中引入的错误。

请参见存储过程SSISDB.[internal].[cleanup_server_retention_window]

第175行有DEALLOCATE execution_cursor

此语句需要在WHILE循环的END语句之后下移一行。应该与DROP TABLE #deleted_ops一起执行,而不要与TRUNCATE...

一起执行

虽然要删除的行数低于“批处理大小”(1000),但“ buggy”存储程序实际上运行正常,因为它不需要两次进入循环,但是如果要清理的执行次数很多,或者减少了保留期-然后碰到了墙。

答案 1 :(得分:1)

免责声明:我是Vahid的同事之一。

显然,错误消息不提供任何有用的信息。

这是SSIS服务器维护工作的第一步。

DECLARE @role INT

SET @role = (
        SELECT [role]
        FROM [sys].[dm_hadr_availability_replica_states] hars
        INNER JOIN [sys].[availability_databases_cluster] adc ON hars.[group_id] = adc.[group_id]
        WHERE hars.[is_local] = 1
            AND adc.[database_name] = 'SSISDB'
        )

IF DB_ID('SSISDB') IS NOT NULL
    AND (
        @role IS NULL
        OR @role = 1
        )
    EXEC [SSISDB].[internal].[cleanup_server_retention_window]

起初,我想可能[cleanup_server_retention_window]已在最新版本的SQL服务器中更新,并且导致错误。但事实并非如此。

然后我搜索了cleanup_server_retention_window失败并且link出现了。一些用户建议将SSISDB的恢复模式切换为简单可以解决问题,并且它也适用于这种情况。所以,如果你遇到类似的问题,我建议你也这样做。

答案 2 :(得分:0)

经过艰苦的努力,我终于在以下链接中找到了这个神奇的救生查询:

  

https://gist.github.com/sqlsimon/63a78ea8688ce9eaee60

它如何工作:

  1. 删除FK
  2. 截断所有日志表
  3. 最后阅读FK 对我来说很完美

感谢西蒙