จะค้นหา SSISDB เพื่อค้นหาข้อผิดพลาดในแพ็คเกจได้อย่างไร


15

ฉันเคยเห็นคำถามนี้ SSIS 2012 - วิธีการสืบค้นแพคเกจที่รันอยู่ใน T-SQL ในปัจจุบัน?

มันให้สคริปต์ต่อไปนี้กับฉัน:

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;

แต่มันไม่ตอบคำถามของฉัน ฉันกำลังตรวจสอบสาเหตุที่ทำให้แพคเกจล้มเหลวและฉันจำเป็นต้องได้รับข้อความแสดงข้อผิดพลาด

หาได้ที่ไหน

ฉันต้องการใช้ T-SQL เพื่อค้นหาข้อความแสดงข้อผิดพลาด

ฉันยังมีสคริปต์ด้านล่างนี้ที่นำฉันเข้ามาใกล้ แต่ไม่มาก:

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

นี่คืออีเมลที่ฉันต้องการจัดการพวกเขาถึงข้อความแสดงข้อผิดพลาดได้อย่างไร:

ข้อมูลใด ๆ ที่เป็นวิธีการแก้ไขข้อผิดพลาด SSIS ยินดีต้อนรับ

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


22

ฉันมีข้อซักถามจำนวนหนึ่งที่ฉันใช้ แนวคิดทั่วไปคือตารางที่มีข้อมูลอยู่catalog.operation_messagesและคุณสนใจกิจกรรมที่มีประเภท 120 (ข้อผิดพลาด)

ขึ้นอยู่กับความแข็งแกร่งของแบบสอบถามที่คุณต้องการสร้างตารางที่ได้รับมาสองตารางต่อไปนี้อาจเป็นที่สนใจเช่นกัน

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

ฉันใช้แบบสอบถามเช่นนี้เพื่อค้นหาข้อมูลเกี่ยวกับข้อผิดพลาด บางทีฉันแค่สนใจว่าข้อผิดพลาดคืออะไร (แบบสอบถาม 1) บางครั้งฉันต้องการทราบกิจกรรมทั้งหมดของการดำเนินการทั้งหมดที่ล้มเหลว (แบบสอบถาม 2) โดยทั่วไปฉันขี้เกียจและต้องการดูข้อมูลทั้งหมดเกี่ยวกับการดำเนินการล้มเหลวครั้งล่าสุด (แบบสอบถาม 3 และจดบันทึกคำเตือน)

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

บางทีฉันอาจขี้เกียจและไม่ต้องการดูข้อมูลนี้ในกรณีที่เกิดความล้มเหลวมากเท่าที่ทีมของคุณทำ ฉันมีงาน SQL Agent ที่ทำงานตามความต้องการและฉันมีงานที่เรียกใช้แพคเกจ SSIS เพื่อให้ทำงานในกรณีที่เกิดความล้มเหลว

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;

ปรับตามที่คุณต้องการ


8

คุณสามารถใช้ได้:

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

สิ่งนี้จะให้เฉพาะข้อความแสดงข้อผิดพลาดจากการดำเนินการแพคเกจ SSIS


1
ทำมันMSG.message_type IN (120, 130)
AmDB

1
@AmDB: คำถามเกี่ยวกับข้อผิดพลาดไม่ใช่คำเตือน หากคุณต้องการคำเตือนคุณสามารถเพิ่ม message_type 130 ได้เช่นกัน
ปีเตอร์ Elzinga

4

นี่คือหนึ่งแบบสอบถามที่ฉันสร้างขึ้นเพื่อค้นหาข้อความแสดงข้อผิดพลาดงานจาก 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 

สำหรับคำอธิบายรายละเอียดโปรด: วิธีการสอบถาม SSISDB เพื่อหาข้อผิดพลาดในแพ็คเกจ?


1

หากคุณต้องการทราบว่าเหตุใดจึงล้มเหลวนี่คือบางสิ่งที่ต้องตรวจสอบกับแพคเกจและวิธีแก้ไขปัญหาเพื่อให้แน่ใจว่าไม่ใช่ปัญหาการเชื่อมต่อหรือการตรวจสอบสิทธิ์

ดูที่script taskปรากฏก่อนหน้าFTP taskและเปลี่ยนคุณสมบัติสำหรับการเชื่อมต่อ FTP นี้ควรรวมถึงการFTP server URL (or IP address)ที่TCP port numberเซิร์ฟเวอร์ FTP ฟังที่และusernamepassword

