Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 是否有SSIS连接器用于拾取.xel文件(扩展事件)?方法和校正_Xml_Ssis_Sql Server 2012_Extended Events_Ssis 2019 - Fatal编程技术网

Xml 是否有SSIS连接器用于拾取.xel文件(扩展事件)?方法和校正

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="

我目前正在进行一个项目,以分析使用扩展事件在一个多维数据集上使用维度/度量的情况。由于我们使用的是SQL Server 2012,因此扩展事件GUI不可用。我使用sys.fn_xe_file_target_read_file以XML格式返回文件,每行一个事件

然后,我将把XML中的关键元素解析到一个暂存表中

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是独一无二的