1

我正在开发一个 C# 应用程序,它使用各种 sp_trace 过程来查看来自远程 SQL Server 数据库的事件。我最感兴趣的特定事件是查询和存储过程何时开始和结束。我需要每个事件的数据,例如时间、SQL 文本、主机名等。

MSFT 的文档说 sp_trace 功能已被弃用,并被扩展事件取代。我还发现了几篇文章,指出扩展事件在数据库上产生的开销要少得多。但是,我很难找到使用扩展事件来复制跟踪功能的教程或示例。

因此,我的问题是,我需要从 C# 应用程序执行哪些存储过程序列才能有效地跟踪数据库?

4

1 回答 1

0

扩展事件跟踪不是使用存储过程,而是使用 DDL 创建的。下面的示例显示了具有环形缓冲区和跟踪文件目标的跟踪,以及从“sys.fn_xe_file_target_read_file”TVF 中选择以返回 XE 跟踪数据。

如果您不需要持久性并且只想将最近的事件保留在内存中,则环形缓冲区目标很有用。文件目标允许您指定最大文件大小和翻转文件的数量。如果您捕获许多事件,我建议使用文件目标。

您可以使用 SSMS 对象资源管理器创建跟踪,然后为您的应用程序需要生成脚本。

CREATE EVENT SESSION [batch_and_rpc] ON SERVER 
ADD EVENT sqlserver.rpc_starting(
    WHERE ([sqlserver].[client_hostname]=N'ServerName')),
ADD EVENT sqlserver.rpc_completed(
    WHERE ([sqlserver].[client_hostname]=N'ServerName')),
ADD EVENT sqlserver.sql_batch_starting(
    WHERE ([sqlserver].[client_hostname]=N'ServerName')),
ADD EVENT sqlserver.sql_batch_completed(
    WHERE ([sqlserver].[client_hostname]=N'ServerName'))
ADD TARGET package0.event_file(SET filename=N'C:\TraceFiles\batch_and_rpc.xel'),
ADD TARGET package0.ring_buffer
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=OFF,STARTUP_STATE=OFF)
GO

ALTER EVENT SESSION [batch_and_rpc] ON SERVER STATE = START;
GO

SELECT * 
FROM sys.fn_xe_file_target_read_file('C:\TraceFiles\batch_and_rpc*.xel', null, null, null);
GO

要删除 XE 会话:

DROP EVENT SESSION [batch_and_rpc] ON SERVER; 

您还可以使用 Microsoft.SqlServer.XEvent 命名空间中的对象来读取 XE 数据。但是请注意,该方法没有得到很好的记录。请参阅http://blogs.msdn.com/b/extended_events/archive/2011/07/20/introducing-the-extended-events-reader.aspx

于 2014-12-06T18:23:10.437 回答