设为首页 收藏本站
查看: 411|回复: 0

[经验分享] 简要介绍SQL Server 2008新的事件处理系统—SQL Server Extended Events

[复制链接]

尚未签到

发表于 2016-11-1 10:21:30 | 显示全部楼层 |阅读模式
  SQL Server Extended Events(下面简称XEvent)是SQL Server 2008里新加的事件处理系统,用来取代SQL Server原先的SQL Trace的跟踪机制。事件处理系统对一个复杂服务器系统的排错,调试是极为关键的。和SQL Server原来的事件处理系统相比较,XEvent具有下列的优势:

  • 消耗更少的系统资源,更适用于在产品服务器上的排错和调试。并且每收集一个系统事件所消耗的资源都是可预测的。
  • 不仅仅能收集事件数据,还能收集在这事件触发点的系统动态运行信息,例如内存,T-SQL Stack等等。
  • 可配置性,能够根据系统负载的需求配置所需收集的事件信息。
  下面是一个简单的例子介绍如何使用XEvent来做系统排错工作。
  当前台应用性能下降的时候,数据库管理员经常需要确定是否有资源锁的申请冲突,既所谓我们说的blocking。在SQL Server 2008里面,你可以查询系统视图sys.dm_exec_requests,并且能发现有一些进程正在等待资源锁,比如像下面这个结果:
http://blogs.msdn.com/photos/sqlcrd/images/9573521/original.aspx
  我们可以看到有个Session 54的状态是Suspended,意味着一个查询的操作被blocked, 但是我们看不到是哪一个Query占用了资源,以及查询计划和T-SQL Stack等等,如果我有下面的XEvent Session我们就能够解决这个问题。(在下面的例子中我们假设XEvent Session在Block发生之前已经启动好了)
  1、在查询编辑器执行下面的命令,这会创建一个XEvent Session来捕捉lock_acquired和lock_released,同时我们还会抓下sql_text,tsql_stack和plan_handle等信息。
-- Perform cleanup.
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='FindBlockers')
DROP EVENT SESSION FindBlockers ON SERVER
GO
-- 我们这边假设是数据库”DAA”里出了block,所以我们会使用一个predicate去过滤掉其他数据库的Block问题
--
DECLARE @dbid int

SELECT @dbid = db_id('DAA')

IF @dbid IS NULL
BEGIN
RAISERROR('DAA is not installed. Install DAA before proceeding', 17, 1)
RETURN
END

DECLARE @sql nvarchar(1024)
SET @sql = '
CREATE EVENT SESSION FindBlockers ON SERVER
--这里我们加了lock_acquired的Event,并要求返回sql_text,database_id,tsql_stack, --plan_handle和session_id的信息
--
ADD EVENT sqlserver.lock_acquired
(action
( sqlserver.sql_text, sqlserver.database_id, sqlserver.tsql_stack,
sqlserver.plan_handle, sqlserver.session_id)
WHERE ( database_id=' + cast(@dbid as nvarchar) + ' AND resource_0!=0)
),
ADD EVENT sqlserver.lock_released
(WHERE ( database_id=' + cast(@dbid as nvarchar) + ' AND resource_0!=0 ))
ADD TARGET package0.pair_matching
( SET begin_event=''sqlserver.lock_acquired'',
begin_matching_columns=''database_id, resource_0, resource_1, resource_2, transaction_id, mode'',
end_event=''sqlserver.lock_released'',
end_matching_columns=''database_id, resource_0, resource_1, resource_2, transaction_id, mode'',
respond_to_memory_pressure=1)
WITH (max_dispatch_latency = 1 seconds)'

EXEC (@sql)
--
-- Create the metadata for the event session
-- Start the event session
--
ALTER EVENT SESSION FindBlockers ON SERVER
STATE = START
  2、一旦XEVENT然后我们可以执行下面的语句去找到那些block了别人的查询语句:
--
-- The pair matching targets report current unpaired events using
-- the sys.dm_xe_session_targets dynamic management view (DMV)
-- in XML format.
-- The following query retrieves the data from the DMV and stores
-- key data in a temporary table to speed subsequent access and
-- retrieval.
--
SELECT
objlocks.value('(action/value)[5]', 'int')
AS session_id,
objlocks.value('(data/value)[5]', 'int')
AS database_id,
objlocks.value('(data/text)[1]', 'nvarchar(50)' )
AS resource_type,
objlocks.value('(data/value)[9]', 'bigint')
AS resource_0,
objlocks.value('(data/value)[10]', 'bigint')
AS resource_1,
objlocks.value('(data/value)[11]', 'bigint')
AS resource_2,
objlocks.value('(data/text)[2]', 'nvarchar(50)')
AS mode,
objlocks.value('(action/value)[1]', 'varchar(MAX)')
AS sql_text,
CAST(objlocks.value('(action/value)[4]', 'varchar(MAX)') AS xml)
AS plan_handle,
CAST(objlocks.value('(action/value)[3]', 'varchar(MAX)') AS xml)
AS tsql_stack
INTO #unmatched_locks
FROM (
SELECT CAST(xest.target_data as xml)
lockinfo
FROM sys.dm_xe_session_targets xest
JOIN sys.dm_xe_sessions xes ON xes.address = xest.event_session_address
WHERE xest.target_name = 'pair_matching' AND xes.name = 'FindBlockers'
) heldlocks
CROSS APPLY lockinfo.nodes('//event[@name="lock_acquired"]') AS T(objlocks)
--
-- Join the data acquired from the pairing target with other
-- DMVs to return provide additional information about blockers
--
SELECT ul.*
FROM #unmatched_locks ul
INNER JOIN sys.dm_tran_locks tl ON ul.database_id = tl.resource_database_id AND ul.resource_type = tl.resource_type
WHERE resource_0 IS NOT NULL
AND session_id IN
(SELECT blocking_session_id FROM sys.dm_exec_requests WHERE blocking_session_id != 0)
AND tl.request_status='wait'
  上面的语句返回下面的结果,我们可以看到是一个Session 53的Update更新语句Block了Session 54的查询:
http://blogs.msdn.com/photos/sqlcrd/images/9573522/original.aspx
  有下面sql_text里可以看到,整个更新语句begin tran Update BlockTest set Col1 = 'Updated' where ID = 1中,由于少了一个Commit tran,所以block了其他查询对表BlockTest的操作
http://blogs.msdn.com/photos/sqlcrd/images/9573523/original.aspx
  XEvent还有很多强大的功能和更广应用,有机会的话以后再为大家介绍。
  项目经理 林默

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-294187-1-1.html 上篇帖子: SQL Server 2008 的 Transact-SQL 语言增强 下篇帖子: 书评 -- Professional SQL Server 2005 Reporting Services
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表