我在负责删除旧执行日志的维护作业的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.
答案 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)
经过艰苦的努力,我终于在以下链接中找到了这个神奇的救生查询:
它如何工作:
感谢西蒙