як запитувати 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, яка працює на вимогу, і у мене є завдання, які виконують пакети 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 taskі змініть властивості для FTP-з'єднання. Це повинно включати FTP server URL (or IP address), TCP port numberFTP-сервер слухає,username , та і password.

Переконайтесь, що всі атрибути FTP у цих властивостях рядка підключення встановлені правильно, і протестуйте з командного рядка або клієнтського інструменту FTP, щоб переконатися, що все, що у вас є важливим, також дозволяє з'єднання за допомогою цього методу, щоб переконатися, що це не пароль або неправильне значення значення того, з чим ви підключаєтесь.


У запитанні немає сценарію чи завдання FTP.
Nick.McDermaid

@ Nick.McDermaid Uh .... насправді, що конкретно показано в самому нижньому екрані екрана питання, якщо ви переглянете його повністю, ви також побачите це. Схоже, електронний лист, який він отримав, вказував на причину невдалої роботи через проблему FTP. Наступного разу, коли ви вирішите відмовитися від участі в голосуванні, виходячи з ваших помилок, не забудьте уважно прочитати повністю питання та його зміст, перш ніж розпочати перевірку вмісту людей.
Pimp Juice IT

LOL, що було досить непотрібно. Ви праві, він згадує FTP на скріншоті в кінці. Але скріншот просто схожий на приклад електронної пошти для мене. Якщо ви перечитали питання, справа не в вирішенні проблеми FTP. Йдеться про пошук журналу SSIS та надсилання електронних листів. Там точно немає нічого про "завдання скрипта, яке з'являється перед завданням FTP" там. З моєї точки зору, справжнє питання тут стосується реєстрації та оповіщення.
Nick.McDermaid

@ Nick.McDermaid Для мене знімок екрана електронної пошти виглядав так, що хтось уже звузив його до того, що він пов'язаний з проблемою автентифікації FTP, хоча функція FTP використовується в роботі SSIS, використовуючи відповідно протокол FTP. Я щойно казав, щоб вирішити проблему автентифікації FTP, просто підтвердьте, що інформація про вхідні дані FTP в рамках завдання SSIS працює з іншим методом з'єднання FTP за межами завдання SSIS, щоб гарантувати, що ім'я користувача та пароль, наприклад, не дозволяють отримати доступ.
Pimp Juice IT

Ха, " як приклад електронної пошти " .... серйозно, ти комік .... це рушійний фактор у всьому питанні. Я думаю, ти абсолютно неправий, і це замість цього просто !! Я намагався допомогти легко вирішити проблему аутентифікації 101 FTP шляхом усунення. Можливо, занадто базовий і стандартний, але згідно з моєю інтерпретацією та часовою позначкою відповіді новачка, яку я надавав, це те, що було приблизно так само смішно. Якщо я помиляюся, круто; принаймні я можу визнати і навчитися на цьому. LOL
соки сутенерів ІТ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.