¿Cómo consultar SSISDB para descubrir los errores en los paquetes?

15

He visto esta pregunta SSIS 2012: ¿Cómo consultar los paquetes actualmente en ejecución en T-SQL?

Me da el siguiente script:

SELECT
    E.execution_id
,   E.folder_name
,   E.project_name
,   E.package_name
,   E.reference_id
,   E.reference_type
,   E.environment_folder_name
,   E.environment_name
,   E.project_lsn
,   E.executed_as_sid
,   E.executed_as_name
,   E.use32bitruntime
,   E.operation_type
,   E.created_time
,   E.object_type
,   E.object_id
,   E.status
,   E.start_time
,   E.end_time
,   E.caller_sid
,   E.caller_name
,   E.process_id
,   E.stopped_by_sid
,   E.stopped_by_name
,   E.dump_id
,   E.server_name
,   E.machine_name
,   E.total_physical_memory_kb
,   E.available_physical_memory_kb
,   E.total_page_file_kb
,   E.available_page_file_kb
,   E.cpu_count
,   F.folder_id
,   F.name
,   F.description
,   F.created_by_sid
,   F.created_by_name
,   F.created_time
,   P.project_id
,   P.folder_id
,   P.name
,   P.description
,   P.project_format_version
,   P.deployed_by_sid
,   P.deployed_by_name
,   P.last_deployed_time
,   P.created_time
,   P.object_version_lsn
,   P.validation_status
,   P.last_validation_time
,   PKG.package_id
,   PKG.name
,   PKG.package_guid
,   PKG.description
,   PKG.package_format_version
,   PKG.version_major
,   PKG.version_minor
,   PKG.version_build
,   PKG.version_comments
,   PKG.version_guid
,   PKG.project_id
,   PKG.entry_point
,   PKG.validation_status
,   PKG.last_validation_time
FROM
    SSISDB.catalog.executions AS E
INNER JOIN
    ssisdb.catalog.folders AS F ON F.name = E.folder_name
INNER JOIN 
    SSISDB.catalog.projects AS P ON P.folder_id = F.folder_id
                                 AND P.name = E.project_name
INNER JOIN
    SSISDB.catalog.packages AS PKG ON PKG.project_id = P.project_id
                                   AND PKG.name = E.package_name;

Pero no responde a mi búsqueda. Estoy investigando las razones por las cuales los paquetes fallan y necesito comunicarme con los mensajes de error.

¿Dónde puedo encontrarlo?

Me gustaría usar T-SQL para consultar el mensaje de error.

También tengo este script a continuación, que me lleva cerca, pero no del todo:

SELECT 
    q.*
FROM
    (SELECT em.*
     FROM SSISDB.catalog.event_messages em
     WHERE em.operation_id = (SELECT MAX(execution_id) 
                              FROM SSISDB.catalog.executions)
       AND event_name NOT LIKE '%Validate%') q
/* Put in whatever WHERE predicates you might like*/
--WHERE event_name = 'OnError'
WHERE package_name = 'InfoGroup Feed.dtsx'
--WHERE execution_path LIKE '%<some executable>%'
ORDER BY message_time DESC

Este es el correo electrónico que me gustaría abordar, ¿cómo llegaron a ese mensaje de error:

Cualquier información sobre cómo solucionar errores de SSIS es bienvenida.

ingrese la descripción de la imagen aquí

Marcello Miorelli
fuente

Respuestas:

22

Tengo un puñado de consultas que uso. Los conceptos generales son que la tabla con la información es catalog.operation_messagesy usted está interesado en eventos con un tipo 120 (error).

Dependiendo de cuán robusta sea la consulta que desea construir, las siguientes dos tablas derivadas también pueden ser de interés.

--- http://technet.microsoft.com/en-us/library/ff877994.aspx
-- This query translates the message_type from SSISDB.catalog.operation_messages
-- into useful text
SELECT
    D.message_type
