Saltar al contenido

¿Cómo puedo limpiar SSISDB?

Solución:

Phil Brammer se encontró con esto y una serie de otras cosas relacionadas con el cuidado y la alimentación del catálogo SSIS, que cubre en su publicación Catalog Indexing Recommendations.

Problema de raíz

La raíz del problema es que MS intentó diseñar el SSIS con RI en mente, pero fueron perezosos y permitieron que ocurrieran las eliminaciones en cascada en lugar de manejarlas explícitamente.

Fuera de la caja, la nueva base de datos de catálogo SSIS 2012 (SSISDB) tiene aplicada alguna indexación básica, con integridad referencial configurada para realizar eliminaciones en cascada entre la mayoría de las tablas.

Ingrese el trabajo del Agente SQL, “Trabajo de mantenimiento del servidor SSIS”. Este trabajo está configurado de forma predeterminada para ejecutarse a la medianoche todos los días y utiliza dos parámetros de catálogo para funcionar: “Limpiar registros periódicamente” y “Período de retención (días)”. Cuando se establecen, el trabajo de mantenimiento depura cualquier dato fuera del período de retención indicado.

Este trabajo de mantenimiento elimina 10 registros a la vez en un bucle de operaciones internas y luego se distribuye en cascada en muchas tablas posteriores. En nuestro caso, tenemos alrededor de 3000 registros de operaciones para eliminar diariamente (¡10 a la vez!) Que se traduce en 1,6 millones de filas de internal.operation_messages. ¡Esa es solo una mesa aguas abajo! Todo este proceso bloquea completamente la base de datos SSISDB de cualquier dato SELECT / INSERT

Resolución

Hasta que MS cambie la forma en que funcionan las cosas, la opción admitida es

mover el programa de trabajo de mantenimiento a un momento más apropiado para su entorno

Sé que en mi cliente actual, solo cargamos datos en las horas de la madrugada, por lo que SSISDB está en silencio durante el horario comercial.

Si ejecutar el trabajo de mantenimiento durante un período de inactividad no es una opción, entonces está buscando crear sus propias declaraciones de eliminación para tratar de obtener las eliminaciones en cascada para chupar menos.

En mi cliente actual, hemos estado ejecutando alrededor de 200 paquetes por noche durante los últimos 10 meses y también tenemos 365 días de historial. Nuestras tablas más grandes, en un orden de magnitud, son.

Schema    Table                   RowCount
internal  event_message_context   1,869,028
internal  operation_messages      1,500,811
internal  event_messages          1,500,803

El conductor de todos esos datos, internal.operations solo tiene 3300 filas, lo que se alinea con el comentario de Phil sobre cuán exponencialmente crecen estos datos.

Entonces, identifique el operation_id para ser purgado y la eliminación de las tablas hoja trabajando de regreso al núcleo, internal.operations mesa.

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;

Se aplican las advertencias habituales

  • no confíe en el código de randoms en Internet
  • use los diagramas de ssistalk y / o tablas del sistema para identificar todas las dependencias
  • es posible que solo deba segmentar sus operaciones de eliminación en operaciones más pequeñas
  • puede beneficiarse descartando RI para las operaciones, pero asegúrese de volver a habilitarlas con la opción de verificación para que sean confiables.
  • consulte con su dba si las operaciones duran más de 4 horas

Julio de 2020 editar

Tim Mitchell tiene un buen conjunto de artículos sobre limpieza automática del catálogo SSIS y una mejor manera de limpiar la base de datos del catálogo SSIS y su nuevo libro elegante El catálogo SSIS: instalar, administrar, proteger y monitorear su infraestructura ETL empresarial

@Yong Jun Kim señaló en los comentarios

Existe la posibilidad de que SSIS DB tenga diferentes nombres de tabla con escalado horizontal al final ahora. En lugar de internal.event_message_context, puede ser internal.event_message_context_scaleout. En lugar de internal.operations_messages, puede ser internal.operations_messages_scaleout. Simplemente modifique los nombres de las tablas en el código en consecuencia, y debería funcionar bien

Este es ciertamente el caso si está utilizando un SSIS IR dentro de Azure Data Factory. Encontrará las tablas “normales” todavía presentes pero vacías, con el *_scaleout versiones que contienen todos los datos.

Referencias

  • Recomendaciones de indexación de catálogos
  • Tenga cuidado con el trabajo de mantenimiento del servidor SSIS
  • Rendimiento lento cuando ejecuta el trabajo de mantenimiento del servidor SSIS para eliminar datos antiguos en SQL Server 2012
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *