我该如何清理SSISDB?

Pau*_*ker 22 ssis sql-server-2012

当我设置它时,我忽略了保留期.我的数据库变得非常大,所以我希望减小它的大小.如果我只是更改保留期(它是365),则会导致SSIS运行我的包时出现问题.我甚至以小增量更改了它,但删除语句会创建阻止新作业运行的锁.

任何想法如何解决这个问题?我想过要创建一个新的SSISDB.

bil*_*nkc 34

Phil Brammer遇到了这个以及其他一些与SSIS目录的护理和喂养相关的事情,他在他的帖子目录索引建议中介绍了这些内容.

根问题

根本问题是MS试图设计带有RI的SSIS,但它们是懒惰的,允许级联删除发生而不是显式处理它们.

开箱即用,新的SSIS 2012目录数据库(SSISDB)应用了一些基本索引,并将参照完整性设置为在大多数表之间执行级联删除.

输入SQL代理作业"SSIS服务器维护作业".默认情况下,此作业设置为每天午夜运行,并使用两个目录参数来运行:"定期清理日志"和"保留期(天)."这些是设置后,维护作业将清除指定保留期之外的所有数据.

此维护作业从内部操作中一次删除循环中的10条记录,然后级联到下游的多个表中.在我们的例子中,我们每天有大约3000个操作记录要删除(一次10个!),从internal.operation_messages转换为160万行.那只是一张下游桌子!整个过程完全完全锁定了SSISDB数据库中的任何SELECT/INSERT数据

解析度

在MS改变工作方式之前,支持的选项是

将维护作业计划移至适合您环境的更合适的时间

我知道在我现在的客户端,我们只在凌晨加载数据,因此SSISDB在工作时间内保持安静.

如果在安静期间运行维护作业不是一个选项,那么您正在考虑制作自己的删除语句以尝试使级联删除更少.

在我目前的客户,过去10个月我们每晚运行约200个套餐,也是365天的历史.我们最大的表格是一个数量级.

Schema    Table                   RowCount
internal  event_message_context   1,869,028
internal  operation_messages      1,500,811
internal  event_messages          1,500,803
Run Code Online (Sandbox Code Playgroud)

所有这些数据的驱动程序中internal.operations只有3300行,这与Phil关于这些数据如何呈指数增长的评论一致.

因此,确定operation_id要清除和从叶表中删除工作回到核心internal.operations表.

USE SSISDB;
SET NOCOUNT ON;
IF object_id('tempdb..#DELETE_CANDIDATES') IS NOT NULL
BEGIN
    DROP TABLE #DELETE_CANDIDATES;
END;

CREATE TABLE #DELETE_CANDIDATES
(
    operation_id bigint NOT NULL PRIMARY KEY
);

DECLARE @DaysRetention int = 100;
INSERT INTO
    #DELETE_CANDIDATES
(
    operation_id
)
SELECT
    IO.operation_id
FROM
    internal.operations AS IO
WHERE
    IO.start_time < DATEADD(day, -@DaysRetention, CURRENT_TIMESTAMP);

DELETE T
FROM
    internal.event_message_context AS T
    INNER JOIN
        #DELETE_CANDIDATES AS DC
        ON DC.operation_id = T.operation_id;

DELETE T
FROM
    internal.event_messages AS T
    INNER JOIN
        #DELETE_CANDIDATES AS DC
        ON DC.operation_id = T.operation_id;

DELETE T
FROM
    internal.operation_messages AS T
    INNER JOIN
        #DELETE_CANDIDATES AS DC
        ON DC.operation_id = T.operation_id;

-- etc
-- Finally, remove the entry from operations

DELETE T
FROM
    internal.operations AS T
    INNER JOIN
        #DELETE_CANDIDATES AS DC
        ON DC.operation_id = T.operation_id;
Run Code Online (Sandbox Code Playgroud)

通常的警告适用 - 不要相信互联网上的randoms代码 - 使用ssistalk和/或系统表中的图表来识别所有依赖项 - 您可能只需要将删除操作分成更小的操作 - 您可能会因为删除RI而受益对于操作,但确保使用check选项重新启用它们,以便它们受信任. - 如果操作持续时间超过4小时,请咨询您的dba

参考

  • 应该更新为包括https://support.microsoft.com/en-us/kb/2829948 (2认同)
  • @MartinSmith完成,谢谢。顺便说一句,顺便说一下,因为我必须清理一个排粪的2012 SSISDB (2认同)