,   D.message_desc
FROM
(
    VALUES
        (-1,'Unknown')
    ,   (120,'Error')
    ,   (110,'Warning')
    ,   (70,'Information')
    ,   (10,'Pre-validate')
    ,   (20,'Post-validate')
    ,   (30,'Pre-execute')
    ,   (40,'Post-execute')
    ,   (60,'Progress')
    ,   (50,'StatusChange')
    ,   (100,'QueryCancel')
    ,   (130,'TaskFailed')
    ,   (90,'Diagnostic')
    ,   (200,'Custom')
    ,   (140,'DiagnosticEx Whenever an Execute Package task executes a child package, it logs this event. The event message consists of the parameter values passed to child packages.  The value of the message column for DiagnosticEx is XML text.')
    ,   (400,'NonDiagnostic')
    ,   (80,'VariableValueChanged')
) D (message_type, message_desc);


-- Where was the error message generated?
SELECT
    D.message_source_type
,   D.message_source_desc
FROM
(
    VALUES
        (10,'Entry APIs, such as T-SQL and CLR Stored procedures')
    ,   (20,'External process used to run package (ISServerExec.exe)')
    ,   (30,'Package-level objects')
    ,   (40,'Control Flow tasks')
    ,   (50,'Control Flow containers')
    ,   (60,'Data Flow task')
) D (message_source_type, message_source_desc);

Utilizo consultas como esta para encontrar información sobre los errores. Tal vez solo me interesan los errores (consulta 1). Otras veces, quiero saber todas las actividades de todas las operaciones que fallaron (consulta 2). En general, soy flojo y quiero ver toda la información sobre la última operación fallida (consulta 3 y nota la advertencia).

-- http://msdn.microsoft.com/en-us/library/ff877994.aspx
-- Find all error messages
SELECT
    OM.operation_message_id
,   OM.operation_id
,   OM.message_time
,   OM.message_type
,   OM.message_source_type
,   OM.message
,   OM.extended_info_id
FROM
    catalog.operation_messages AS OM
WHERE
    OM.message_type = 120;

-- Generate all the messages associated to failing operations
SELECT
    OM.operation_message_id
,   OM.operation_id
,   OM.message_time
,   OM.message_type
,   OM.message_source_type
,   OM.message
,   OM.extended_info_id
FROM
    catalog.operation_messages AS OM
    INNER JOIN
    (  
        -- Find failing operations
        SELECT DISTINCT
            OM.operation_id  
        FROM
            catalog.operation_messages AS OM
        WHERE
            OM.message_type = 120
    ) D
    ON D.operation_id = OM.operation_id;

-- Find all messages associated to the last failing run
SELECT
    OM.operation_message_id
,   OM.operation_id
,   OM.message_time
,   OM.message_type
,   OM.message_source_type
,   OM.message
,   OM.extended_info_id
FROM
    catalog.operation_messages AS OM
WHERE
    OM.operation_id = 
    (  
        -- Find the last failing operation
        -- lazy assumption that biggest operation
        -- id is last. Could be incorrect if a long
        -- running process fails after a quick process
        -- has also failed
        SELECT 
            MAX(OM.operation_id)
        FROM
            catalog.operation_messages AS OM
        WHERE
            OM.message_type = 120
    );

Quizás soy flojo y no quiero buscar esta información en caso de falla, como parece haber hecho su equipo. Tengo un trabajo de Agente SQL que se ejecuta bajo demanda y tengo trabajos que ejecutan paquetes SSIS configurados para ejecutar ese trabajo en caso de falla.

DECLARE
    @profile_name sysname = 'SQLAdmins'
,   @recipients varchar(max) = '[email protected]'
,   @copy_recipients varchar(max) = NULL
,   @blind_copy_recipients varchar(max) = NULL
,   @subject nvarchar(255) = 'failed package test'
,   @body nvarchar(max) = 'Stuff has failed, fix please'
,   @body_format varchar(20) = NULL
,   @importance varchar(6) = 'NORMAL'
,   @sensitivity varchar(12) = 'NORMAL'
,   @file_attachments nvarchar(max) = NULL
,   @query nvarchar(max) = N'
SELECT
    O.object_name AS FailingPackageName