ตรวจสอบให้แน่ใจว่าแอตทริบิวต์ FTP ทั้งหมดในคุณสมบัติสตริงการเชื่อมต่อเหล่านี้ได้รับการตั้งค่าอย่างถูกต้องและทดสอบจากบรรทัดคำสั่งหรือเครื่องมือไคลเอนต์ FTP เพื่อให้แน่ใจว่าสิ่งที่คุณมีคุณค่าในนั้นยังช่วยให้การเชื่อมต่อผ่านวิธีนั้น ในสิ่งที่คุณกำลังเชื่อมต่อ


ไม่มีงานสคริปต์หรือ FTP ที่กล่าวถึงในคำถาม
Nick.McD เงือก

@ Nick.McDermaid Uh .... จริง ๆ แล้วมันจะแสดงเฉพาะในสกรีนช็อตด้านล่างสุดของคำถามหากคุณมองมันอย่างสมบูรณ์คุณจะเห็นว่า ดูเหมือนว่าอีเมลที่เขาได้รับนั้นระบุว่าสาเหตุที่งานล้มเหลวเนื่องจากปัญหา FTP ครั้งต่อไปที่คุณตัดสินใจลงคะแนนบางอย่างจากความเข้าใจผิดของคุณให้แน่ใจว่าคุณอ่านคำถามและเนื้อหาทั้งหมดอย่างถี่ถ้วนก่อนที่จะเริ่มตรวจสอบเนื้อหาของผู้คน
Pimp Juice IT

ฮ่า ๆ มันไม่จำเป็นเลย คุณพูดถูก FTP ในภาพหน้าจอในตอนท้าย แต่ภาพหน้าจอนั้นดูเหมือนอีเมลตัวอย่างถึงฉัน หากคุณอ่านคำถามอีกครั้งมันไม่เกี่ยวกับการแก้ปัญหา FTP มันเกี่ยวกับการค้นหาบันทึก SSIS และส่งอีเมล ไม่มีอะไรเกี่ยวกับ "งานสคริปต์ที่ปรากฏขึ้นก่อนหน้าที่งาน FTP" ที่นั่น จากมุมมองของฉันคำถามจริงที่นี่เป็นเรื่องเกี่ยวกับการบันทึกและการแจ้งเตือน
Nick.McDermaid

@ Nick.McDermaid สำหรับฉันแล้วหน้าจออีเมลที่ถ่ายดูเหมือนว่ามีใครบางคนลดความสัมพันธ์ลงไปที่เกี่ยวข้องกับปัญหาการรับรองความถูกต้อง FTP แม้ว่าจะเป็นฟังก์ชั่น FTP ที่ใช้ภายในงาน SSIS โดยใช้โปรโตคอล FTP ตามนั้น ฉันแค่บอกว่าจะแก้ไขปัญหาการรับรองความถูกต้อง FTP เพียงยืนยันว่าข้อมูลรับรอง FTP ภายในงาน SSIS ทำงานร่วมกับวิธีการเชื่อมต่อ FTP อื่นนอกงาน SSIS เพื่อให้แน่ใจว่าชื่อผู้ใช้และรหัสผ่านที่คุณใช้นั้นไม่อนุญาตให้เข้าถึง
Pimp Juice IT

ฮ่า " เหมือนอีเมลตัวอย่าง " .... อย่างจริงจังคุณเป็นนักแสดงตลก .... นั่นเป็นปัจจัยผลักดันของคำถามทั้งหมด ฉันคิดว่าคุณผิดธรรมดาและนั่นก็แค่แทน !! ฉันพยายามช่วยแก้ไขปัญหาการตรวจสอบสิทธิ์ FTP 101 อย่างง่ายดายผ่านขั้นตอนการกำจัด อาจธรรมดาและมาตรฐานเกินไป แต่ตามการตีความของฉันและเวลาประทับบนคำตอบมือใหม่ที่ฉันให้ไว้นั่นคือสิ่งที่เกี่ยวกับตลกอย่างที่มันอาจจะเป็น ถ้าฉันผิด อย่างน้อยฉันก็สามารถยอมรับและเรียนรู้จากมัน LOL
Pimp Juice IT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.