J'ai vu cette question SSIS 2012 - Comment interroger les packages en cours d'exécution dans T-SQL?
Cela me donne le script suivant:
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;
Mais cela ne répond pas à ma quête. J'étudie les raisons de l'échec des packages et je dois récupérer les messages d'erreur.
Où puis-je le trouver?
Je voudrais utiliser T-SQL pour rechercher le message d'erreur.
J'ai aussi ce script ci-dessous, qui me rapproche, mais pas tout à fait:
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
Voici l'email que je voudrais aborder, comment ont-ils pu arriver à ce message d'erreur:
Toute information sur la façon de résoudre les erreurs SSIS est la bienvenue.
J'ai une poignée de requêtes que j'utilise. Les concepts généraux sont que le tableau avec les informations est catalog.operation_messages
et vous êtes intéressé par les événements de type 120 (erreur).
Selon la robustesse d'une requête que vous souhaitez développer, les deux tables dérivées suivantes peuvent également vous intéresser.
--- 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);
J'utilise des requêtes comme celle-ci pour trouver des informations sur les erreurs. Peut-être que je ne me soucie que des erreurs (requête 1). D'autres fois, je veux connaître toutes les activités de toutes les opérations qui ont échoué (requête 2). En général, je suis paresseux et je veux voir toutes les informations sur la dernière opération qui a échoué (requête 3 et notez la mise en garde).
-- 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
);
Je suis peut-être paresseux et je ne veux pas aller chercher ces informations en cas d'échec, tout comme votre équipe semble l'avoir fait. J'ai un travail SQL Agent qui s'exécute à la demande et j'ai des travaux qui exécutent des packages SSIS définis pour exécuter ce travail en cas d'échec.
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;
Ajustez comme vous le souhaitez
Vous pouvez utiliser:
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
Cela vous donnera uniquement les messages d'erreur des exécutions de packages SSIS.
Voici une requête que j'ai créée pour trouver le message d'erreur du travail à partir de 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
Pour l'explication détaillée, veuillez: comment interroger SSISDB pour trouver les erreurs dans les packages?
Si vous voulez vraiment savoir pourquoi il échoue, voici quelques éléments à vérifier avec le package et comment dépanner pour vous assurer qu'il ne s'agit pas d'un problème de connexion ou d'authentification.
Regardez le script task
Qui apparaît juste avant le FTP task
Et modifiez les propriétés de la connexion FTP. Cela devrait inclure la FTP server URL (or IP address)
, le TCP port number
Sur lequel le serveur FTP écoute, le username
et password
.
Assurez-vous que tous les attributs FTP dans ces propriétés de chaîne de connexion sont définis correctement et testez à partir de la ligne de commande ou d'un outil client FTP pour vous assurer que tout ce que vous avez de valeur permet également la connexion via cette méthode pour vous assurer qu'il ne s'agit pas d'un mot de passe ou d'un problème de valeur incorrecte de ce à quoi vous vous connectez.