首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展事件不再继续

扩展事件不再继续
EN

Database Administration用户
提问于 2017-08-23 13:32:23
回答 1查看 140关注 0票数 2

我创建了一个扩展事件来调试web应用程序中一个非常罕见的问题。有时表单中的数据并不是存储过程,所以我想验证一下,当SP被调用时,它实际上缺少丢失的数据。我使用“扩展事件”来查看传递的参数。

我今天进去查看日志,发现事件没有捕获数据,而且会话实际上是在SSMS中停止的。

我怎样才能确保它本身不关闭呢?我已将其设置为在服务器启动时启动。以下是本次活动的内容:

代码语言:javascript
复制
CREATE EVENT SESSION [DB_Name SP execution] ON SERVER 

ADD EVENT sqlserver.rpc_starting
(
    ACTION
    (
        sqlserver.database_id,sqlserver.database_name,
        sqlserver.server_instance_name,
        sqlserver.session_id
    )
    WHERE 
    (
        [package0].[greater_than_uint64]([sqlserver].[database_id],(4)) 
            AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) 
            AND [sqlserver].[database_id]=(34))
),

ADD EVENT sqlserver.sp_statement_starting
(
    SET collect_statement=(1)
    ACTION
    (
        sqlserver.database_id,sqlserver.database_name,
        sqlserver.server_instance_name,
        sqlserver.session_id
    )
    WHERE 
    (
        [package0].[greater_than_uint64]([sqlserver].[database_id],(4)) 
            AND [package0].[equal_boolean]([sqlserver].[is_system],(0)) 
            AND [sqlserver].[database_id]=(34)
    )
),

ADD EVENT sqlserver.sql_batch_starting
(
    ACTION
    (
        sqlserver.database_id,sqlserver.database_name,
        sqlserver.server_instance_name,
        sqlserver.session_id
    )
    WHERE 
    (
        [package0].[greater_than_uint64]([sqlserver].[database_id],(4)) 
            AND [package0].[equal_boolean]([sqlserver].[is_system],(0))     
            AND [sqlserver].[database_id]=(34)
    )
)

ADD TARGET package0.event_file
(
    SET filename=N'D:\path\to\log.xel',
    max_file_size=(5120)
)
WITH 
(
    MAX_MEMORY=4096 KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY=30 SECONDS,
    MAX_EVENT_SIZE=0 KB,
    MEMORY_PARTITION_MODE=NONE,
    TRACK_CAUSALITY=ON,
    STARTUP_STATE=ON
)

GO

编辑--我在设置它时启动了它,它捕获了两天(8/9-8/11)的数据。直到今天才再次登入,发现它已经关闭,而且自8/11事件以来就没有数据了。它目前处于打开状态并捕获数据,但我不想手动检查它是否每天都在运行。

EN

回答 1

Database Administration用户

发布于 2017-08-23 14:47:12

由于ALTER EVENT SESSIONDROP EVENT SESSION都是具有服务器作用域的DDL语句,我建议设置一个Server触发器,以便在您的EE被停止/删除时捕获。

这会在执行DDL语句时生成一个简单的通知,但您可以随意修改它:

代码语言:javascript
复制
CREATE TRIGGER EE_Change_Notifications
ON ALL SERVER
FOR ALTER_EVENT_SESSION, DROP_EVENT_SESSION
AS
    DECLARE @msgBody NVARCHAR(MAX)

    SET @msgBody = N'Extended Event [' + EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(256)') + N']' + CHAR(13) + CHAR(10)
            + N'Event Type: [' + EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(256)') + N']' + CHAR(13) + CHAR(10)
            + N'Login: [' + EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(256)') + N']' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10)
            + N'Statment:' + CHAR(13) + CHAR(10) + EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')

    EXEC msdb..sp_send_dbmail
          @profile_name = 'DB Mail Profile Name'
        , @recipients = 'person@place.com'
        , @body = @msgBody
GO

如果这没有提供EE已停止的通知,则可能会遇到事件因任何原因而失败的情况。这时,检查错误日志,看看是否发生了什么,然后从那里挖掘。如果您可以缩小一个特定的错误代码,那么您可以再次配置SQL代理警报,以便在发生特定错误时向您发送电子邮件

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/184177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档