Questions tagged «extended-events»

SQL Server扩展事件(Extended Events)是服务器系统的常规事件处理系统。

1
默认情况下,我可以从SQL Server获取哪些事件信息?
我经常在人们想知道某件事是否发生,何时发生或由谁执行操作的问题上遇到疑问。在很多情况下,SQL Server不会单独跟踪此信息。例如: 谁最后执行存储过程dbo.MyProcedure? 谁更新salary了dbo.Employees表格中的列? 谁最后dbo.Orders从Management Studio 查询表格? 但是默认情况下,SQL Server 会临时跟踪其他一些事件,这些事件可以本地回答有关的问题,例如: 上一次在AdventureWorks数据库中发生自动增长是什么时候? 谁删除了dbo.EmployeeAuditData表格,何时删除? 今天发生了多少与内存相关的错误? 我如何获得此信息,以及该信息可以使用多长时间?

2
在阻止的流程报告中清空阻止流程
我正在使用扩展事件来收集阻止的流程报告,并且由于某些原因,某些报告中该blocking-process节点为空。这是完整的xml: <blocked-process-report monitorLoop="383674"> <blocked-process> <process id="processa7bd5b868" taskpriority="0" logused="106108620" waitresource="KEY: 6:72057613454278656 (8a2f7bc2cd41)" waittime="25343" ownerId="1051989016" transactionname="user_transaction" lasttranstarted="2017-03-20T09:30:38.657" XDES="0x21f382d9c8" lockMode="X" schedulerid="7" kpid="15316" status="suspended" spid="252" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2017-03-20T09:39:15.853" lastbatchcompleted="2017-03-20T09:39:15.850" lastattention="1900-01-01T00:00:00.850" clientapp="Microsoft Dynamics AX" hostname="***" hostpid="1348" loginname="***" isolationlevel="read committed (2)" xactid="1051989016" currentdb="6" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> <executionStack> <frame line="1" stmtstart="40" sqlhandle="0x02000000f7def225b0edaecd8744b453ce09bdcff9b291f50000000000000000000000000000000000000000" /> <frame line="1" …


2
可视化SQL Server扩展事件数据
最近,我一直在探索在SQL Server中使用扩展事件来帮助我进行基准测试和优化各种查询。到目前为止,要查看事件数据,我一直在使用SSMS中的“观看实时数据”功能。 我遇到的问题是,实时事件功能似乎使用了内部缓冲区,这意味着有时我需要多次执行查询才能使其信息显示在窗口中。因此,我有一个两部分的问题要问: 有没有办法解决将延迟显示在实时供稿中的这种延迟?(我正在本地数据库上执行此操作,因此性能不是问题) 实时供稿是否是可视化扩展事件数据的最佳方法?SSMS中是否有另一个工具可以更好地适应我的用例? 更新 根据要求,这里是会议: CREATE EVENT SESSION [Simple Query Benchmarking] ON SERVER ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1) ACTION(sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.sql_text) WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [package0].[greater_than_uint64]([duration],(1000)))) ADD TARGET package0.ring_buffer WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF) GO


1
扩展事件允许的最大绑定动作数是多少?
如果在事件会话中向事件添加“太多”操作,则会收到此错误: 消息25639,级别16,状态23,第1行该事件“ [事件名称]”超出了允许的绑定操作数。 允许多少动作?它会因事件而变化吗? 根据实验,答案似乎是27 sqlserver.rpc_completed。但是我在任何Microsoft文档中都没有找到这个数字。而且似乎因事件而异,因为我能够获得30分sqlserver.sql_batch_completed。 失败的示例代码: CREATE EVENT SESSION [Test] ON SERVER ADD EVENT sqlserver.rpc_completed( ACTION( package0.callstack, package0.collect_cpu_cycle_time, package0.collect_current_thread_id, package0.collect_system_time, package0.event_sequence, package0.last_error, package0.process_id, sqlos.cpu_id, sqlos.numa_node_id, sqlos.scheduler_address, sqlos.scheduler_id, sqlos.system_thread_id, sqlos.task_address, sqlos.task_elapsed_quantum, sqlos.task_resource_group_id, sqlos.task_resource_pool_id, sqlos.task_time, sqlos.worker_address, sqlserver.client_app_name, sqlserver.client_connection_id, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.context_info, sqlserver.database_id, sqlserver.database_name, sqlserver.is_system, sqlserver.nt_username, sqlserver.plan_handle)) GO DROP EVENT SESSION [Test] …

1
我如何尽快切碎此扩展事件XML?
我在SQL Server 2008 R2中创建了扩展事件会话。会话运行,并在事件发生时收集事件,完全符合您的期望。 如果在事件相对较少时切碎xml,则性能可以接受。当我有成千上万个事件时,将xml切碎是永远的。 我知道自己做错了事,只是对XML引擎的内部知识不足,无法理解。 这是我的扩展事件会话的定义: IF EXISTS ( SELECT 1 FROM sys.server_event_sessions dxs WHERE dxs.name = 'queries' ) BEGIN IF EXISTS ( SELECT 1 FROM sys.dm_xe_sessions dxs WHERE dxs.name = 'queries' ) BEGIN ALTER EVENT SESSION queries ON SERVER STATE = STOP; END DROP EVENT SESSION queries ON …

