Xml 是否有SSIS连接器用于拾取.xel文件(扩展事件)?方法和校正
我目前正在进行一个项目,以分析使用扩展事件在一个多维数据集上使用维度/度量的情况。由于我们使用的是SQL Server 2012,因此扩展事件GUI不可用。我使用sys.fn_xe_file_target_read_file以XML格式返回文件,每行一个事件 然后,我将把XML中的关键元素解析到一个暂存表中Xml 是否有SSIS连接器用于拾取.xel文件(扩展事件)?方法和校正,xml,ssis,sql-server-2012,extended-events,ssis-2019,Xml,Ssis,Sql Server 2012,Extended Events,Ssis 2019,我目前正在进行一个项目,以分析使用扩展事件在一个多维数据集上使用维度/度量的情况。由于我们使用的是SQL Server 2012,因此扩展事件GUI不可用。我使用sys.fn_xe_file_target_read_file以XML格式返回文件,每行一个事件 然后,我将把XML中的关键元素解析到一个暂存表中 select xe.TraceFileName , xe.TraceEvent , xe.EventDataXML.value('(/event/data[@name="
select xe.TraceFileName
, xe.TraceEvent
, xe.EventDataXML.value('(/event/data[@name="EventSubclass"]/value)[1]', 'int') as EventSubclass
, xe.EventDataXML.value('(/event/data[@name="ServerName"]/value)[1]', 'varchar(50)') as ServerName
, xe.EventDataXML.value('(/event/data[@name="DatabaseName"]/value)[1]', 'varchar(50)') as DatabaseName
, xe.EventDataXML.value('(/event/data[@name="NTDomainName"]/value)[1]', 'varchar(50)') as NTDomainName
, xe.EventDataXML.value('(/event/data[@name="NTUserName"]/value)[1]', 'varchar(50)') as NTUserName
, xe.EventDataXML.value('(/event/data[@name="NTCanonicalUserName"]/value)[1]', 'varchar(50)') as NTCanonicalUserName
, xe.EventDataXML.value('(/event/data[@name="ConnectionID"]/value)[1]', 'int') as ConnectionID
, xe.EventDataXML.value('(/event/data[@name="StartTime"]/value)[1]', 'datetime') as StartTime
, xe.EventDataXML.value('(/event/data[@name="EndTime"]/value)[1]', 'datetime') as EndTime
, xe.EventDataXML.value('(/event/data[@name="Duration"]/value)[1]', 'bigint') as Duration
, xe.EventDataXML.value('(/event/data[@name="TextData"]/value)[1]', 'varchar(max)') as TextData
into #List
from
(
select [file_name] as TraceFileName
, object_name as TraceEvent
, convert(xml, event_data) as EventDataXML
from sys.fn_xe_file_target_read_file('path\filename*.xel', null, null, null)
) xe;
.xel文件每天都会附加到。我需要设置一种机制,使用SSIS包每天归档文件,并应用上面的sql逻辑将数据读取到临时/暂存表中/
但是,我正在努力在SSI上找到合适的连接器。它们都不允许我从文件夹中提取.xel文件。TSQL正在通过sys.fn\u xe\u file\u target\u read\u文件处理文件的读取,因此我认为您正在查看数据流任务。其中的源将是一个OLEDB源组件,上面的查询将作为您的起点 这将把这N列添加到数据流中,然后您可以将它们放在任何地方。如果都在同一台服务器上,我会跳过数据流,改用执行SQL任务 这是我XE监控的一部分,也许对你有用
CREATE PROCEDURE dbo.ExtendedEventCaptureStop
AS
BEGIN
SET NOCOUNT ON;
--------------------------------------------------------------------------------
-- Turn off our extended event
--------------------------------------------------------------------------------
IF EXISTS
(
-- When a XE is active, then there is an entry
-- in sys.dm_xe_sessions
SELECT
*
FROM
sys.dm_xe_sessions AS DXS
INNER JOIN
sys.server_event_sessions AS SES
ON SES.name = DXS.name
WHERE
SES.name = N'what_queries_are_failing'
)
BEGIN
-- Start the session
ALTER EVENT SESSION what_queries_are_failing
ON SERVER STATE = STOP;
END
--------------------------------------------------------------------------------
-- Extract data from our XE
--------------------------------------------------------------------------------
;
WITH events_cte AS
(
SELECT
DATEADD(mi,
DATEDIFF(mi, GETUTCDATE(), CURRENT_TIMESTAMP),
xevents.event_data.value('(event/@timestamp)[1]', 'datetime2')) AS [err_timestamp],
xevents.event_data.value('(event/data[@name="severity"]/value)[1]', 'bigint') AS [err_severity],
xevents.event_data.value('(event/data[@name="error_number"]/value)[1]', 'bigint') AS [err_number],
xevents.event_data.value('(event/data[@name="message"]/value)[1]', 'nvarchar(512)') AS [err_message],
xevents.event_data.value('(event/action[@name="database_id"]/value)[1]', 'int') AS [database_id],
xevents.event_data.value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS [sql_text],
xevents.event_data,
xevents.event_data.value('(event/action[@name="username"]/value)[1]', 'nvarchar(512)') AS [username],
'what_queries_are_failing' AS session_name
FROM sys.fn_xe_file_target_read_file
(
'D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing*.xel'
, 'D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing*.xem'
, NULL
, NULL) AS fxe
CROSS APPLY (SELECT CAST(event_data as XML) AS event_data) AS xevents
)
INSERT INTO
dbo.ExtendedEventErrorCapture
(
err_timestamp
, err_severity
, err_number
, err_message
, database_id
, sql_text
, event_data
, session_name
, username
)
SELECT
E.err_timestamp
, E.err_severity
, E.err_number
, E.err_message
, E.database_id
, E.sql_text
, E.event_data
, E.session_name
, E.username
FROM
events_cte AS E;
--------------------------------------------------------------------------------
-- Get rid our extended event files only if the XE is turned off
-- or no longer exists
--------------------------------------------------------------------------------
IF NOT EXISTS
(
SELECT
1
FROM
sys.dm_xe_sessions AS DXS
INNER JOIN
sys.server_event_sessions AS SES
ON SES.name = DXS.name
WHERE
SES.name = N'what_queries_are_failing'
UNION ALL
SELECT
1
FROM
sys.server_event_sessions AS SES
WHERE
SES.name = N'what_queries_are_failing'
)
BEGIN
-- Assumes you've turned on xp_cmdshell
EXECUTE sys.xp_cmdshell'del D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing*.xe*';
END
END
GO
更改文件位置和会话名称后,会停止XE,因此我们不必担心文件被锁定。我将数据从XE解析到我的表中,然后删除文件夹中的所有XE文件
哦,但是现在我的XE会话停止了,我应该重新启动它。这就是程序
CREATE PROCEDURE dbo.ExtendedEventCaptureStart
AS
BEGIN
SET NOCOUNT ON;
--------------------------------------------------------------------------------
-- Create the table to store out the XE data
--------------------------------------------------------------------------------
IF NOT EXISTS
(
SELECT
*
FROM
sys.schemas AS S
INNER JOIN
sys.tables AS T
ON T.schema_id = S.schema_id
WHERE
T.name = 'ExtendedEventErrorCapture'
AND S.name = 'dbo'
)
BEGIN
CREATE TABLE
dbo.ExtendedEventErrorCapture
(
err_timestamp datetime2(7) NULL
, err_severity bigint NULL
, err_number bigint NULL
, err_message nvarchar(512) NULL
, database_id int NULL
, sql_text nvarchar(MAX) NULL
, event_data xml NULL
, session_name sysname
, username nvarchar(512)
)
-- This is only vaild for a Develper/Enterprise edition license
WITH (DATA_COMPRESSION = PAGE);
END
--------------------------------------------------------------------------------
-- Create the extended event to keep track of bad sql queries
--------------------------------------------------------------------------------
IF NOT EXISTS
(
SELECT
*
FROM
sys.server_event_sessions AS SES
WHERE
SES.name = N'what_queries_are_failing'
)
BEGIN
--Create an extended event session
CREATE EVENT SESSION
what_queries_are_failing
ON SERVER
ADD EVENT sqlserver.error_reported
(
ACTION (sqlserver.sql_text, sqlserver.tsql_stack, sqlserver.database_id, sqlserver.username)
WHERE ([severity]> 10)
)
ADD TARGET package0.asynchronous_file_target
(set filename = 'D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing.xel' ,
metadatafile = 'D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing.xem',
max_file_size = 512,
increment = 16,
max_rollover_files = 5)
WITH (MAX_DISPATCH_LATENCY = 5SECONDS);
END
--------------------------------------------------------------------------------
-- Turn on the extended event
--------------------------------------------------------------------------------
IF NOT EXISTS
(
-- When a XE is active, then there is an entry
-- in sys.dm_xe_sessions
SELECT
*
FROM
sys.dm_xe_sessions AS DXS
INNER JOIN
sys.server_event_sessions AS SES
ON SES.name = DXS.name
WHERE
SES.name = N'what_queries_are_failing'
)
BEGIN
-- Start the session
ALTER EVENT SESSION what_queries_are_failing
ON SERVER STATE = START;
END
END
因此,现在我的SSIS包将是一个包含两条语句的单执行SQL任务
EXECUTE dbo.ExtendedEventCaptureStop;
EXECUTE dbo.ExtendedEventCaptureStart;
TSQL通过sys.fn_xe_file_target_read_file处理文件的读取,因此我认为您正在查看一个数据流任务。其中的源将是一个OLEDB源组件,上面的查询将作为您的起点 这将把这N列添加到数据流中,然后您可以将它们放在任何地方。如果都在同一台服务器上,我会跳过数据流,改用执行SQL任务 这是我XE监控的一部分,也许对你有用
CREATE PROCEDURE dbo.ExtendedEventCaptureStop
AS
BEGIN
SET NOCOUNT ON;
--------------------------------------------------------------------------------
-- Turn off our extended event
--------------------------------------------------------------------------------
IF EXISTS
(
-- When a XE is active, then there is an entry
-- in sys.dm_xe_sessions
SELECT
*
FROM
sys.dm_xe_sessions AS DXS
INNER JOIN
sys.server_event_sessions AS SES
ON SES.name = DXS.name
WHERE
SES.name = N'what_queries_are_failing'
)
BEGIN
-- Start the session
ALTER EVENT SESSION what_queries_are_failing
ON SERVER STATE = STOP;
END
--------------------------------------------------------------------------------
-- Extract data from our XE
--------------------------------------------------------------------------------
;
WITH events_cte AS
(
SELECT
DATEADD(mi,
DATEDIFF(mi, GETUTCDATE(), CURRENT_TIMESTAMP),
xevents.event_data.value('(event/@timestamp)[1]', 'datetime2')) AS [err_timestamp],
xevents.event_data.value('(event/data[@name="severity"]/value)[1]', 'bigint') AS [err_severity],
xevents.event_data.value('(event/data[@name="error_number"]/value)[1]', 'bigint') AS [err_number],
xevents.event_data.value('(event/data[@name="message"]/value)[1]', 'nvarchar(512)') AS [err_message],
xevents.event_data.value('(event/action[@name="database_id"]/value)[1]', 'int') AS [database_id],
xevents.event_data.value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS [sql_text],
xevents.event_data,
xevents.event_data.value('(event/action[@name="username"]/value)[1]', 'nvarchar(512)') AS [username],
'what_queries_are_failing' AS session_name
FROM sys.fn_xe_file_target_read_file
(
'D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing*.xel'
, 'D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing*.xem'
, NULL
, NULL) AS fxe
CROSS APPLY (SELECT CAST(event_data as XML) AS event_data) AS xevents
)
INSERT INTO
dbo.ExtendedEventErrorCapture
(
err_timestamp
, err_severity
, err_number
, err_message
, database_id
, sql_text
, event_data
, session_name
, username
)
SELECT
E.err_timestamp
, E.err_severity
, E.err_number
, E.err_message
, E.database_id
, E.sql_text
, E.event_data
, E.session_name
, E.username
FROM
events_cte AS E;
--------------------------------------------------------------------------------
-- Get rid our extended event files only if the XE is turned off
-- or no longer exists
--------------------------------------------------------------------------------
IF NOT EXISTS
(
SELECT
1
FROM
sys.dm_xe_sessions AS DXS
INNER JOIN
sys.server_event_sessions AS SES
ON SES.name = DXS.name
WHERE
SES.name = N'what_queries_are_failing'
UNION ALL
SELECT
1
FROM
sys.server_event_sessions AS SES
WHERE
SES.name = N'what_queries_are_failing'
)
BEGIN
-- Assumes you've turned on xp_cmdshell
EXECUTE sys.xp_cmdshell'del D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing*.xe*';
END
END
GO
更改文件位置和会话名称后,会停止XE,因此我们不必担心文件被锁定。我将数据从XE解析到我的表中,然后删除文件夹中的所有XE文件
哦,但是现在我的XE会话停止了,我应该重新启动它。这就是程序
CREATE PROCEDURE dbo.ExtendedEventCaptureStart
AS
BEGIN
SET NOCOUNT ON;
--------------------------------------------------------------------------------
-- Create the table to store out the XE data
--------------------------------------------------------------------------------
IF NOT EXISTS
(
SELECT
*
FROM
sys.schemas AS S
INNER JOIN
sys.tables AS T
ON T.schema_id = S.schema_id
WHERE
T.name = 'ExtendedEventErrorCapture'
AND S.name = 'dbo'
)
BEGIN
CREATE TABLE
dbo.ExtendedEventErrorCapture
(
err_timestamp datetime2(7) NULL
, err_severity bigint NULL
, err_number bigint NULL
, err_message nvarchar(512) NULL
, database_id int NULL
, sql_text nvarchar(MAX) NULL
, event_data xml NULL
, session_name sysname
, username nvarchar(512)
)
-- This is only vaild for a Develper/Enterprise edition license
WITH (DATA_COMPRESSION = PAGE);
END
--------------------------------------------------------------------------------
-- Create the extended event to keep track of bad sql queries
--------------------------------------------------------------------------------
IF NOT EXISTS
(
SELECT
*
FROM
sys.server_event_sessions AS SES
WHERE
SES.name = N'what_queries_are_failing'
)
BEGIN
--Create an extended event session
CREATE EVENT SESSION
what_queries_are_failing
ON SERVER
ADD EVENT sqlserver.error_reported
(
ACTION (sqlserver.sql_text, sqlserver.tsql_stack, sqlserver.database_id, sqlserver.username)
WHERE ([severity]> 10)
)
ADD TARGET package0.asynchronous_file_target
(set filename = 'D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing.xel' ,
metadatafile = 'D:\mssql\MSSQL13.MSSQLSERVER\mssql\extendedevents\what_queries_are_failing.xem',
max_file_size = 512,
increment = 16,
max_rollover_files = 5)
WITH (MAX_DISPATCH_LATENCY = 5SECONDS);
END
--------------------------------------------------------------------------------
-- Turn on the extended event
--------------------------------------------------------------------------------
IF NOT EXISTS
(
-- When a XE is active, then there is an entry
-- in sys.dm_xe_sessions
SELECT
*
FROM
sys.dm_xe_sessions AS DXS
INNER JOIN
sys.server_event_sessions AS SES
ON SES.name = DXS.name
WHERE
SES.name = N'what_queries_are_failing'
)
BEGIN
-- Start the session
ALTER EVENT SESSION what_queries_are_failing
ON SERVER STATE = START;
END
END
因此,现在我的SSIS包将是一个包含两条语句的单执行SQL任务
EXECUTE dbo.ExtendedEventCaptureStop;
EXECUTE dbo.ExtendedEventCaptureStart;
回答得很好,+1来自我这边!我有一个持续的ExtendedEvents会话正在进行,它是使用xmla脚本创建的,不是我自己创建的。我计划使用Merge语句来处理插入,但是我没有唯一的键。你知道我可以组合哪些列来创建一个唯一的键吗?@ShoaibMaroof听起来是该网站的一个很好的问题。您应该提出一个新问题,并提供有关XE跟踪的详细信息。我猜在不知道你的具体问题的情况下,StartTime和ConnectionID是唯一的伟大答案,+1来自我这边!我有一个持续的ExtendedEvents会话正在进行,它是使用xmla脚本创建的,不是我自己创建的。我计划使用Merge语句来处理插入,但是我没有唯一的键。你知道我可以组合哪些列来创建一个唯一的键吗?@ShoaibMaroof听起来是该网站的一个很好的问题。您应该提出一个新问题,并提供有关XE跟踪的详细信息。在不了解您的具体问题的情况下,我猜想StartTime和ConnectionID是独一无二的