Làm thế nào để truy vấn SSISDB để tìm ra các lỗi trong các gói?


15

Tôi đã thấy câu hỏi này SSIS 2012 - Cách truy vấn các gói hiện đang chạy trong T-SQL?

Nó cho tôi đoạn script sau:

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;

Nhưng nó không trả lời nhiệm vụ của tôi. Tôi đang điều tra lý do tại sao các gói không thành công và tôi cần phải giữ các thông báo lỗi.

Tôi có thể tìm thấy nó ở đâu?

Tôi muốn sử dụng T-SQL để truy vấn thông báo lỗi.

Tôi cũng có đoạn script này bên dưới, nó đưa tôi đến gần, nhưng không hoàn toàn:

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

Đây là email tôi muốn giải quyết, làm thế nào họ nhận được thông báo lỗi đó:

Mọi thông tin về cách khắc phục lỗi SSIS đều được hoan nghênh.

nhập mô tả hình ảnh ở đây

Câu trả lời:


22

Tôi có một số ít các truy vấn tôi sử dụng. Các khái niệm chung là bảng với thông tin làcatalog.operation_messages và bạn quan tâm đến các sự kiện với loại 120 (lỗi).

Tùy thuộc vào mức độ mạnh mẽ của truy vấn bạn muốn xây dựng, hai bảng dẫn xuất sau đây cũng có thể được quan tâm.

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

Tôi sử dụng các truy vấn như thế này để tìm thông tin về các lỗi. Có lẽ tôi chỉ quan tâm đến những lỗi là gì (truy vấn 1). Lần khác, tôi muốn biết tất cả các hoạt động của tất cả các hoạt động không thành công (truy vấn 2). Nói chung, tôi lười biếng và muốn xem tất cả thông tin về hoạt động thất bại cuối cùng (truy vấn 3 và lưu ý cảnh báo).

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

Có lẽ tôi lười biếng và không muốn tìm kiếm thông tin này trong trường hợp thất bại, giống như nhóm của bạn đã làm. Tôi có một công việc Đại lý SQL chạy theo yêu cầu và tôi có các công việc chạy các gói SSIS được thiết lập để chạy công việc đó trong trường hợp thất bại.

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;

Điều chỉnh theo ý muốn


8

Bạn có thể dùng:

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

Điều này sẽ chỉ cung cấp cho bạn các thông báo lỗi từ các lần thực thi gói SSIS.


1
Làm cho nóMSG.message_type IN (120, 130)
AmDB

1
@AmDB: Câu hỏi là về lỗi, không phải cảnh báo. Nếu bạn cũng muốn cảnh báo, người ta cũng có thể thêm message_type 130.
Peter Elzinga

4

Đây là một truy vấn tôi đã tạo để tìm thông báo lỗi công việc từ 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 

Để được giải thích chi tiết, vui lòng: cách truy vấn SSISDB để tìm ra các lỗi trong các gói?


1

Nếu bạn thực sự muốn biết tại sao nó không thành công, đây là một số điều cần kiểm tra với gói và cách khắc phục sự cố để đảm bảo đó không phải là vấn đề về kết nối hoặc xác thực.

Nhìn vào script taskcái xuất hiện ngay trước FTP taskvà thay đổi các thuộc tính cho kết nối FTP. Điều này sẽ bao gồm FTP server URL (or IP address), TCP port numbermáy chủ FTP lắng nghe username, và password.

Đảm bảo rằng tất cả các thuộc tính FTP trong các thuộc tính chuỗi kết nối này được đặt chính xác và kiểm tra từ dòng lệnh hoặc công cụ máy khách FTP để đảm bảo rằng bất cứ điều gì bạn có giá trị khôn ngoan trong đó cũng cho phép kết nối qua phương thức đó để đảm bảo đó không phải là vấn đề về mật khẩu hoặc giá trị không chính xác về những gì bạn đang kết nối.


Không có kịch bản hoặc tác vụ FTP được đề cập trong câu hỏi.
Nick.McDilyn

@ Nick.McDilyn Uh .... thực sự điều đó được hiển thị trong phần lớn màn hình dưới cùng của câu hỏi nếu bạn nhìn nó hoàn toàn bạn cũng sẽ thấy điều đó. Có vẻ như email anh nhận được cho biết lý do công việc thất bại là do vấn đề FTP. Lần tới khi bạn quyết định bỏ phiếu một cái gì đó dựa trên quan niệm sai lầm của bạn, hãy chắc chắn bạn đọc kỹ toàn bộ câu hỏi và nội dung của nó trước khi bạn bắt đầu xem xét nội dung của mọi người.
Pimp Juice IT

LOL đó là không cần thiết. Bạn đã đúng nó đề cập đến FTP trong ảnh chụp màn hình ở cuối. Nhưng ảnh chụp màn hình trông giống như một email ví dụ cho tôi. Nếu bạn đọc lại câu hỏi, đó không phải là giải quyết vấn đề FTP. Đó là về việc tìm kiếm nhật ký SSIS và gửi email. Chắc chắn không có gì về "tác vụ kịch bản xuất hiện ngay trước nhiệm vụ FTP" ở đó. Từ quan điểm của tôi, câu hỏi thực sự ở đây là về đăng nhập và cảnh báo.
Nick.McDilyn

@ Nick.McDilyn Đối với tôi, ảnh chụp màn hình email trông giống như ai đó đã thu hẹp nó có liên quan đến vấn đề xác thực FTP mặc dù chức năng FTP được sử dụng trong công việc SSIS sử dụng giao thức FTP phù hợp. Tôi chỉ nói để khắc phục sự cố xác thực FTP, chỉ cần xác nhận rằng thông tin xác thực FTP trong công việc SSIS hoạt động với một phương thức kết nối FTP khác ngoài công việc SSIS để đảm bảo tên người dùng và mật khẩu bạn đang sử dụng chẳng hạn không cho phép truy cập.
Pimp Juice IT

Ha, " như một ví dụ email " .... nghiêm túc, bạn là một diễn viên hài .... đó là yếu tố thúc đẩy của toàn bộ câu hỏi. Tôi nghĩ rằng bạn hoàn toàn sai và đó chỉ là thay thế !! Tôi đã cố gắng giúp dễ dàng khắc phục sự cố 101 xác thực FTP thông qua quá trình loại bỏ. Có thể quá cơ bản và tiêu chuẩn nhưng theo cách giải thích của tôi và dấu thời gian trên câu trả lời của tân binh tôi đã cung cấp, đó là những gì buồn cười như nó có thể. Nếu tôi sai, tuyệt vời; ít nhất tôi có thể thừa nhận và học hỏi từ nó. LOL
Pimp Juice IT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.