在SQLSERVER2012之前,擴(kuò)展事件的所有操作只能用TSQL或C#代碼來實(shí)現(xiàn)
現(xiàn)在SQLSERVER2012就方便多了,有了新的GUI,趨向于傻瓜了,對(duì)我來講是好事o(∩_∩)o 哈哈
趁機(jī)學(xué)習(xí)一下擴(kuò)展事件
簡單介紹
首先打開SQLSERVER2012的SSMS,依次點(diǎn)擊打開管理-》擴(kuò)展事件-》會(huì)話
在會(huì)話文件夾中,點(diǎn)擊右鍵-》可以新建會(huì)話/新建會(huì)話向?qū)?
在已有的會(huì)話中,點(diǎn)擊右鍵-》啟動(dòng)會(huì)話、新建會(huì)話、導(dǎo)出會(huì)話、刪除、屬性
這些菜單已經(jīng)很豐富了
點(diǎn)擊-》新建會(huì)話向?qū)?,SQLSERVER會(huì)一步一步引導(dǎo)您怎麼新建一個(gè)會(huì)話
包括設(shè)置會(huì)話熟悉感、選擇模板、選擇要捕獲的事件、選擇要捕獲的全局字段、設(shè)置事件會(huì)話篩選器、指定會(huì)話數(shù)據(jù)存儲(chǔ)
這個(gè)向?qū)揖筒唤榻B了,我們一般都不喜歡用傻瓜的向?qū),生怕漏了什么東西沒有設(shè)置
其實(shí)大家看到向?qū)е幸O(shè)置的步驟:選擇模板、設(shè)置事件會(huì)話篩選器、選擇要捕獲的全局字段,有沒有覺得和SQLSERVER PROFILER差不多的感覺
建立會(huì)話
我們新建一個(gè)會(huì)話
彈出 新建會(huì)話 對(duì)話框
左邊有常規(guī)、事件、數(shù)據(jù)存儲(chǔ)、高級(jí)這些tab頁
等一下會(huì)陸續(xù)介紹
常規(guī)頁面
輸入會(huì)話名稱
在sql profiler里面就是輸入跟蹤名稱
下面有一些選項(xiàng),例如在服務(wù)器啟動(dòng)時(shí)啟動(dòng)事件會(huì)話,你可以根據(jù)自己實(shí)際情況進(jìn)行勾選
大家知道開啟sql profiler會(huì)對(duì)SQLSERVER的性能造成影響
那么,從下面的“在服務(wù)器啟動(dòng)時(shí)啟動(dòng)事件會(huì)話”
這里告訴我們兩個(gè)信息
信息一:自動(dòng)化程度高了,以往我們都是重啟服務(wù)器就需要自己手動(dòng)打開sql profiler來重新跟蹤SQLSERVER的事件,現(xiàn)在有這個(gè)選項(xiàng)就方便多了
不用手動(dòng)打開擴(kuò)展事件
信息二:擴(kuò)展事件對(duì)SQLSERVER的性能損耗不大
在園子里的燕洋天大俠的文章大話擴(kuò)展事件第一篇:概述(上)里提到:
擴(kuò)展事件的出現(xiàn)與設(shè)計(jì)主要是以性能為主要的出發(fā)點(diǎn)
我們可以使用一個(gè)文件目標(biāo)對(duì)象在相關(guān)的時(shí)間發(fā)生之后將信息寫入到文件中,這樣就非常的輕量級(jí)了,并且可以精確到事件發(fā)生點(diǎn)
我們?cè)跁?huì)話名稱里輸入“blogtest”
會(huì)話中也提供了很多模板給我們使用
就像sql profiler里面
在文章擴(kuò)展事件在Denali CTP3里的新UI(一)中也說了
我們支持與Profiler里模板類似的概念,只要選擇一個(gè)模板,Event(包括Action和Predicate)和Target以及某些選項(xiàng)就自動(dòng)選擇好了
但是在CTP3里只有一個(gè)Standard模板,這個(gè)模板所選擇的事件和Profiler里的Standard模板相對(duì)應(yīng)
你也可以把自己創(chuàng)建的Session作為模板保存起來以備后用,保存模板只需要右鍵點(diǎn)擊某個(gè)Session然后選擇Export Session…即可
因?yàn)槟瞧恼鲁鰜淼臅r(shí)候SQLSERVER2012也只是CTP3的階段,所以那時(shí)候只有一個(gè)標(biāo)準(zhǔn)模板,現(xiàn)在SQLSERVER2012出來了
已經(jīng)多了很多模板了
導(dǎo)出會(huì)話就相當(dāng)于導(dǎo)出模板了
sql profiler里導(dǎo)出模板
導(dǎo)入會(huì)話模板
在新建會(huì)話對(duì)話框里選擇模板的下拉列表有一個(gè) <從文件...>
事件頁面
事件頁面是最復(fù)雜的,你首先看到它分為左右兩部分,左邊是事件庫,所有在SQL Server里注冊(cè)的擴(kuò)展事件都列在這里,右邊是你選擇的事件。
在選擇事件的時(shí)候,你可以點(diǎn)擊名稱列表頭,進(jìn)行事件名稱的首字母進(jìn)行順序或者倒序排序,
類別和通道也是可以排序的
事件的類別非常多,包括cdc功能的事務(wù)日志掃描、死鎖監(jiān)視、高度可用性和數(shù)據(jù)的安全性(High Availability and Disaster Recovery,HADR)、垃圾回收等等
事件過濾,比如我在在事件庫的輸入框里輸入sql_,所有名字含有sql_字樣的事件都被列了出來并且高亮顯示
過濾也可以按照事件名稱和說明、僅事件字段、全部來進(jìn)行過濾
類別和通道的類似于EXCEL的列篩選
我們選擇sql_statement_starting和sql_statement_completed事件
點(diǎn)擊所選事件頁面右上方的配置按鈕,頁面將會(huì)滑動(dòng)
配置事件頁面
你可以點(diǎn)擊“選擇”返回剛才的事件庫頁面
你會(huì)看到閃電和漏斗圖標(biāo)分別出現(xiàn)在了右邊配置頁面的全局字段(操作)標(biāo)簽和篩選器(謂詞)標(biāo)簽上
閃電代表的是該事件上有多少Global Fields(Actions)關(guān)聯(lián)
漏斗代表該事件有沒有Filter(Predicate)關(guān)聯(lián)
SQLSERVER Profiler里每個(gè)事件都含有EventSequence列,而在XEvent里則被作為Action來實(shí)現(xiàn)了。
Predicate可以減少不必要的事件收集,比如我可以配置sql_statement_starting事件的Predicate為database_name=’Northwind’,
那么發(fā)生在其他數(shù)據(jù)庫的sql_statement_starting事件就不會(huì)被該Session所收集,Profiler可以為所有事件設(shè)置一個(gè)Column Filter,
而XEvent支持為每個(gè)Event設(shè)置各自獨(dú)立不同的Predicate
事件字段(Event Fields)標(biāo)簽列出所有該Event的列,某些Event會(huì)把一些開銷比較大的列作為可選的列,你可以點(diǎn)擊前面的CheckBox選擇是否收集該列數(shù)據(jù),
比如sql_statement_starting的statement列就可以被取消選擇。
你可以同時(shí)選擇多個(gè)事件并選擇/取消全局字段(操作)或配置篩選器(謂詞)
在這里我們?yōu)閟ql_statement_starting和sql_statement_completed事件,在全局字段(操作)里選擇database_name
不添加謂詞并保持事件字段為默認(rèn)值。
完成之后在閃電和漏斗列會(huì)顯示相應(yīng)的動(dòng)作和謂詞的數(shù)量
如果配置謂詞錯(cuò)誤,在漏斗列會(huì)顯示 打叉
我們刪除子句就可以了
配置完畢之后,會(huì)看到sql_statement_starting(事件)和sql_statement_completed(事件)后面的閃電圖標(biāo)列有一個(gè)動(dòng)作與之關(guān)聯(lián)
數(shù)據(jù)存儲(chǔ)頁面
在這個(gè)頁面里可以選擇為Session添加不同的目標(biāo)(Target)
這里我們選擇event_file 目標(biāo)并保持默認(rèn)配置
高級(jí)頁面
高級(jí)頁面可以設(shè)置控制會(huì)話行為的高級(jí)選項(xiàng),有一個(gè)選項(xiàng)需要特別注意,”最大調(diào)度滯后時(shí)間(Maximum dispatch latency)”
它描述了事件從被觸發(fā)到寫入到Target最長的等待時(shí)間,默認(rèn)值是30秒,如果你使用和SQLSERVER Profiler client-side tracing
類似的Live Monitoring功能,你可能會(huì)希望把它改小,這樣事件被觸發(fā)后可以盡快地顯示在SSMS里,
但需要注意到的是改小它會(huì)增加SQL Server的開銷,這里我們把它改成5秒
完成創(chuàng)建
點(diǎn)擊“確定”完成事件會(huì)話的創(chuàng)建
blogtest 會(huì)話將會(huì)被創(chuàng)建成功并顯示在Object Explorer里
在會(huì)話被創(chuàng)建后,你可以在Object Explorer里右鍵點(diǎn)擊該Session并選擇屬性,這將打開和創(chuàng)建會(huì)話相同的對(duì)話框,進(jìn)行修改后點(diǎn)擊確定即可。
如果你想查看怎麼用TSQL語句的方式能創(chuàng)建剛才blogtest事件會(huì)話,可以用編寫腳本的方式
1 CREATE EVENT SESSION [blogtest] ON SERVER 2 ADD EVENT sqlserver.sql_statement_completed(SET collect_statement=(1)3 ACTION(sqlserver.database_name)),4 ADD EVENT sqlserver.sql_statement_starting(5 ACTION(sqlserver.database_name)) 6 ADD TARGET package0.event_file(SET filename=N'D:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\Log\blogtest.xel')7 WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)8 GO
啟動(dòng)會(huì)話并監(jiān)視
啟動(dòng)會(huì)話
監(jiān)視實(shí)時(shí)數(shù)據(jù)
當(dāng)點(diǎn)擊“監(jiān)視實(shí)時(shí)數(shù)據(jù)”按鈕,就會(huì)新建一個(gè)窗口
運(yùn)行了一下,事件數(shù)量就不斷上升
我們停止會(huì)話
但是似乎SQLSERVER有些問題
我以為SQLSERVER會(huì)刪除了blogtest這個(gè)會(huì)話,然后我刷新了一下會(huì)話節(jié)點(diǎn),沒有刪除,似乎SQLSERVER在這個(gè)地方有些bug
又或者是我自己操作不正確
xel文件
我們看一下D:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\Log路徑下的情況
我剛才停止了會(huì)話,又重新啟動(dòng)了會(huì)話,所以會(huì)產(chǎn)生兩個(gè)blogtest xel文件
這里要注意一下,剛才我們?cè)?nbsp;數(shù)據(jù)存儲(chǔ) 頁面,默認(rèn)的設(shè)置值是:勾選了啟用文件滾動(dòng)更新,并且在最大文件數(shù)里設(shè)置為5
這里跟SQL ERROR LOG是一樣的,當(dāng)blogtest這個(gè)會(huì)話產(chǎn)生的xel文件的文件數(shù)達(dá)到5個(gè),就會(huì)刪除最早的那個(gè)xel文件
然后生成一個(gè)新的xel文件
SQL ERRORLOG也是一樣是滾動(dòng)更新的,這里就不再詳細(xì)敘述了~
system_health xel文件是安裝SQLSERVER的時(shí)候已經(jīng)創(chuàng)建好的
system_health 擴(kuò)展事件會(huì)話
此會(huì)話源自產(chǎn)品支持團(tuán)隊(duì)的想法,它可以跟蹤通常被用來對(duì)客戶系統(tǒng)進(jìn)行調(diào)試的信息
(例如當(dāng)客戶系統(tǒng)發(fā)生死鎖或出現(xiàn)其它嚴(yán)重錯(cuò)誤時(shí))
此會(huì)話的創(chuàng)建和啟動(dòng)是 SQL Server 2008 實(shí)例安裝過程的一部分
它在環(huán)緩沖區(qū)中跟蹤事件,因此不會(huì)消耗太多內(nèi)存.
SQL Server 2008使用擴(kuò)展事件進(jìn)行高級(jí)故障排除
我們用editplus打開,發(fā)現(xiàn)都是二進(jìn)制的,我還以為是XML格式的
查看收集回來的xel文件
如果你想查看收集了一個(gè)晚上的xel文件,你可以直接把xel文件拖進(jìn)去SSMS就可以了
上面那個(gè)blogtest_0_130315881898000000.xel一共收集了474個(gè)事件
不過擴(kuò)展事件的文件名好像沒有什么規(guī)律,如果別人給你一個(gè)xel文件叫你分析一下例如下圖那個(gè),從文件名你只能知道是2013年16日收集的事件信息
我們看一下擴(kuò)展事件的結(jié)構(gòu)
大家點(diǎn)擊加號(hào),會(huì)看到事件會(huì)話下面會(huì)有一個(gè)包
我們右鍵點(diǎn)擊查看目標(biāo)數(shù)據(jù)
就會(huì)彈出一個(gè)新窗口
上面彈出的新窗口顯示了下面五個(gè)xel文件的所有事件,這樣就不用每個(gè)文件逐個(gè)逐個(gè)地拖到SSMS里面看了,更不用打開文件資源管理器
大家不相信的話,可以把這五個(gè)xel文件拖到SSMS,然后相加起來,看是不是跟包的事件數(shù)目是一樣的
總結(jié)
這一篇簡單介紹了 擴(kuò)展事件的創(chuàng)建和一些概念,下一篇會(huì)繼續(xù)講述如何用擴(kuò)展事件來顯示和分析數(shù)據(jù)
將試圖找到一個(gè)workload中平均開銷最大的query
個(gè)人感覺擴(kuò)展事件跟SQL profiler真的很相似
SQL profiler把跟蹤到的事件寫入到trc文件
而擴(kuò)展事件把事件信息寫入到xel文件
而監(jiān)控實(shí)時(shí)數(shù)據(jù)相當(dāng)于在SQL profiler里開啟跟蹤,只不過一個(gè)在SQL profiler軟件里查看跟蹤的事件,而另一個(gè)直接在SSMS里查看事件
我覺得擴(kuò)展事件就像把SQL profiler集成到SSMS里面一樣,當(dāng)然擴(kuò)展事件的機(jī)制跟SQL profiler是不一樣的