como consultar o SSISDB para descobrir os erros nos pacotes?

15

Eu já vi essa pergunta SSIS 2012 - Como consultar pacotes atualmente em execução no T-SQL?

Ele me fornece o seguinte 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;

Mas isso não responde à minha busca. Estou investigando os motivos pelos quais os pacotes falham e preciso me apossar das mensagens de erro.

Onde posso encontrá-lo?

Eu gostaria de usar o T-SQL para consultar a mensagem de erro.

Eu também tenho este script abaixo, que me leva perto, mas não exatamente:

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 é o email que eu gostaria de abordar, como eles chegaram à mensagem de erro:

Qualquer informação sobre como solucionar problemas de erros do SSIS é bem-vinda.

insira a descrição da imagem aqui

Marcello Miorelli
fonte

Respostas:

22

Eu tenho um punhado de consultas que eu uso. Os conceitos gerais são que a tabela com as informações écatalog.operation_messages e você está interessado em eventos com o tipo 120 (erro).

Dependendo da robustez de uma consulta que você deseja criar, as duas tabelas derivadas a seguir também podem ser interessantes.

--- 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);

Uso consultas como esta para encontrar informações sobre os erros. Talvez eu me importe apenas com o que os erros foram (consulta 1). Outras vezes, quero conhecer todas as atividades de todas as operações que falharam (consulta 2). Geralmente, sou preguiçoso e quero ver todas as informações sobre a última operação com falha (consulta 3 e observe a ressalva).

-- 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
    );

Talvez eu seja preguiçoso e não queira procurar essas informações em caso de falha, da mesma forma que sua equipe parece ter feito. Tenho um trabalho do SQL Agent que é executado sob demanda e tenho trabalhos que executam pacotes SSIS configurados para executá-lo em caso de falha.

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;

Ajuste como quiser

billinkc
fonte
8

Você pode 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

Isso fornecerá apenas as mensagens de erro das execuções de pacotes do SSIS.

Peter Elzinga
fonte
1
CrieMSG.message_type IN (120, 130)
AmDB 10/16/16
1
@ AmDB: A questão é sobre erros, não avisos. Se você quiser avisos também, pode-se adicionar message_type 130 também.
Peter Elzinga
4

Aqui está uma consulta que eu criei para encontrar a mensagem de erro do trabalho no 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 obter uma explicação detalhada, consulte: como consultar o SSISDB para descobrir os erros nos pacotes?

Mangal Pardeshi
fonte
1

Se você realmente quer saber por que está falhando, aqui estão algumas coisas para verificar com o pacote e como solucionar problemas para garantir que não seja um problema de conexão ou autenticação.

Veja o script taskque aparece logo antes do FTP taske altere as propriedades da conexão FTP. Isso deve incluir o FTP server URL (or IP address), o TCP port numberservidor FTP escuta, o usernamee password.

Certifique-se de que todos os atributos FTP nessas propriedades da cadeia de conexão estejam configurados corretamente e teste na linha de comando ou em uma ferramenta cliente FTP para garantir que tudo o que você tem valor também permita a conexão através desse método para garantir que não seja um problema de senha ou valor incorreto do que você está se conectando.

Pimp Juice IT
fonte
Não há nenhuma tarefa de script ou FTP mencionada na pergunta.
Nick.McDermaid
@ Nick.McDermaid Uh .... na verdade, isso é mostrado especificamente na parte inferior da tela da pergunta. Se você olhar completamente, verá isso também. Parece que o email que ele recebeu indicava que o trabalho estava falhando devido ao problema de FTP. Da próxima vez que você decidir votar em algo baseado em seus conceitos errados, certifique-se de ler completamente a pergunta e seu conteúdo antes de começar a examinar o conteúdo das pessoas.
Pimp Juice IT
LOL isso foi bastante desnecessário. Você está certo, menciona FTP na captura de tela no final. Mas a captura de tela parece um exemplo de e-mail para mim. Se você reler a pergunta, não se trata de resolver um problema de FTP. Trata-se de pesquisar o log do SSIS e enviar e-mails. Definitivamente, não há nada sobre "a tarefa de script que aparece logo antes da tarefa de FTP" lá. Na minha perspectiva, a verdadeira questão aqui é sobre o registro e o alerta.
precisa saber é o seguinte
@ Nick.McDermaid Para mim, a captura de tela do email parecia que alguém já a reduziu a estar relacionada a um problema de autenticação de FTP, embora a funcionalidade FTP esteja sendo usada em um trabalho SSIS utilizando o protocolo FTP de acordo. Eu estava dizendo apenas para solucionar o problema de autenticação de FTP, basta confirmar que as informações de credenciais de FTP em um trabalho do SSIS funcionam com outro método de conexão FTP fora do trabalho do SSIS para garantir que o nome de usuário e a senha que você está usando, por exemplo, não permitam acesso.
Pimp Juice IT
Ha, " como um exemplo de e-mail " .... sério, você é um comediante .... esse é o fator determinante de toda a pergunta. Eu acho que você está errado e é isso mesmo !! Eu estava tentando ajudar a solucionar facilmente o problema de autenticação de 101 FTP via processo de eliminação. Talvez seja muito básico e padrão, mas de acordo com minha interpretação e o carimbo de data e hora da resposta de novato que eu forneci, é isso que foi tão engraçado quanto possível. Se eu estiver errado, legal; pelo menos eu posso admitir e aprender com isso. LOL
Pimp Juice IT