bagaimana cara meminta SSISDB untuk menemukan kesalahan dalam paket?

15

Saya telah melihat pertanyaan ini SSIS 2012 - Bagaimana Query Menjalankan Paket Saat Ini di T-SQL?

Ini memberi saya skrip berikut:

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;

Tapi itu tidak menjawab pencarian saya. Saya sedang menyelidiki alasan mengapa paket gagal dan saya perlu mendapatkan pesan kesalahan.

Di mana saya bisa menemukannya?

Saya ingin menggunakan T-SQL untuk meminta pesan kesalahan.

Saya juga memiliki skrip di bawah ini, yang membuat saya dekat, tetapi tidak cukup:

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

Ini adalah email yang ingin saya tangani, bagaimana mereka sampai ke pesan kesalahan itu:

Setiap informasi tentang cara mengatasi kesalahan SSIS dipersilahkan.

masukkan deskripsi gambar di sini

Marcello Miorelli
sumber

Jawaban:

22

Saya memiliki beberapa pertanyaan yang saya gunakan. Konsep umum adalah bahwa tabel dengan informasi catalog.operation_messagesdan Anda tertarik pada peristiwa dengan tipe 120 (kesalahan).

Bergantung pada seberapa kuat kueri yang ingin Anda buat, dua tabel turunan berikut ini mungkin juga menarik.

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

Saya menggunakan pertanyaan seperti ini untuk menemukan informasi tentang kesalahan. Mungkin saya hanya peduli tentang kesalahannya (permintaan 1). Di lain waktu, saya ingin mengetahui semua aktivitas semua operasi yang gagal (permintaan 2). Secara umum, saya malas dan ingin melihat semua informasi tentang operasi gagal terakhir (permintaan 3 dan perhatikan peringatan).

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

Mungkin saya malas dan tidak ingin mencari informasi ini jika terjadi kegagalan, seperti yang dilakukan tim Anda. Saya memiliki pekerjaan SQL Agent yang berjalan berdasarkan permintaan dan saya memiliki pekerjaan yang menjalankan paket SSIS diatur untuk menjalankan pekerjaan itu jika terjadi kegagalan.

DECLARE
    @profile_name sysname = 'SQLAdmins'
,   @recipients varchar(max) = '[email protected]'
,   @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;

Sesuaikan sesuka Anda

billinkc
sumber
8

Kamu bisa memakai:

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

Ini hanya akan memberi Anda pesan kesalahan dari eksekusi paket SSIS.

Peter Elzinga
sumber
1
JadikanMSG.message_type IN (120, 130)
AmDB
1
@AmDB: Pertanyaannya adalah tentang kesalahan, bukan peringatan. Jika Anda ingin peringatan juga, seseorang dapat menambahkan message_type 130 juga.
Peter Elzinga
4

Berikut ini adalah satu permintaan yang saya buat untuk menemukan pesan kesalahan pekerjaan dari 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 

Untuk penjelasan detail, silakan: bagaimana cara meminta SSISDB untuk mengetahui kesalahan dalam paket?

Mangal Pardeshi
sumber
1

Jika Anda benar-benar ingin tahu mengapa itu gagal, berikut adalah beberapa hal untuk diperiksa dengan paket dan cara memecahkan masalah untuk memastikan itu bukan masalah koneksi atau otentikasi.

Lihatlah script taskyang muncul tepat sebelum FTP taskdan ubah properti untuk koneksi FTP. Ini harus mencakup FTP server URL (or IP address), TCP port numberserver FTP mendengarkan username,, dan password.

Pastikan bahwa semua atribut FTP dalam properti string koneksi ini diatur dengan benar, dan uji dari baris perintah atau alat klien FTP untuk memastikan bahwa apa pun yang Anda anggap bijak nilainya di sana juga memungkinkan koneksi melalui metode itu untuk memastikan itu bukan kata sandi atau masalah nilai yang salah dari apa yang Anda hubungkan.

Pimp Juice
sumber
Tidak ada skrip atau tugas FTP yang disebutkan dalam pertanyaan.
Nick.McDermaid
@ Nick.McDermaid Uh .... sebenarnya yang secara spesifik ditampilkan di cuplikan layar terbawah dari pertanyaan jika Anda mencermati sepenuhnya, Anda akan melihatnya juga. Sepertinya email yang diterimanya menunjukkan alasan kegagalan pekerjaan itu karena masalah FTP. Lain kali Anda memutuskan untuk memilih sesuatu berdasarkan kesalahpahaman Anda, pastikan Anda benar-benar membaca seluruh pertanyaan dan isinya sebelum Anda mulai meneliti konten orang.
Pimp Juice,
LOL itu tidak perlu. Anda benar itu menyebutkan FTP di screenshot di akhir. Tapi tangkapan layarnya hanya seperti contoh email untuk saya. Jika Anda membaca ulang pertanyaannya, ini bukan tentang menyelesaikan masalah FTP. Ini tentang mencari log SSIS dan mengirim email. Jelas tidak ada apa-apa tentang "tugas skrip yang muncul tepat sebelum tugas FTP" di sana. Dari sudut pandang saya, pertanyaan sebenarnya di sini adalah tentang pencatatan dan pemberitahuan.
Nick.McDermaid
@ Nick.McDermaid Bagi saya tangkapan layar email tampak seperti seseorang yang mempersempitnya karena terkait dengan masalah otentikasi FTP meskipun itu adalah fungsi FTP yang digunakan dalam pekerjaan SSIS yang memanfaatkan protokol FTP. Saya hanya mengatakan untuk memecahkan masalah otentikasi FTP, cukup konfirmasikan bahwa informasi kredensial FTP dalam pekerjaan SSIS berfungsi dengan metode koneksi FTP lain di luar pekerjaan SSIS untuk memastikan nama pengguna dan kata sandi yang Anda gunakan misalnya tidak mengizinkan akses.
Pimp Juice,
Ha, " seperti email contoh " .... serius, Anda adalah pelawak .... itulah faktor pendorong dari seluruh pertanyaan. Saya pikir Anda salah dan itu saja !! Saya berusaha membantu dengan mudah memecahkan masalah otentikasi FTP 100 melalui proses eliminasi. Mungkin terlalu mendasar dan standar tetapi sesuai dengan interpretasi saya dan cap waktu pada jawaban pemula yang saya berikan, itulah yang kira-kira lucu. Jika saya salah, kerenlah; setidaknya saya bisa mengakui dan belajar darinya. LOL
Pimp Juice IT