技术开发 频道

使用TMO监测和诊断SQL Server

  【IT168 技术文档】大家一定用过Profiler工具,我们可以用它来对SQL Server建立trace来监测某些感兴趣的事件,也可以replay抓到的trace来诊断是哪些SQL语句的执行造成你的SQL Server耗费了大量的CPU资源。但Profiler是个GUI程序,有没有办法通过程序来抓trace和重放trace呢?

  也许有些读者会想到用SQLCMD.exe执行sp_trace_create等存储过程来操作,但那毕竟还是有些麻烦,这里我们要介绍的Trace Management Object(TMO)则是.NET对象,你可以把它理解成trace/replay的API,你可以非常方便地在你的.NET程序中使用。请注意由于SQL Express版本不支持trace,因而TMO对象也无法在SQL Express版本上运行,即使是SQL Server 2008 Express with Advanced Services也不支持。

  在SQL Server 2005里TMO对象被实现在了Microsoft.SqlServer.ConnectionInfo.dll里,在SQL Server 2008里TMO对象则被移到了Microsoft.SqlServer.ConnectionInfoExtended.dll里,但仍然在Microsoft.SqlServer.Management.Trace命名空间里。下面我们将以SQL Server 2008为例。

  用VS2005新建一个Visual C#的Console Application工程,在Project菜单里点击Add Reference…增加对下表几个组件的引用:



  组件描述Microsoft.SqlServer.ConnectionInfo 需要SqlServerInfo类来建立对SQL的连接 Microsoft.SqlServer.ConnectionInfoExtended TMO对象在这个Assembly里 Micrososft.SqlServer.Management.Sdk.Sfc SQL Server 2008里很多组件是基于它建立,所以必须增加这个引用

  http://www.codeplex.com/上SQL Server 2008的Samples里有个Readme_Tracer的例子(http://www.codeplex.com/MSFTEngProdSamples/Release/ProjectReleases.aspx?ReleaseId=18651),这个例子使用Standard.tdf模板启动一个live trace,trace的内容将打印在Console窗口上,但把结果打印到Console窗口上非常乱,而且也没有太大的实用价值,大家有兴趣可以去参考一下。

  本文第一部分将介绍一个capture trace的示例,和Readme_Tracer有点类似,但我们会把trace结果输出到trace文件,第二部分将介绍一个replay trace的示例,这也是Profiler最常用的两个功能。

  Capture trace示例

  这个例子模仿你使用Profiler工具监测SQL Server操作的过程,程序启动一个trace,将抓到的trace event输出到文件中,等待60秒后退出。读者可以尝试将TraceFile类改为TraceTable类来输出到数据库表中。下面是详细的步骤和描述:

  1、TraceServer类代表连接到SQL Server Instance的一个trace,下面的代码演示了如何创建一个TraceServer对象。代码前两行使用Windows认证方式建立一个SqlConnectionInfo对象,你也可以通过提供用户名/密码的方式建立这个对象,InitializeAsReader函数的第二个参数是trace模板,这里使用的TSQL_Replay模板,你需要根据你的SQL Server安装目录进行修改。

SqlConnectionInfo connInfo = new SqlConnectionInfo(".");
connInfo.UseIntegratedSecurity
= true;
TraceServer traceServer
= new TraceServer();
traceServer.InitializeAsReader(connInfo, @"C:\Program Files\Microsoft SQL Server\
100\Tools\Profiler\Templates\Microsoft SQL Server\100\TSQL_Replay.tdf");

 

0
相关文章