扩展事件在Denali CTP1里的新功能

我的同事林默2009年曾写了一篇关于SQL Server 2008里扩展事件(XEvent)介绍的博文,XEvent在SQL 2008里所有的操作必须用TSQL来实现,不是非常方便。在上个月刚刚发布的Denali CTP1里我们对XEvent提供了更多的支持,建立了一个Object Model,在其基础上提供了SQL Server Management Studio(SSMS)里的一个简单UI并同时对PowerShell提供了支持。

有了Object Model后,我们就可以用写.NET代码来创建XEvent Session,修改Session或者枚举数据库里的所有Session。我们可以在Visual Studio里新建一个简单的.NET 3.5 Console Application,并增加对Microsoft.SqlServer.ConnectionInfo,Microsoft.SqlServer.Management.Sdk.Sfc以及Microsoft.SqlServer.XEvent的引用。如果你在Add Reference对话框的.NET标签找不到这些Assembly的话,你可以通过Browse标签到C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies目录下添加这些Assembly。在Program.cs里先增加下面几个using:

 using System.Data.SqlClient;
using Microsoft.SqlServer.Management.XEvent;
using Microsoft.SqlServer.Management.Sdk.Sfc;

然后在Main函数里输入下面的代码(你可能需要改变Connection String):

 using (SqlConnection conn = new SqlConnection("Data Source=.;Integrated Security=True"))
{
    conn.Open();
    XEStore store = new XEStore(new SqlStoreConnection(conn));
    Session session = store.CreateSession("blogtest");
    Event evt = session.AddEvent("sqlserver.sql_statement_starting");
    evt.AddAction("sqlserver.database_name");
    session.AddEvent("sqlserver.sql_statement_completed");
    Target target = session.AddTarget(store.RingBufferTargetInfo);
    session.MaxDispatchLatency = 5; //change dispatch latency to 5sec (default 30sec)
    session.Create();
    session.Start();
}

编译然后运行该程序,一个叫blogtest的XEvent Session就被创建并启动起来。我们可以用SSMS来查看这个session,连接到你Connection String里的数据库服务器,在Object Explorer里展开Management节点,Extended Events是我们新加的一个节点,展开两级后可以看到我们刚刚创建的blogtest,如图1所示。

图1    新加的Extended Events节点

右键点击blogtest节点,在菜单(如图2所示)里你可以启动/停止、导入/导出、删除或者Script选中的Session。导入/导出是针对模板,你可以选择任何一个Session导出为模板分享给别人使用,而Script则生成所选Session的创建/删除SQL语句,可以生成到新窗口、文件、剪贴板或者Agent Job。有了导入/导出和Script之后你就可以在模板和SQL语句之间随意转换。

图2    Session节点上的右键菜单

图2菜单里有个Start PowerShell菜单项,这就是我们前面提到的我们对PowerShell支持。点击它将打开一个PowerShell窗口并进入在Session所在的目录。你在PowerShell里同样可以创建/修改或枚举XEvent Session,如图3所示。你也可以尝试将下面的script保存成C:\blog.ps1,然后在PowerShell窗口里输入C:\blog.ps1来执行它(如果执行.ps1文件出现权限的问题可以输入help set-executionpolicy查看帮助)。

 cd \XEvent
$h = hostname
cd $h
$store = dir | where {$_.DisplayName -ieq 'default'}
$session = new-object Microsoft.SqlServer.Management.XEvent.Session
   -argumentlist $store, "blogtest2"
$session.AddEvent("sqlserver.sql_statement_completed")
$session.Create()

图3    在PowerShell里创建XEvent Session

Denali CTP1里SSMS操作XEvent Session的UI还很简单,在此后的CTP里我们会继续增加其他功能,请继续关心我们的blog。

参考文献

软件开发工程师 徐进