패키지의 오류를 찾기 위해 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_messages120 (오류) 유형의 이벤트에 관심이 있다는 것입니다.

빌드하려는 쿼리의 강도에 따라 다음 두 파생 테이블도 관심이있을 수 있습니다.

--- 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 에이전트 작업이 있고 오류 발생시 해당 작업을 실행하도록 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도 추가 할 수 있습니다.
피터 엘 칭가

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 taskFTP 연결 속성을 변경하십시오. 이것은을 포함해야 FTP server URL (or IP address)TCP port numberFTP 서버가 수신 대기의 username, 및 password.

이러한 연결 문자열 속성의 모든 FTP 속성이 올바르게 설정되어 있는지 확인하고 명령 줄 또는 FTP 클라이언트 도구에서 테스트하여 값이 현명한 것이 있으면 해당 방법을 통한 연결이 암호 또는 잘못된 값 문제가 아닌지 확인하십시오. 당신이 연결하는 것의.


질문에 언급 된 스크립트 또는 FTP 작업이 없습니다.
Nick.McDermaid 4

@ Nick.McDermaid Uh .... 실제로 질문의 맨 아래 스크린 샷에 구체적으로 표시됩니다. 완전히 살펴보면 그 내용도 볼 수 있습니다. 그가받은 이메일은 작업 실패의 이유가 FTP 문제 때문인 것으로 보입니다. 다음에 오해에 근거하여 투표하지 않기로 결정할 때, 사람들의 내용을 조사하기 전에 전체 질문과 내용을 철저히 읽으십시오.
Pimp Juice IT

꽤 불필요했습니다. 끝의 스크린 샷에서 FTP를 언급 한 것이 맞습니다. 그러나 스크린 샷은 이메일 예입니다. 질문을 다시 읽으면 FTP 문제를 해결하는 것이 아닙니다. SSIS 로그를 검색하고 이메일을 보내는 것입니다. 거기에는 "FTP 작업 바로 전에 나타나는 스크립트 작업"에 대한 내용은 없습니다. 내 관점에서 볼 때 실제 질문은 로깅 및 경고에 관한 것입니다.
Nick.McDermaid

@ Nick.McDermaid 나에게 이메일 스크린 샷은 FTP 프로토콜을 사용하는 SSIS 작업에서 사용되는 FTP 기능이지만 FTP 인증 문제와 관련이있는 것으로 이미 누군가 좁혀 보였습니다. FTP 인증 문제를 해결하기 위해 SSIS 작업 내의 FTP 자격 증명 정보가 SSIS 작업 외부의 다른 FTP 연결 방법과 함께 작동하여 예를 들어 사용중인 사용자 이름 및 비밀번호가 액세스를 허용하지 않는지 확인하십시오.
Pimp Juice IT

하, " 예제 이메일처럼 ".... 진지하게, 당신은 코미디언입니다 ... 전체 질문의 원동력입니다. 나는 당신이 명백한 잘못이라고 생각합니다. 제거 프로세스를 통해 101 FTP 인증 문제를 쉽게 해결하려고 노력했습니다. 어쩌면 너무 기본적이고 표준이지만 내 해석과 내가 제공 한 신인 답변의 타임 스탬프에 따르면 그것이 재미있을 것입니다. 내가 틀렸다면 시원하다. 적어도 나는 그것을 인정하고 배울 수 있습니다. LOL
Pimp Juice IT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.