我正在开发一个C#应用程序,它使用各种sp_trace过程来查看来自远程SQL Server数据库的事件。我最感兴趣的特定事件是查询和存储过程的开始和结束。我需要每个事件的数据,如时间,SQL文本,主机名等。
MSFT的文档说,不推荐使用sp_trace功能,而是由扩展事件替换。我还发现了一些文章,指出扩展事件会对数据库产生更少的开销。但是,我很难找到使用扩展事件来复制跟踪功能的教程或示例。
因此,我的问题是,我需要从C#app执行哪些存储过程的顺序才能有效地跟踪数据库?
答案 0 :(得分: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。