jak zapytać SSISDB, aby znaleźć błędy w pakietach?

15

Widziałem to pytanie SSIS 2012 - jak zapytać o aktualnie uruchomione pakiety w T-SQL?

Daje mi następujący skrypt:

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;

Ale to nie odpowiada na moje poszukiwanie. Badam przyczyny niepowodzenia pakietów i muszę uzyskać komunikaty o błędach.

Gdzie mogę to znaleźć?

Chciałbym użyć T-SQL do zapytania o komunikat błędu.

Mam również poniższy skrypt, który zabiera mnie blisko, ale niezupełnie:

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

To jest adres e-mail, na który chciałbym odpowiedzieć, w jaki sposób dotarli do tego komunikatu o błędzie:

Wszelkie informacje dotyczące rozwiązywania problemów z błędami SSIS są mile widziane.

wprowadź opis zdjęcia tutaj

Marcello Miorelli
źródło

Odpowiedzi:

22

Mam garść zapytań, z których korzystam. Ogólne koncepcje są takie, że tabela z informacjami jestcatalog.operation_messages i interesują Cię zdarzenia o typie 120 (błąd).

W zależności od tego, jak solidne zapytanie chcesz zbudować, interesujące mogą być również dwie poniższe tabele pochodne.

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

Używam takich zapytań, aby znaleźć informacje o błędach. Może zależy mi tylko na tym, jakie były błędy (zapytanie 1). Innym razem chcę poznać wszystkie działania wszystkich operacji, które zakończyły się niepowodzeniem (zapytanie 2). Ogólnie jestem leniwy i chcę zobaczyć wszystkie informacje o ostatniej nieudanej operacji (zapytanie 3 i zwróć uwagę na zastrzeżenie).

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

Być może jestem leniwy i nie chcę szukać tych informacji w razie awarii, podobnie jak wydaje się, że twój zespół to zrobił. Mam zadanie agenta SQL, które działa na żądanie, i mam zadania, które uruchamiają pakiety SSIS ustawione do uruchamiania tego zadania w przypadku awarii.

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;

Dostosuj, jak chcesz

billinkc
źródło
8

Możesz użyć:

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

To da ci tylko komunikaty o błędach z wykonania pakietów SSIS.

Peter Elzinga
źródło
1
Zrób toMSG.message_type IN (120, 130)
AmDB,
1
@AmDB: Pytanie dotyczy błędów, a nie ostrzeżeń. Jeśli chcesz też ostrzeżeń, możesz również dodać typ_wiadomości 130.
Peter Elzinga
4

Oto jedno zapytanie, które utworzyłem, aby znaleźć komunikat o błędzie zadania z 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 

Aby uzyskać szczegółowe wyjaśnienie, proszę: jak wykonać zapytanie do SSISDB, aby znaleźć błędy w pakietach?

Mangal Pardeshi
źródło
1

Jeśli naprawdę chcesz wiedzieć, dlaczego nie działa, oto kilka rzeczy, które należy sprawdzić w pakiecie i sposoby rozwiązywania problemów, aby upewnić się, że nie jest to problem z połączeniem ani uwierzytelnieniem.

Spójrz na to, script taskco pojawia się tuż przed FTP taski zmień właściwości połączenia FTP. Powinno to obejmować FTP server URL (or IP address), TCP port numberserwer FTP nasłuchuje,, usernamei password.

Upewnij się, że wszystkie atrybuty FTP w tych właściwościach ciągu połączenia są ustawione poprawnie, i przetestuj z poziomu wiersza poleceń lub narzędzia klienta FTP, aby upewnić się, że wszystko, co masz pod względem wartości, pozwala również na połączenie za pomocą tej metody, aby upewnić się, że nie jest to problem z hasłem lub nieprawidłową wartością tego, z czym się łączysz.

Pimp Juice IT
źródło
W pytaniu nie wspomniano o skrypcie ani zadaniu FTP.
Nick.McDermaid
@ Nick.McDermaid Uh .... w rzeczywistości jest to pokazane na najniższym zrzucie ekranu pytania, jeśli przejrzysz je całkowicie, zobaczysz to również. Wygląda na to, że e-mail, który dostał, wskazywał przyczynę niepowodzenia zadania z powodu problemu z FTP. Następnym razem, gdy zdecydujesz się odrzucić głosowanie w oparciu o swoje nieporozumienia, upewnij się, że dokładnie przeczytałeś całe pytanie i jego treść, zanim zaczniesz analizować treści ludzkie.
Pimp Juice IT
LOL to było dość niepotrzebne. Masz rację, na końcu zrzut ekranu wspomina o FTP. Ale zrzut ekranu wygląda dla mnie jak przykładowy e-mail. Jeśli ponownie przeczytasz pytanie, nie chodzi o rozwiązanie problemu z FTP. Chodzi o przeszukiwanie dziennika SSIS i wysyłanie e-maili. Tam zdecydowanie nie ma nic o „zadaniu skryptowym, które pojawia się tuż przed zadaniem FTP”. Z mojej perspektywy prawdziwe pytanie dotyczy logowania i powiadamiania.
Nick.McDermaid
@ Nick.McDermaid Dla mnie zrzut ekranu e-maila wyglądał, jakby ktoś już go zawęził do kwestii związanej z uwierzytelnieniem FTP, mimo że jest to funkcja FTP używana w zadaniu SSIS z wykorzystaniem protokołu FTP. Właśnie mówiłem, aby rozwiązać problem z uwierzytelnianiem FTP, po prostu potwierdź, że informacje poświadczeń FTP w zadaniu SSIS działają z inną metodą połączenia FTP poza zadaniem SSIS, aby upewnić się, że na przykład nazwa użytkownika i hasło nie pozwalają na dostęp.
Pimp Juice IT
Ha, „ jak przykładowy e-mail ”… poważnie, jesteś komikiem… to jest motorem całego pytania. Myślę, że jesteś w błędzie i to po prostu tyle !! Próbowałem pomóc w rozwiązaniu problemu z uwierzytelnianiem FTP 101 poprzez proces eliminacji. Może zbyt podstawowy i standardowy, ale zgodnie z moją interpretacją i znacznikiem czasu na odpowiedź, którą podałem, oto, co mogło być tak zabawne, jak mogłoby być. Jeśli się mylę, spoko; przynajmniej mogę się z tym przyznać i uczyć. LOL
Pimp Juice IT