Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso limpar o SSISDB?


Phil Brammer se deparou com isso e uma série de outras coisas relacionadas ao cuidado e alimentação do catálogo SSIS, que ele aborda em seu post Recomendações de indexação do catálogo .

Problema raiz


A raiz do problema é que a MS tentou projetar o SSIS com RI em mente, mas eles eram preguiçosos e permitiram que as exclusões em cascata acontecessem em vez de manuseá-las explicitamente.

Resolução


Até que o MS mude como as coisas funcionam, a opção suportada é

Eu sei que no meu cliente atual, nós só carregamos dados de madrugada, então o SSISDB fica quieto durante o horário comercial.

Se executar o trabalho de manutenção durante um período de silêncio não for uma opção, você está pensando em criar suas próprias instruções de exclusão para tentar fazer com que as exclusões em cascata suguem menos .

No meu cliente atual, estamos executando cerca de 200 pacotes por noite nos últimos 10 meses e também temos 365 dias de histórico. Nossas maiores mesas, por uma ordem de grandeza são.
Schema    Table                   RowCount
internal  event_message_context   1,869,028
internal  operation_messages      1,500,811
internal  event_messages          1,500,803

O driver de todos esses dados, internal.operations tem apenas 3300 linhas, o que se alinha com o comentário de Phil sobre como esses dados crescem exponencialmente.

Portanto, identifique o operation_id a ser purgado e a exclusão das tabelas folha trabalhando de volta ao núcleo, internal.operations tabela.
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, [email protected], 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;

As advertências usuais se aplicam
  • não confie em códigos aleatórios na internet
  • use os diagramas do ssistalk e/ou tabelas do sistema para identificar todas as dependências
  • talvez seja necessário segmentar apenas suas operações de exclusão em operações menores
  • você pode se beneficiar ao descartar o RI para operações, mas certifique-se de reativá-los com a opção de verificação para que sejam confiáveis.
  • consulte seu dba se as operações durarem mais de 4 horas

Edição de julho de 2020


Tim Mitchell tem um bom conjunto de artigos sobre Limpeza automática do catálogo SSIS e Uma maneira melhor de limpar o Banco de dados do catálogo SSIS e seu novo livro elegante The SSIS Catalog:Install, Manage , Proteja e monitore sua infraestrutura ETL corporativa

@Yong Jun Kim anotado nos comentários

Este é certamente o caso se você estiver usando um SSIS IR no Azure Data Factory. Você encontrará as tabelas "normais" ainda presentes, mas vazias, com o *_scaleout versões contendo todos os dados.

Referências