Wie kann man SSISDB abfragen, um die Fehler in den Paketen herauszufinden?

15

Ich habe diese Frage gesehen. SSIS 2012 - Abfrage der aktuell ausgeführten Pakete in T-SQL?

Es gibt mir das folgende Skript:

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;

Aber es beantwortet meine Suche nicht. Ich untersuche die Gründe, warum Pakete fehlschlagen, und ich muss die Fehlermeldungen abrufen.

Wo kann ich es finden?

Ich möchte T-SQL verwenden, um die Fehlermeldung abzufragen.

Ich habe auch dieses Skript unten, das mich in die Nähe bringt, aber nicht ganz:

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

Dies ist die E-Mail, an die ich mich wenden möchte, wie sie zu dieser Fehlermeldung gekommen sind:

Informationen zur Fehlerbehebung bei SSIS-Fehlern sind willkommen.

Bildbeschreibung hier eingeben

Marcello Miorelli
quelle

Antworten:

22

Ich habe eine Handvoll Fragen, die ich benutze. Die allgemeinen Konzepte sind, dass die Tabelle mit den Informationen ist catalog.operation_messagesund Sie an Ereignissen mit einem 120 (Fehler) -Typ interessiert sind.

Je nachdem, wie robust eine Abfrage ist, die Sie erstellen möchten, sind möglicherweise auch die folgenden zwei abgeleiteten Tabellen von Interesse.

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

Ich benutze solche Abfragen, um Informationen über die Fehler zu finden. Vielleicht ist mir nur wichtig, was die Fehler waren (Abfrage 1). In anderen Fällen möchte ich alle Aktivitäten aller fehlgeschlagenen Vorgänge kennen (Abfrage 2). Im Allgemeinen bin ich faul und möchte alle Informationen über den letzten fehlgeschlagenen Vorgang anzeigen (Abfrage 3 und Hinweis auf die Einschränkung).

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

Vielleicht bin ich faul und möchte diese Informationen im Falle eines Fehlers nicht nachschlagen, so wie es Ihr Team anscheinend getan hat. Ich habe einen SQL Agent-Job, der bei Bedarf ausgeführt wird, und ich habe Jobs, die SSIS-Pakete ausführen, die so eingestellt sind, dass sie diesen Job im Falle eines Fehlers ausführen.

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;

Passen Sie an, wie Sie möchten

billinkc
quelle
8

Sie können verwenden:

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

Dadurch erhalten Sie nur die Fehlermeldungen von SSIS-Paketausführungen.

Peter Elzinga
quelle
1
Machen Sie esMSG.message_type IN (120, 130)
AmDB
1
@AmDB: Die Frage bezieht sich auf Fehler und nicht auf Warnungen. Wenn Sie auch Warnungen wünschen, können Sie auch message_type 130 hinzufügen.
Peter Elzinga
4

Hier ist eine Abfrage, die ich erstellt habe, um die Jobfehlermeldung aus der SSISDB zu finden:

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 

Zur detaillierten Erläuterung lesen Sie bitte: Wie kann man SSISDB abfragen, um die Fehler in den Paketen herauszufinden?

Mangal Pardeshi
quelle
1

Wenn Sie wirklich wissen möchten, warum dies fehlschlägt, überprüfen Sie anhand des Pakets die folgenden Punkte und beheben Sie Fehler, um sicherzustellen, dass es sich nicht um ein Verbindungs- oder Authentifizierungsproblem handelt.

Schauen Sie sich das an script task, das direkt vor dem angezeigt wird, FTP taskund ändern Sie die Eigenschaften für die FTP-Verbindung. Dies sollte das FTP server URL (or IP address), das TCP port numberder FTP-Server abhört, das usernameund das einschließen password.

Stellen Sie sicher, dass alle FTP-Attribute in diesen Eigenschaften der Verbindungszeichenfolge korrekt festgelegt sind, und testen Sie über die Befehlszeile oder ein FTP-Client-Tool, um sicherzustellen, dass die Verbindung auch über diese Methode möglich ist, um sicherzustellen, dass es sich nicht um ein Kennwort oder ein falsches Wertproblem handelt von dem, was Sie verbinden.

Pimp Juice IT
quelle
In der Frage ist kein Skript oder keine FTP-Aufgabe erwähnt.
Nick.McDermaid
@ Nick.McDermaid Ähm .... eigentlich wird das im untersten Screenshot der Frage gezeigt, wenn du es dir ganz ansiehst, wirst du das auch sehen. Es sieht so aus, als ob die E-Mail, die er erhalten hat, den Grund dafür angibt, dass der Auftrag aufgrund eines FTP-Problems fehlgeschlagen ist. Wenn Sie sich das nächste Mal dazu entschließen, etwas aufgrund Ihrer falschen Vorstellungen abzustimmen, lesen Sie die gesamte Frage und deren Inhalt sorgfältig durch, bevor Sie sich mit dem Inhalt von Personen befassen.
Pimp Juice IT
LOL das war ziemlich unnötig. Sie haben Recht, im Screenshot am Ende wird FTP erwähnt. Aber der Screenshot sieht für mich nur wie eine Beispiel-E-Mail aus. Wenn Sie die Frage erneut lesen, geht es nicht darum, ein FTP-Problem zu lösen. Es geht darum, das SSIS-Protokoll zu durchsuchen und E-Mails zu senden. Es gibt definitiv nichts über "die Skriptaufgabe, die direkt vor der FTP-Aufgabe erscheint". Aus meiner Sicht dreht sich hier die eigentliche Frage um Protokollierung und Alarmierung.
Nick.McDermaid
@ Nick.McDermaid Für mich sah der E-Mail-Screenshot so aus, als hätte ihn bereits jemand auf ein FTP-Authentifizierungsproblem beschränkt, obwohl die FTP-Funktionalität in einem SSIS-Auftrag verwendet wird, der das FTP-Protokoll entsprechend verwendet. Ich habe nur gesagt, um das Problem der FTP-Authentifizierung zu beheben, einfach zu bestätigen, dass die FTP-Anmeldeinformationen in einem SSIS-Auftrag mit einer anderen FTP-Verbindungsmethode außerhalb des SSIS-Auftrags zusammenarbeiten, um sicherzustellen, dass der von Ihnen verwendete Benutzername und das Kennwort keinen Zugriff zulassen.
Pimp Juice IT
Ha, " wie eine Beispiel-E-Mail " ... im Ernst, Sie sind ein Komiker ... das ist der treibende Faktor für die gesamte Frage. Ich denke du liegst einfach falsch und das ist es stattdessen !! Ich habe versucht, das Problem der 101-FTP-Authentifizierung mithilfe des Eliminierungsprozesses zu beheben. Vielleicht zu einfach und zu normal, aber gemäß meiner Interpretation und dem Zeitstempel auf der Antwort des Anfängers, die ich gegeben habe, war das ungefähr so ​​lustig, wie es sein mag. Wenn ich mich irre, cool; Zumindest kann ich es zugeben und daraus lernen. LOL
Pimp Juice IT