,   O.object_id
,   O.caller_name
,   O.server_name
,   O.operation_id
,   OM.message_time
,   EM.message_desc
,   D.message_source_desc
,   OM.message
FROM
    SSISDB.catalog.operation_messages AS OM
    INNER JOIN
        SSISDB.catalog.operations AS O
        ON O.operation_id = OM.operation_id
    INNER JOIN
    (
        VALUES
            (-1,''Unknown'')
        ,   (120,''Error'')
        ,   (110,''Warning'')
        ,   (70,''Information'')
        ,   (10,''Pre-validate'')
        ,   (20,''Post-validate'')
        ,   (30,''Pre-execute'')
        ,   (40,''Post-execute'')
        ,   (60,''Progress'')
        ,   (50,''StatusChange'')
        ,   (100,''QueryCancel'')
        ,   (130,''TaskFailed'')
        ,   (90,''Diagnostic'')
        ,   (200,''Custom'')
        ,   (140,''DiagnosticEx Whenever an Execute Package task executes a child package, it logs this event. The event message consists of the parameter values passed to child packages.  The value of the message column for DiagnosticEx is XML text.'')
        ,   (400,''NonDiagnostic'')
        ,   (80,''VariableValueChanged'')
    ) EM (message_type, message_desc)
        ON EM.message_type = OM.message_type
    INNER JOIN
    (
        VALUES
            (10,''Entry APIs, such as T-SQL and CLR Stored procedures'')
        ,   (20,''External process used to run package (ISServerExec.exe)'')
        ,   (30,''Package-level objects'')
        ,   (40,''Control Flow tasks'')
        ,   (50,''Control Flow containers'')
        ,   (60,''Data Flow task'')
    ) D (message_source_type, message_source_desc)
        ON D.message_source_type = OM.message_source_type
WHERE
    OM.operation_id = 
    (  
        SELECT 
            MAX(OM.operation_id)
        FROM
            SSISDB.catalog.operation_messages AS OM
        WHERE
            OM.message_type = 120
    )
    AND OM.message_type IN (120, 130);
'
,   @execute_query_database sysname = NULL
,   @attach_query_result_as_file bit = 0
,   @query_attachment_filename nvarchar(260) = NULL
,   @query_result_header bit = 1
,   @query_result_width int = 256
,   @query_result_separator char(1) = char(13)
,   @exclude_query_output bit  = 0
,   @append_query_error bit = 0
,   @query_no_truncate bit = 0
,   @query_result_no_padding bit = 0
,   @mailitem_id int = NULL
,   @from_address varchar(max) = NULL
,   @reply_to varchar(max) = NULL;

-- Send email about the failure    
EXECUTE msdb.dbo.sp_send_dbmail
    @profile_name 
,   @recipients
,   @copy_recipients
,   @blind_copy_recipients
,   @subject
,   @body
,   @body_format
,   @importance
,   @sensitivity
,   @file_attachments
,   @query
,   @execute_query_database
,   @attach_query_result_as_file
,   @query_attachment_filename
,   @query_result_header
,   @query_result_width
,   @query_result_separator
,   @exclude_query_output
,   @append_query_error
,   @query_no_truncate
,   @query_result_no_padding
,   @mailitem_id OUTPUT
,   @from_address
,   @reply_to;

Ajústalo como quieras

billinkc
fuente
8

Puedes usar:

SELECT      OPR.object_name
            , MSG.message_time
            , MSG.message
FROM        catalog.operation_messages  AS MSG
INNER JOIN  catalog.operations          AS OPR
    ON      OPR.operation_id            = MSG.operation_id
WHERE       MSG.message_type            = 120

Esto le dará solo los mensajes de error de las ejecuciones del paquete SSIS.

Peter Elzinga
fuente
1
HazloMSG.message_type IN (120, 130)
AmDB
1
@AmDB: La pregunta es sobre errores, no advertencias. Si también desea advertencias, también puede agregar message_type 130.
Peter Elzinga
4

Aquí hay una consulta que creé para encontrar el mensaje de error del trabajo de SSISDB:

DECLARE @DATE DATE = GETDATE() - 7 -- This is to restrict the data for last 7 days, used in ON condition 

SELECT O.Operation_Id -- Not much of use 
,E.Folder_Name AS Project_Name 
,E.Project_name AS SSIS_Project_Name 
,EM.Package_Name 
,CONVERT(DATETIME, O.start_time) AS Start_Time 
,CONVERT(DATETIME, O.end_time) AS End_Time 
,OM.message as [Error_Message] 
,EM.Event_Name 
,EM.Message_Source_Name AS Component_Name 
,EM.Subcomponent_Name AS Sub_Component_Name 
,E.Environment_Name 
,CASE E.Use32BitRunTime 
WHEN 1 
THEN 'Yes' 
ELSE 'NO' 
END Use32BitRunTime 
,EM.Package_Path 
,E.Executed_as_name AS Executed_By 

