SQL Server扩展事情(Extended Events)-- 运用扩展事情不同方针示例51CTO博客 - 威尼斯人

SQL Server扩展事情(Extended Events)-- 运用扩展事情不同方针示例51CTO博客

2019年03月01日11时57分29秒 | 作者: 采波 | 标签: 事情,方针,示例 | 浏览: 2942

SQL Server扩展事情(Extended Events) 运用扩展事情不同方针示例


下面的查询回来效劳器的一切方针:

 

SELECT p.name AS PackageName,
o.name AS TargetName,
o.description AS TargetDescription
FROM sys.dm_xe_objects o
INNER JOIN sys.dm_xe_packages p
ON o.package_guid = p.guid
WHERE 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_desc
when mandatory then yes
else no
end AS [Required]
FROM sys.dm_xe_objects o
INNER JOIN sys.dm_xe_packages p
ON o.package_guid = p.guid
INNER JOIN sys.dm_xe_object_columns c
ON o.name = c.object_name
WHERE 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 ActionDescription
FROM sys.dm_xe_objects o
INNER JOIN sys.dm_xe_packages p
ON o.package_guid = p.guid
WHERE 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 TypeDescription
FROM sys.dm_xe_objects o
INNER JOIN sys.dm_xe_packages p
ON o.package_guid = p.guid
WHERE 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 ColumnDescription
FROM sys.dm_xe_objects o
INNER JOIN sys.dm_xe_packages p
ON o.package_guid = p.guid
WHERE 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 ComparatorDescription
FROM sys.dm_xe_objects o
INNER JOIN sys.dm_xe_packages p
ON o.package_guid = p.guid
WHERE o.object_type = pred_compare
AND (p.capabilities IS NULL OR p.capabilities & 1 = 0)
ORDER BY PackageName, ComparatorName;

 

比较操作符的语法为:

Package_name.predicate_comparator_name(<predicate_source_column>,<value>)

 

比较操作符和源列必需有相同的数据类型,源列的数据类型不能被转化。下面的脚本展现了怎么运用比较操作符:

 

Ring Buffer示例

内存中的环形缓冲,暂时存储事情数据到内存

 

IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name=BufferManagerWatcher)
DROP EVENT SESSION [BufferManagerWatcher] ON SERVER;
CREATE EVENT SESSION [BufferManagerWatcher]
ON SERVER
ADD 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_value
FROM sys.dm_xe_map_values
ORDER BY name, map_key

 

匹配像类型相同是对扩展事情上下文的表述。它们并不直接用于扩展事情会话的界说。它们供给分配给谓词去过滤事情或核算方针数据的值的一个查找途径。

会话是事情和相关的动作、谓词、会话方针的调集。一个会话能够有用一个或多个事情和方针。

 

 

会话具有独立的事情和方针装备。上例中,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 SERVER
ADD EVENT sqlserver.errorlog_written
ADD TARGET package0.asynchronous_file_target(
SET filename=c:\FileTargetDemo.etl, metadatafile=c:\FileTargetDemo.mta)
ALTER EVENT SESSION [FileTargetDemo]
ON SERVER
STATE=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 c
WHERE s.address = c.event_session_address
AND t.target_name = c.object_name
AND c.object_type = target
ORDER BY column_id
for xml path()) AS options
FROM sys.dm_xe_sessions s
INNER JOIN sys.dm_xe_session_targets t
ON s.address = t.event_session_address
WHERE 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 SERVER
STATE=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 SERVER
ADD EVENT sqlserver.sql_statement_starting,
ADD EVENT sqlserver.sql_statement_completed
ADD TARGET package0.synchronous_event_counter
WITH (MAX_DISPATCH_LATENCY = 5 SECONDS)
ALTER EVENT SESSION [EventCounterTargetDemo]
ON SERVER
STATE=START

 

过程2:

SELECT name, target_name, CAST(target_data AS XML) target_data
FROM sys.dm_xe_sessions s
INNER JOIN sys.dm_xe_session_targets t
ON s.address = t.event_session_address
WHERE s.name = EventCounterTargetDemo

 

过程3:

ALTER EVENT SESSION [EventCounterTargetDemo]
ON SERVER
STATE=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 SERVER
ADD 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 SERVER
STATE=START;

 

过程2:

SELECT name, target_name, CAST(target_data AS XML) target_data
FROM sys.dm_xe_sessions s
INNER JOIN sys.dm_xe_session_targets t
ON s.address = t.event_session_address
WHERE s.name = PairMatchingTargetDemo

 

过程3:

ALTER EVENT SESSION [PairMatchingTargetDemo]
ON SERVER
STATE=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 SERVER
ADD EVENT sqlos.wait_info
ADD 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 SERVER
STATE=START

 

过程2:

SELECT name, target_name, CAST(target_data AS XML) target_data
FROM sys.dm_xe_sessions s
INNER JOIN sys.dm_xe_session_targets t
ON s.address = t.event_session_address
WHERE s.name =  BucketingTargetDemo 

 

过程3:

ALTER EVENT SESSION [BucketingTargetDemo]
ON SERVER
STATE=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 SERVER
ADD 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 = NC:\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 SERVER
STATE=START

 

过程3:


导入批量数据到tempdb。

 

过程4:

ALTER EVENT SESSION [ETWTargetDemo]
ON SERVER
STATE=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 /?



版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章