SQL Server 2008 R2 SSMS查询窗口执行查询监控方案咨询
监控SQL Server 2008 R2中SSMS查询窗口执行的所有查询方案
作为技术经理,我太懂你需要监控SSMS查询窗口所有执行查询的需求了——不管是排查性能瓶颈、做合规审计,还是追踪团队成员的操作行为,这都是日常运维里很常见的场景。针对你用的SQL Server 2008 R2,我整理了内置的日志选项和靠谱的开源工具建议,供你参考:
一、内置监控/日志方案
- SQL Server Profiler:这是2008R2里最上手的内置工具,专门用来跟踪数据库引擎的各种活动。配置的时候,你得重点勾选这几个事件:
SQL:BatchStarting和SQL:BatchCompleted:捕获SSMS查询窗口里执行的批量SQL语句RPC:Starting和RPC:Completed:如果有调用存储过程的情况,这两个事件能完整捕获到
另外一定要在「列筛选器」里把ApplicationName设为"Microsoft SQL Server Management Studio - Query",这样就能只盯SSMS查询窗口的操作,不会被其他应用的请求干扰。不过要提一句,Profiler对服务器性能有一定影响,临时排查用它没问题,长期运行的话还是换更轻量的方案。
- Extended Events:这是SQL Server里性能开销更小的监控方案,2008R2已经支持(虽然功能比后续版本精简,但足够满足需求)。你可以创建一个自定义会话,捕获
sql_statement_starting或sql_statement_completed事件,同样筛选application_name为SSMS查询窗口的标识。它的资源占用比Profiler低很多,适合长期监控。这里给个简单的创建会话示例:
CREATE EVENT SESSION [SSMS_Query_Trace] ON SERVER ADD EVENT sqlserver.sql_statement_starting( ACTION(sqlserver.sql_text, sqlserver.username, sqlserver.application_name) WHERE (sqlserver.application_name = N'Microsoft SQL Server Management Studio - Query') ) ADD TARGET package0.event_file(SET filename=N'SSMS_Queries.xel') 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)
创建后手动启动会话,后续可以通过sys.fn_xe_file_target_read_file函数读取和分析日志文件。
- Server-Side Trace:这是用T-SQL脚本创建的后台跟踪,比Profiler更稳定,性能开销也更小。你可以自定义跟踪的事件、列和输出文件,适合长期运行的监控需求。比如下面的脚本可以创建一个专门跟踪SSMS查询的任务:
DECLARE @TraceID INT EXEC sp_trace_create @TraceID OUTPUT, 0, N'C:\SSMS_Queries_Trace' -- 添加事件:SQL批处理完成 EXEC sp_trace_setevent @TraceID, 12, 1, @on=1 -- TextData EXEC sp_trace_setevent @TraceID, 12, 10, @on=1 -- ApplicationName EXEC sp_trace_setevent @TraceID, 12, 11, @on=1 -- LoginName EXEC sp_trace_setevent @TraceID, 12, 13, @on=1 -- Duration EXEC sp_trace_setevent @TraceID, 12, 14, @on=1 -- StartTime EXEC sp_trace_setevent @TraceID, 12, 15, @on=1 -- EndTime -- 添加筛选:只跟踪SSMS查询窗口 EXEC sp_trace_setfilter @TraceID, 10, 0, 6, N'Microsoft SQL Server Management Studio - Query' -- 启动跟踪 EXEC sp_trace_setstatus @TraceID, 1
后续可以用fn_trace_gettable函数读取跟踪文件,也可以直接用SQL Server Profiler打开文件查看内容。
二、开源/免费工具推荐
- sp_WhoIsActive:这是Adam Machanic开发的免费开源存储过程,虽然它主打实时监控当前正在执行的查询,但你可以结合SQL Agent定时任务,定期捕获SSMS的查询活动并保存到日志表中。它的优点是轻量、易用,能获取到查询文本、执行计划、资源消耗等详细信息,社区支持也非常好。
- XEViewer:这是一个开源的Extended Events日志查看工具,专门用来解析和展示XE生成的.xel文件。对于2008R2里的XE会话,用它分析日志会比手动写SQL查询更直观,支持过滤、排序和导出数据,适合不熟悉XE查询语法的用户。
- OpenProfiler:这是一个开源的SQL Server跟踪工具,作为SQL Server Profiler的替代方案,它支持捕获和分析SQL Server的各类跟踪事件,界面和Profiler类似,但性能开销更低,完全开源免费,适合需要长期监控又不想用内置Profiler的场景。
注意事项
不管用哪种方案,都要注意:监控会产生一定的性能开销,要根据服务器负载调整监控的事件数量和频率;确保存储日志的磁盘有足够空间,定期清理旧日志;另外操作时需要具备ALTER ANY EVENT SESSION或ALTER TRACE等对应的权限。
内容的提问来源于stack exchange,提问作者user9961