1
SQL扩展事件会话,用于死锁检测
有没有办法增加<inputbuf>死锁扩展事件会话捕获的死锁XML中元素的大小? 我们希望看到完整的查询,以帮助在应用程序代码中查明问题。 似乎仅限于1024个字符+/-。可以增加吗? 请参阅下面的XML示例。您可以看到<inputbuf>元素的查询文本在选择列表的中间被截断了: <deadlock> <victim-list> <victimProcess id="processc9c0829848" /> </victim-list> <process-list> <process id="processc9c0829848" taskpriority="0" logused="0" waitresource="PAGE: 5:1:40600276 " waittime="696" ownerId="255115931225" transactionname="SELECT" lasttranstarted="2019-04-24T09:29:25.950" XDES="0xc8dfa8da40" lockMode="S" schedulerid="13" kpid="8480" status="suspended" spid="245" sbid="2" ecid="0" priority="0" trancount="0" lastbatchstarted="2019-04-24T09:29:25.950" lastbatchcompleted="2019-04-24T09:29:25.950" lastattention="1900-01-01T00:00:00.950" clientapp="EntityFramework" hostname="MSR-PRD-BDB02" hostpid="43440" loginname="IUSR_BuildDB" isolationlevel="read committed (2)" xactid="255115931225" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056"> <executionStack> <frame procname="adhoc" …

1
来自系统健康状况扩展事件的错误流程利用?
我最近一直在努力了解存储在系统健康状况扩展事件事件文件中的数据或度量。 我们正在尝试使用此处提供的系统健康状况来实施性能指标的数据收集 有报告提供了从名为“系统运行状况”的事件中收集的指标,如CPU利用率,其他进程利用率等。 scheduler_monitor_system_health_ring_buffer_recorded 对于少数繁忙的服务器,我无法理解为什么报告中列为“ SQL CPU利用率”的字段“ process_utilization”大部分时间都高于100。在高峰时间,它在120-160之间变化,因此该报告是始终显示CPU高于100,即使我从服务器活动监视器中检查也是如此。 我已经在Github中提出了这个问题,但似乎没有解决方法或没有回应。 因此,我的问题是 如何使用记录的系统运行状况环形缓冲区获取服务器的SQL CPU利用率的准确数字? 报告还显示了根据其报告计算出的以下2个字段的计数器 100-System_idle-process_utilization和OtherProcessUtil 100-system_idle作为SystemUtil 这些OtherProcessUtil和SystemUtil需要/有什么帮助? 我还看到每次每次的内存利用率始终显示为100。这似乎也不正确。有人注意到吗? 其他工具(例如Idera和sentry)(我测试过)没有显示相同服务器的CPU使用率超过100%。对于相同的负载,我进行了并排比较。

1
如果系统健康中有“ sql_exit_invoked”,这意味着什么?
我的一台SQL Server 2016 Standard服务器遇到问题。我有8个生产服务器,这是唯一一台随机崩溃而日志中没有任何痕迹的服务器。 我已启用system_health。我注意到我在系统健康状况中有一行是“ sql_exit_invoked”。 我正在尝试在该行上找到更多信息。这是什么意思?我在互联网上发现的唯一信息是,它在调用SQLExit()时发生,并且仅在SQL 2012以后才记录。(msdn网站上的链接) 所以我的问题是:我应该担心在日志中看到这个吗?我只能在有问题的服务器上找到它,而在其他7个服务器上都找不到。(所有都是SQL Server 2016 Standard版) 有人可以给我更多信息吗?

1
在扩展事件会话上无法观看实时数据
我在PC上运行SQL Server 2014 Developer Edition。我正在尝试在system_health会话中查看数据。在SSMS中,我已连接到数据库,扩展了服务器/管理/扩展事件/会话。我看到AlwaysON_health(已停止)和system_health(正在运行)。 右键单击system_health会话时,出现以下错误: 使用提供的参数初始化存储失败。(Microsoft.SqlServer.XEventStorage)找不到名为“ system_health”的扩展事件会话。确保会话存在并已启动。(Microsoft SQL Server,错误:25728) 我展开system_health并看到目标package0.event_file和package0.ring_buffer。如果我右键单击任一目标并选择“查看目标数据”,则会收到此错误: 使用提供的参数初始化存储失败。(Microsoft.SqlServer.XEventStorage)无法查看功能'fn_MSXe_read_event_stream',因为该功能不存在或您没有权限。(Microsoft SQL Server,错误:15151) 该功能确实存在。我可以运行它: select * from fn_MSXe_read_event_stream('system_health', 0); 当我这样做时,会出现以下错误: Msg 25728, Level 16, State 10, Line 6 The Extended Events session named "system_health" could not be found. Make sure the session exists and is started. 我知道存在system_health会话。我在会话列表中看到: select * …