FROM [SSISDB].[internal].[operations] AS O 
INNER JOIN [SSISDB].[internal].[event_messages] AS EM 
ON o.start_time >= @date -- Restrict data by date 
AND EM.operation_id = O.operation_id 

-- Edit: I change the alias from OMs to OM here:
INNER JOIN [SSISDB].[internal].[operation_messages] AS OM
ON EM.operation_id = OM.operation_id 

INNER JOIN [SSISDB].[internal].[executions] AS E 
ON OM.Operation_id = E.EXECUTION_ID 

WHERE OM.Message_Type = 120 -- 120 means Error 
AND EM.event_name = 'OnError' 
-- This is something i'm not sure right now but SSIS.Pipeline just adding duplicates so I'm removing it. 
AND ISNULL(EM.subcomponent_name, '') <> 'SSIS.Pipeline' 
ORDER BY EM.operation_id DESC 

Para la explicación detallada, por favor: ¿cómo consultar SSISDB para descubrir los errores en los paquetes?

Mangal Pardeshi
fuente
1

Si realmente desea saber por qué está fallando, aquí hay algunas cosas que debe verificar con el paquete y cómo solucionar problemas para asegurarse de que no se trate de un problema de conexión o autenticación.

Mire lo script taskque aparece justo antes de FTP tasky cambie las propiedades de la conexión FTP. Esto debe incluir el FTP server URL (or IP address), el TCP port numberservidor FTP escucha, el username, y password.

Asegúrese de que todos los atributos de FTP en estas propiedades de cadena de conexión estén configurados correctamente, y pruebe desde la línea de comandos o una herramienta de cliente FTP para asegurarse de que lo que sea que tenga un valor inteligente allí también permita la conexión a través de ese método para asegurarse de que no sea una contraseña o un problema de valor incorrecto de a lo que te estás conectando.

Pimp Juice IT
fuente
No hay ninguna secuencia de comandos o tarea FTP mencionada en la pregunta.
Nick.McDermaid
@ Nick.McDermaid Uh ... en realidad eso se muestra específicamente en la parte inferior de la captura de pantalla de la pregunta. Si lo miras por completo, lo verás también. Parece que el correo electrónico que recibió indicaba que la razón por la que el trabajo estaba fallando se debía al problema de FTP. La próxima vez que decida votar en contra de algo basado en sus conceptos erróneos, asegúrese de leer completamente la pregunta y su contenido antes de comenzar a examinar el contenido de las personas.
Pimp Juice IT
LOL eso fue bastante innecesario. Tienes razón, menciona FTP en la captura de pantalla al final. Pero la captura de pantalla solo me parece un ejemplo de correo electrónico. Si relees la pregunta, no se trata de resolver un problema de FTP. Se trata de buscar en el registro de SSIS y enviar correos electrónicos. Definitivamente no hay nada sobre "la tarea de script que aparece justo antes de la tarea FTP" allí. Desde mi perspectiva, la verdadera pregunta aquí es sobre el registro y las alertas.
Nick.McDermaid
@ Nick.McDermaid Para mí, la captura de pantalla del correo electrónico parecía que alguien ya lo había reducido a estar relacionado con un problema de autenticación de FTP a pesar de que se está utilizando la funcionalidad de FTP dentro de un trabajo SSIS utilizando el protocolo FTP en consecuencia. Solo decía que para solucionar el problema de autenticación FTP, simplemente confirme que la información de credenciales FTP dentro de un trabajo SSIS funciona con otro método de conexión FTP fuera del trabajo SSIS para garantizar que el nombre de usuario y la contraseña que está utilizando, por ejemplo, no permitan el acceso.
Pimp Juice IT
Ja, " como un ejemplo de correo electrónico " ... en serio, eres un comediante ... ese es el factor determinante de toda la pregunta. ¡Creo que estás equivocado y eso es todo! Intenté ayudar a solucionar fácilmente el problema de autenticación de 101 FTP a través del proceso de eliminación. Tal vez demasiado básico y estándar, pero según mi interpretación y la marca de tiempo en la respuesta de novato que proporcioné, eso es lo que fue tan divertido como puede ser. Si me equivoco, genial; al menos puedo admitirlo y aprender de ello. LOL
Pimp Juice IT