paketlerdeki hataları bulmak için SSISDB nasıl sorgulanır?


15

Bu soruyu gördüm SSIS 2012 - şu anda nasıl paketleri T-SQL'de çalışan sorgulamak için?

Bana şu senaryoyu veriyor:

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;

Ama bu benim görevime cevap vermiyor. Paketlerin başarısız olmasının nedenlerini araştırıyorum ve hata iletilerini almam gerekiyor.

Nereden bulabilirim?

Hata mesajını sorgulamak için T-SQL kullanmak istiyorum.

Ayrıca, beni yakın alır, ama tam olarak değil, bu komut dosyası var:

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

Bu, ele almak istediğim e-posta, bu hata mesajına nasıl ulaştılar:

SSIS hatalarının nasıl giderileceği ile ilgili her türlü bilgi açıktır.

resim açıklamasını buraya girin

Yanıtlar:


22

Kullandığım bir avuç sorgu var. Genel kavramlar, bilgileri içeren tablodur catalog.operation_messagesve 120 (hata) türündeki olaylarla ilgilenirsiniz.

Bir sorgunun ne kadar sağlam olmasını istediğinize bağlı olarak, aşağıdaki iki türetilmiş tablo da ilgi çekici olabilir.

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

Hatalar hakkında bilgi bulmak için böyle sorgular kullanıyorum. Belki sadece hataların ne olduğunu umuyorum (sorgu 1). Diğer zamanlarda, başarısız olan tüm işlemlerin tüm aktivitelerini bilmek istiyorum (sorgu 2). Genellikle tembelim ve son başarısız olan işlemle ilgili tüm bilgileri görmek istiyorum (sorgu 3 ve uyarıyı not edin).

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

Belki de tembelim ve bir başarısızlık durumunda ekibinizin yaptığı gibi bu bilgilere bakmak istemiyorum. İstek üzerine çalışan bir SQL Agent işi var ve hata durumunda bu işi çalıştırmak için ayarlanmış SSIS paketleri çalıştıran işler var.

DECLARE
    @profile_name sysname = 'SQLAdmins'
,   @recipients varchar(max) = 'billinkc@kfc.com'
,   @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;

İstediğiniz gibi ayarlayın


8

Kullanabilirsiniz:

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

Bu size yalnızca SSIS paketi yürütmelerinden kaynaklanan hata mesajlarını verecektir.


1
YapMSG.message_type IN (120, 130)
AmDB

1
@AmDB: Soru uyarılarla değil hatalarla ilgili. Uyarılar da istiyorsanız, 130_ ileti_türü de eklenebilir.
Peter Elzinga

4

İşte SSISDB'den iş hata mesajını bulmak için oluşturduğum bir sorgu:

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 

Ayrıntılı açıklama için lütfen: paketlerdeki hataları bulmak için SSISDB nasıl sorgulanır?


1

Gerçekten neden başarısız olduğunu bilmek istiyorsanız, paketle ilgili kontrol etmeniz ve bunun bir bağlantı veya kimlik doğrulama sorunu olmadığından emin olmak için nasıl sorun gidereceğinizi burada görebilirsiniz.

Bak script taskhemen önce görünen FTP taskve FTP bağlantısı için özelliklerini değiştirmek. Bu içermelidir FTP server URL (or IP address), TCP port numberFTP sunucusu üzerinde dinliyor usernameve password.

Bu bağlantı dizesi özelliklerindeki tüm FTP özniteliklerinin doğru ayarlandığından emin olun ve orada akıllıca bir değeriniz olduğunda parola veya yanlış değer sorunu olmadığından emin olmak için bu yöntemle bağlantıya izin verdiğinden emin olmak için komut satırından veya bir FTP istemci aracından test edin bağlandığınız şeyin


Soruda bahsedilen herhangi bir komut dosyası veya FTP görevi yok.
Nick.McDermaid

@ Nick.McDermaid Uh .... aslında tamamen altından bakarsanız, sorunun en alt ekran görüntüsünde özellikle gösterilir. Görünüşe göre, aldığı e-posta, işin başarısız olmasının nedeninin FTP sorunu nedeniyle olduğunu gösteriyor. Bir dahaki sefere yanlış düşüncelerinize göre oy vermeye karar verdiğinizde, insanların içeriğini incelemeye başlamadan önce tamamen soruyu ve içeriğini iyice okuduğunuzdan emin olun.
Pezevenk Suyu BT

LOL oldukça gereksizdi. Sonunda ekran görüntüsünde FTP'den bahsediyorsunuz. Ancak ekran görüntüsü bana örnek bir e-posta gibi görünüyor. Soruyu tekrar okursanız, bu bir FTP sorununu çözmekle ilgili değildir. SSIS günlüğünde arama yapmak ve e-posta göndermekle ilgilidir. Orada "FTP görevinden hemen önce görünen komut dosyası görevi" hakkında kesinlikle hiçbir şey yoktur. Benim açımdan, buradaki asıl soru, kayıt ve uyarı ile ilgilidir.
Nick.McDermaid

@ Nick.McDermaid Bana göre e-posta ekran görüntüsü, FTP protokolünü kullanan bir SSIS işinde kullanılan FTP işlevselliği olmasına rağmen, birisinin zaten bir FTP kimlik doğrulama sorunuyla ilgili olması için onu daraltmış gibi görünüyordu. FTP kimlik doğrulama sorununu gidermek için sadece bir SSIS işindeki FTP kimlik bilgilerinin, örneğin kullandığınız kullanıcı adı ve parolanın erişime izin vermediğinden emin olmak için SSIS işinin dışındaki başka bir FTP bağlantı yöntemiyle çalıştığını doğrulayın.
Pezevenk Suyu BT

Ha, " örnek bir e-posta gibi " .... cidden, sen bir komedyensin ... tüm sorunun itici faktörü budur. Ben sade yanlış olduğunu düşünüyorum ve bunun yerine sadece bu !! Eleme işlemi ile 101 FTP kimlik doğrulama sorununu kolayca gidermeye yardımcı olmaya çalışıyordum. Belki çok temel ve standart ama benim yorum ve benim sağladığım çaylak cevap zaman damgası göre, bu olabildiğince komik oldu. Eğer yanılıyorsam, havalı; en azından itiraf edebilir ve ondan öğrenebilirim. LOL
Pezevenk Suyu IT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.