1
从扩展事件会话中收集参数值
我正在使用扩展事件来跟踪应用程序使用的语句。我创建了一个会话,该会话将收集所需的信息,但我也想知道所使用的参数的实际值。 我正在非生产环境中执行此跟踪,因此跟踪所导致的任何性能下降都是可以接受的。 所有查询均源自Hibernate,并已通过以下形式进行了参数化: SELECT a, b, c From Customer where CustomerId = @P0 这是我的会话设置。 CREATE EVENT SESSION [TracingForStatements] ON SERVER ADD EVENT sqlserver.sp_statement_completed ( ACTION ( sqlserver.session_id, package0.collect_system_time, sqlserver.transaction_id, package0.event_sequence ) WHERE ( sqlserver.database_id=555 ) ) ADD TARGET package0.ring_buffer(SET max_memory= 128000) WITH (EVENT_RETENTION_MODE = NO_EVENT_LOSS, MAX_DISPATCH_LATENCY = 1 SECONDS) 如何捕获捕获的语句中使用的参数的实际值?可能吗? …

1
为什么EXEC语句的query_hash为零?
我正在使用扩展事件为SQL Server设置监视系统,以查找繁重的查询作为开发人员的“生产反馈”。我正在使用event sp_statement_completed和sql_statement_completed,并在cpu_time,逻辑读取等上使用谓词过滤器。我希望将结果聚合在一起,database_name并query_hash像在Internet上的众多示例中所展示的那样,但是在结果中,我看到query_hash所有语句的结果均为0使用EXEC,如下表所示(时间戳和queryhash缩短了可读性)。 name timestamp query_hash plan_handle statement sql_statement_completed 2016...6414 0 050056019600764... exec Shared.dbo.SyncFirm sql_statement_completed 2016...9946 0 06003d00e01e730... exec spSetUserAuth @userid; sql_statement_completed 2016...7184 0 0600e30028c9da0... exec spSetUserAuth @userid; sp_statement_completed 2016...0409 9826...578 0600c00028e6aa0... SELECT obfuscated_columns FROM dbo.SomeTable sp_statement_completed 2016...1448 8660...775 060084006d2d660... INSERT INTO dbo.SomeTable ( obfuscated_columns) EXEC(@sql) sql_statement_completed 2016...7752 0 0600f9006c23f03... …

2
扩展事件与SQL审核-性能影响
我想在数据库上设置一个审计跟踪类型的系统,以监视UPDATE/INSERT活动非常活跃的特定表上的语句。我面前有两个选择:使用SQL Server内置的Audit系统或使用扩展事件。 由于SQL Server审核在内部使用扩展事件,因此我假设直接使用审核而不是扩展事件会产生某种开销。 我有什么办法可以做一些测试来分析哪个系统对服务器的影响更大?如果我知道创建任何XE会话时实际发生的情况,它将有助于我分析对服务器的影响。 我们考虑了触发器,但由于开销而忽略了该选项。但这只是基于Internet上的信息而决定的。

2
SQL Server性能:PREEMPTIVE_OS_DELETESECURITYCONTEXT主导等待类型
我昨天接到一个客户的电话,该客户抱怨他们的SQL Server上的CPU使用率过高。我们正在使用SQL Server 2012 64位SE。服务器正在运行Windows Server 2008 R2 Standard,2.20 GHz Intel Xeon(4核),16 GB RAM。 在确定罪魁祸首实际上是SQL Server之后,我在这里使用DMV查询在顶部等待实例。前两个等待是:(1)PREEMPTIVE_OS_DELETESECURITYCONTEXT和(2)SOS_SCHEDULER_YIELD。 编辑:这是“最等待查询”的结果(尽管有人违反了我的意愿今天早晨重新启动了服务器): 我们进行了大量的计算/转换,所以我可以理解SOS_SCHEDULER_YIELD。但是,我很好奇PREEMPTIVE_OS_DELETESECURITYCONTEXT等待类型以及为什么它可能是最高的。 最好的说明/讨论,我可以找到这个等待类型,可以发现在这里。它提到: PREEMPTIVE_OS_等待类型是离开数据库引擎的调用,通常是对Win32 API的调用,它们正在SQL Server外部执行代码以执行各种任务。在这种情况下,它将删除以前用于远程资源访问的安全上下文。相关的API实际上被命名为DeleteSecurityContext() 据我所知,我们没有任何外部资源,例如链接服务器或文件表。而且,我们不进行任何模拟操作,等等。备份是否可能导致备份激增或域控制器出现故障? 到底什么会导致这成为主要的等待类型?如何进一步跟踪此等待类型? 编辑2:我检查了Windows安全日志的内容。我看到了一些可能感兴趣的条目,但不确定这些是否正常: Special privileges assigned to new logon. Subject: Security ID: NT SERVICE\MSSQLServerOLAPService Account Name: MSSQLServerOLAPService Account Domain: NT Service Logon ID: 0x3143c Privileges: SeImpersonatePrivilege Special privileges …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.