扩展事件在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。
参考文献
- Introducing SQL Server Extended Events
- What’s new for Extended Events in SQL Server code-named “Denali” CTP1
软件开发工程师 徐进