您好,欢迎访问一九零五行业门户网

SQLServer扩展事件(ExtendedEvents)--使用扩展事件不同目标示

sql server 扩展事件(extended events )-- 使用扩展事件不同目标示例 下面的查询返回服务器的所有目标: selectp.nameaspackagename,o.nameastargetname,o.descriptionastargetdescriptionfromsys.dm_xe_objectsoinnerjoinsys.dm_xe_packagespono.package_
sql server扩展事件(extended events)-- 使用扩展事件不同目标示例
下面的查询返回服务器的所有目标:
select p.name as packagename,o.name as targetname,o.description as targetdescriptionfrom sys.dm_xe_objects oinner join sys.dm_xe_packages pon o.package_guid = p.guidwhere o.object_type = 'target'and (p.capabilities is null or p.capabilities 1)order by packagename, targetname;
每个目标都有一个可配置的参数列表,有些列是强制性的,有些是可选的。下面的查询返回了服务器的所有可用目标的参数。
select p.name as packagename,o.name as targetname,c.name as parametername,c.type_name as parametertype,case c.capabilities_descwhen 'mandatory' then 'yes'else 'no'end as [required]from sys.dm_xe_objects oinner join sys.dm_xe_packages pon o.package_guid = p.guidinner join sys.dm_xe_object_columns con o.name = c.object_namewhere o.object_type = 'target'and (p.capabilities is null or p.capabilities 1)order by packagename, targetname, [required] desc;
行动可以绑定在特定的事件或扩展事件。它们同步包含在触发事件的线程上,因此可能在有些情况下会对性能有影响。行动可以被用于:
l 聚合事件数据
l 追加额外数据到事件数据
l 捕获堆栈转储和观察数据
l 用变量存储状态信息在当前上下文
l 停止服务执行创建调试检查点
由于行动是同步执行的,它们应该在需要的时候才被用来捕获额外的信息。有些行动像package0.debug_break不应该被用在生产环境。下面的查询返回服务器上所有可用的行动。
select p.name as packagename,o.name as actionname,o.description as actiondescriptionfrom sys.dm_xe_objects oinner join sys.dm_xe_packages pon o.package_guid = p.guidwhere o.object_type = 'action'and (p.capabilities is null or p.capabilities & 1 = 0)order by packagename, actionname;
事件数据通过字节的集合串在一起。为了说明数据,类型提供了长度和字节分类集合用于扩展事件引擎。大多数列有容易识别的类型,如int32、unicode_string、float32、boolean等,在大多数编程语言中是相当常见的。但也有些sql server中特别的类型,如callstack、sos_context、database_context等。
下面的查询返回所有可用的类型。
select p.name as packagename,o.name as typename,o.description as typedescriptionfrom sys.dm_xe_objects oinner join sys.dm_xe_packages pon o.package_guid = p.guidwhere o.object_type = 'type'and (p.capabilities is null or p.capabilities & 1 = 0)order by packagename, typename;
在对象负载中的每个列都有一个相应的数据类型。当定义谓词的时候,这是很明显的。类型并不用于会话定义的一部分。
谓词用于在事件触发的时候动态过事件,决定哪些事件符合规则而被触发。这使得事件会话更有针对性的设置针对特定的问题,而不是收集所有的事件跟踪后期再过滤。对于特定的目标像ringbuffer,这非常重要,因为当内存满的时候,事件会开始被截断。
谓词是布尔类型的表达式,用于过滤全局状态数据和本地事件数据。本地会话数据被一个事件的负载或列定义在它的列架构中。全局状态数据被可用的对象或谓词源列定义,可从sys.dm_xe_objects视图的object_type等于pred_source查到。
select p.name as packagename,o.name as columnname,o.description as columndescriptionfrom sys.dm_xe_objects oinner join sys.dm_xe_packages pon o.package_guid = p.guidwhere o.object_type = 'pred_source'and (p.capabilities is null or p.capabilities & 1 = 0)order by packagename, columnname;
另外,有些谓词可以存储允许事件每n次计数时触发,或者第一次发生n次计数时触发。这可以用于基于样例事件捕获。可以用于帮助从频繁发生的事件中剔除触发很少的事件。
谓词通过数学计算的标准操作来实现。有些操作集合叫做比较操作符可以用于过滤。下面的查询可以找到比较操作符集合:
select p.name as packagename,o.name as comparatorname,o.description as comparatordescriptionfrom sys.dm_xe_objects oinner join sys.dm_xe_packages pon o.package_guid = p.guidwhere o.object_type = 'pred_compare'and (p.capabilities is null or p.capabilities & 1 = 0)order by packagename, comparatorname;
比较操作符的语法为:
package_name.predicate_comparator_name(,)
比较操作符和源列必需有相同的数据类型,源列的数据类型不能被转换。下面的脚本展示了如何使用比较操作符:
ring buffer示例
内存中的环形缓冲,临时存储事件数据到内存
if exists(select * from sys.server_event_sessions where name='buffermanagerwatcher')drop event session [buffermanagerwatcher] on server;create event session [buffermanagerwatcher]on serveradd event sqlserver.buffer_manager_page_life_expectancy(where (([package0].[less_than_equal_uint64]([count],(3000)))))add target package0.ring_buffer(set max_memory=4096)
上面的事件在page life expectancy降到3000微秒以下时被触发。
匹配提供了一个查找数据的内部值,让最终用户能知道值的意思。下面的查询提供了可用的匹配和值定义:
select name, map_key, map_valuefrom sys.dm_xe_map_valuesorder by name, map_key
匹配像类型一样是对扩展事件上下文的表述。它们并不直接用于扩展事件会话的定义。它们提供分配给谓词去过滤事件或计算目标数据的值的一个查找渠道。
会话是事件和相关的动作、谓词、会话目标的集合。一个会话可以有用一个或多个事件和目标。
650) this.width=650; title=image style=max-width:90% alt=image src=http://www.68idc.cn/help/uploads/allimg/151111/121rg453-0.jpg border=0 style=max-width:90% />
会话拥有独立的事件和目标配置。上例中,ring_buffer目标用于两个会话但是有用不同的内存配置。定义在一个会话中的事件独立于其他实例的不同会话的的同名事件。
event file示例
errorlog_written事件:当sql server错误日志写入的时候触发。
步骤1:
if exists(select * from sys.server_event_sessions where name='filetargetdemo')drop event session [filetargetdemo] on server;create event session [filetargetdemo]on serveradd event sqlserver.errorlog_writtenadd target package0.asynchronous_file_target(set filename='c:\filetargetdemo.etl', metadatafile='c:\filetargetdemo.mta')alter event session [filetargetdemo]on serverstate=start
步骤2:
dbcc checkdb(‘adventureworks2012’)
步骤3:
select name, target_name, cast(target_data as xml) target_data,(select c.column_name + '=' + c.column_value + ', 'from sys.dm_xe_session_object_columns cwhere s.address = c.event_session_addressand t.target_name = c.object_nameand c.object_type = 'target'order by column_idfor xml path('')) as optionsfrom sys.dm_xe_sessions sinner join sys.dm_xe_session_targets ton s.address = t.event_session_addresswhere s.name = 'filetargetdemo' select *from sys.fn_xe_file_target_read_file('c:\filetargetdemo*etl', 'c:\filetargetdemo*mta', null, null)
步骤4:
alter event session [filetargetdemo]on serverstate=stop
synchronous event counter示例
记录会话中触发的事件计数
步骤1:
if exists(select * from sys.server_event_sessions where name='eventcountertargetdemo')drop event session [eventcountertargetdemo] on server;create event session [eventcountertargetdemo]on serveradd event sqlserver.sql_statement_starting,add event sqlserver.sql_statement_completedadd target package0.synchronous_event_counterwith (max_dispatch_latency = 5 seconds)alter event session [eventcountertargetdemo]on serverstate=start
步骤2:
select name, target_name, cast(target_data as xml) target_datafrom sys.dm_xe_sessions sinner join sys.dm_xe_session_targets ton s.address = t.event_session_addresswhere s.name = 'eventcountertargetdemo'
步骤3:
alter event session [eventcountertargetdemo]on serverstate=stop
event pairing示例
找出有触发启动的事件但是没有触发相应的完成的事件的事件。对于跟踪lock acquired和lock released事件对,transaction begin和transaction end事件对很有用。
步骤1:
if exists(select * from sys.server_event_sessions where name='pairmatchingtargetdemo')drop event session [pairmatchingtargetdemo] on server;create event session [pairmatchingtargetdemo]on serveradd event sqlserver.database_transaction_begin(action (sqlserver.session_id)),add event sqlserver.database_transaction_end(action (sqlserver.session_id))add target package0.pair_matching(set begin_event='sqlserver.database_transaction_begin', begin_matching_actions='sqlserver.session_id', end_event='sqlserver.database_transaction_end', end_matching_actions='sqlserver.session_id')with (max_dispatch_latency = 5 seconds);alter event session [pairmatchingtargetdemo]on serverstate=start;
步骤2:
select name, target_name, cast(target_data as xml) target_datafrom sys.dm_xe_sessions sinner join sys.dm_xe_session_targets ton s.address = t.event_session_addresswhere s.name = 'pairmatchingtargetdemo'
步骤3:
alter event session [pairmatchingtargetdemo]on serverstate=stop;
event bucketing示例
用于根据事件负载列或行动分组来分组事件的发生。下面示例以wait_type来分组wait_info事件。
步骤1:
if exists(select * from sys.server_event_sessions where name='bucketingtargetdemo')drop event session [bucketingtargetdemo] on server;create event session [bucketingtargetdemo]on serveradd event sqlos.wait_infoadd target package0.asynchronous_bucketizer(set filtering_event_name='sqlos.wait_info', source_type=0, source='wait_type')with (max_dispatch_latency = 2 seconds)alter event session [bucketingtargetdemo]on serverstate=start
步骤2:
select name, target_name, cast(target_data as xml) target_datafrom sys.dm_xe_sessions sinner join sys.dm_xe_session_targets ton s.address = t.event_session_addresswhere s.name = ' bucketingtargetdemo '
步骤3:
alter event session [bucketingtargetdemo]on serverstate=stop;
event tracing for windows(etw)示例
etw目标文件是一个外部文件,不会被sql server内部使用。外部的etw通常被用来跟踪与内部发生事件相关的外部发生事件。
步骤1:
if exists(select * from sys.server_event_sessions where name='etwtargetdemo')drop event session [etwtargetdemo] on server;create event session [etwtargetdemo]on serveradd event sqlserver.sql_statement_starting (where sqlserver.database_id = 2),add event sqlserver.sql_statement_completed (where sqlserver.database_id = 2),add event sqlserver.file_written (where sqlserver.database_id = 2),add event sqlserver.file_write_completed (where sqlserver.database_id = 2)add target package0.etw_classic_sync_target (set default_etw_session_logfile_path = n'c:\sqletwtarget.etl')
同时,在windows命令行启动一个etw会话对于磁盘和文件操作收集外部etw数据
logman start nt kernel logger -p windows kernel trace (disk,file) -ets -o c:\systemetw.etl -bs 1024 -ct system
步骤2:
alter event session [etwtargetdemo]on serverstate=start
步骤3:
导入批量数据到tempdb。
步骤4:
alter event session [etwtargetdemo]on serverstate=stop
步骤5:
从命令行停止系统etw收集和扩展事件外部etw会话。
logman update nt kernel logger -fd -ets
logman stop nt kernel logger -ets
logman update xe_default_etw_session -fd -ets
logman stop xe_default_etw_session –ets
步骤6:
用tracerpt命令连接两个.etl文件生成一个.csv文件。
tracerpt c:\sqletwtarget.etl c:\systemetw.etl -y -o sqletw_results.csv
备注:
c:\>logman /?
c:\>tracerpt /?
其它类似信息

推荐信息