我已经设置了SQL Server扩展事件,以将特定数据库中的最后1000个失败查询捕获到环形缓冲区中:
Create Event Session [Errors] on Server
Add Event sqlserver.error_reported (
Action(
sqlos.task_time,
sqlserver.sql_text
)
Where sqlserver.database_name=N'MyDatabase'
And error_number<>5701 -- Ignore changed db context messages
)
Add target package0.ring_buffer(Set max_memory=102400)
With (
MAX_MEMORY=4096 KB,
EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS,
MAX_EVENT_SIZE=0 KB,
MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,
STARTUP_STATE=ON
)
Go
Run Code Online (Sandbox Code Playgroud)
我现在可以像这样查询这些错误:
Select
xmldata = Cast(xet.target_data as xml)
Into #rbd
From sys.dm_xe_session_targets xet
Join sys.dm_xe_sessions xe ON (xe.address = xet.event_session_address)
Where xe.name='errors' and target_name='ring_buffer'
; With Errors as (
Select
e.query('.').value('(/event/@timestamp)[1]', 'datetime') as "TimeStamp",
e.query('.').value('(/event/data[@name="message"]/value)[1]', 'nvarchar(max)') …
Run Code Online (Sandbox Code Playgroud) 任何人都可以建议我们在运行Profiler之外捕获发送到SQL Server的所有SQL语句的选项吗?我知道有几种方法可以做到这一点,但我想确保我不会忽略某些东西,例如现有的DM视图等.
非常感谢.
我正在试图找出更新列值的内容,而我对应用程序知之甚少.快速浏览一下,我注意到大约90%的应用程序业务逻辑都是在数据库上处理的.毋庸置疑,SP,功能和触发器的深度是疯狂的.
我想在有问题的表上创建一个触发器,它将记录影响该表的SQL.可以使用什么SQL在正在更新的表的上下文中获取已执行的SQL?
详细信息:MS SQL Server 2008
谢谢!!
我正在locks_lock_timeouts_greater_than_0
使用SQL Server中的扩展事件捕获事件.活动会议如下:
CREATE EVENT SESSION MyQuery ON SERVER
ADD EVENT sqlserver.locks_lock_timeouts_greater_than_0
(
ACTION (sqlserver.sql_text, sqlserver.tsql_stack)
)
ADD TARGET package0.ring_buffer (SET max_memory = 4096)
WITH (max_dispatch_latency = 1 seconds)
Run Code Online (Sandbox Code Playgroud)
如何确定锁定的对象以及当前锁定的对象?
更新:我需要这个用于SQL Server 2008.如何在2012年之前的版本上调试锁定超时?
如何清除存储在文件中的SQL Server扩展事件?
SQL Server 扩展事件事件文件目标的文件存储在哪里?
我想删除几个月的日志文件;但 SQL Server 没有告诉我文件在哪里:
我会遵循 Microsoft 的 SQL Server 论坛上的建议:
清除文件目标中的事件?
如果不再需要,只需停止会话并删除 .xel 文件。
尝试#3
我尝试做任何值得他们的盐的用户界面设计师从一开始就创建的最明显的事情:右键单击事件文件目标,然后选择:
除了没有选择做任何这些明显的事情:
尝试#4
我还尝试进入Extended Events菜单,然后单击Clear Data。但是该选项莫名其妙地被禁用了:
尝试#5
我还尝试编写Extended Events Session脚本,以查看它存储文件的位置。但当然 SQL Server 团队没有帮助:
ADD TARGET package0.event_file(SET filename=N'Expensive Queries',max_file_size=(25),max_rollover_files=(4)),
Run Code Online (Sandbox Code Playgroud)
尝试#6
在 SQL Server Profiler 中。如果您想清除事件,请按下按钮以清除事件:
SQL Profiler 已弃用,它的替代品无法清除事件。
清除事件的方法是什么?
我希望 SQL Server 创建一个日志文件,记录所有(成功的)数据库登录/连接。日志应至少包含:
看起来服务器跟踪可能可以捕获所有这些信息,但微软表示服务器跟踪已被弃用,取而代之的是扩展事件。
因此,我尝试通过扩展事件收集这些信息。对于我的测试,我使用 SQL Server 2017 Developer Edition(在 Windows 10 上的 Docker 容器中运行)和 SSMS v17.7。创建或查看扩展事件时,我以“sa”身份登录。
到目前为止,我已经能够通过扩展事件收集大部分信息。问题是收集客户端 IP 和端口。我可以单独获得任何一个部分,但不能同时获得两个部分。下面列出了我正在使用的 XEvent。列出两次的事实connection_accept
并不是错误。SQL Server 实际上有两个名称完全相同的不同事件(!!!)。
Login
:没有收集客户端 IP 或端口的选项(字段或操作)。至少它确实提供了client_hostname
!Logout
:没有收集客户端 IP 或端口的选项(字段或操作)。这也捕捉到了client_hostname
。connection_accept
:
Login
事件关联Logout
。EVENT SESSION
的集合,但这些字段/操作都不存在于收集的数据中。:(username
client_app_name
client_hostname
connection_accept
:
Login
和Logout
这些事件都没有提供客户端的 IP 地址,但我会接受客户端主机名作为合理的替代。然而,获取端口号是一个真正的问题。端口号仅在connection_accept
事件中找到,并且没有明显的方法将其与login
具有主机名的事件关联起来。简而言之,扩展事件似乎根本无法提供这种基本的客户端 IP 和端口配对。我想相信我错了,因为这是如此基本的数据。对于我所忽略的内容的任何帮助或建议将不胜感激。
当我尝试运行扩展事件时:
CREATE EVENT SESSION [Loading] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(SET collect_statement=(1))
ADD TARGET package0.event_file(SET filename=N'C:\Users\user\Documents\test.xel',max_file_size=(10))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=3 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)
在SQL Server 2016上,我得到:
目标"5B2DA06D-898A-43C8-9309-39BBBE93EBBD.package0.event_file"在初始化期间遇到配置错误.无法将对象添加到事件会话中.操作系统返回错误5:'访问被拒绝.'在创建文件'C:\ Users\user\Documents\test_0_131207679384970000.xel'时.(Microsoft SQL Server,错误:25602)
问题出在哪儿?我对C:\ Users\user\Documents有足够的权限.
我正在查询system_health会话并注意到并非所有事件都被返回.今天肯定没有什么死锁,但这些并不在输出中.
我遇到了这个连接文件但是从评论中已经在SQL Server 2008 SP2中解决了这个问题.但我的版本是SQL Server 2008 SP3 Standard.这里有一些更多的细节.
这是一个Bug还是我查错了?
<RingBufferTarget truncated="1" eventsPerSec="31291" processingTime="209" totalEventsProcessed="6540" eventCount="1947" droppedCount="0" memoryUsed="4193813">
SELECT TOP 1 e.event.value('(@timestamp)[1]','datetime') AS MaxDate, GETDATE() Today
FROM
( SELECT ( SELECT
CONVERT(xml, target_data)
FROM sys.dm_xe_session_targets st
JOIN sys.dm_xe_sessions s ON
s.address = st.event_session_address
WHERE s.name = 'system_health'
AND st.target_name = 'ring_buffer'
)AS [x]
FOR XML PATH(''), TYPE
) AS the_xml(x)
CROSS APPLY x.nodes('x/RingBufferTarget/event') e (event)
ORDER BY MaxDate DESC
MaxDate Today
2013-01-09 20:05:31.853 2013-01-11 15:22:37.887
Run Code Online (Sandbox Code Playgroud)