加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 我可以从SQL Server默认得到哪些变乱信息?

发布时间:2021-01-01 05:32:58 所属栏目:编程 来源:网络整理
导读:我常常会看到一些题目,人们想知道某件工作是否产生,可能何时产生,可能是谁执行了这一动作.在许多环境下,SQL Server自己不会跟踪此信息.譬喻: 谁最后执行了存储进程dbo.MyProcedure? 谁更新了dbo.Employees表中的salary列? 谁最后查询了Management Studio的

>碰着严峻性为> = 20的错误的任何会话的sql_text和session_id
>碰着“内存”范例错误的任何会话的sql_text和session_id,如17803,701等(我们添加了这个,由于并非全部内存错误都是严峻性> = 20)
>任何“非屈服”题目的记录(您偶然在ERRORLOG中看到这些题目为Msg 17883)
>检测到的任何死锁
>对付守候锁定(或其他风趣资源)的任何会话的callstack,sql_text和session_id,用于> 15秒
>任何守候锁定的会话的callstack,sql_text和session_id为> 30秒
>任何会话的callstack,守候“外部”守候或“先发制人守候”的延迟时刻.

从Use the system_health event session (MSDN)开始,该列表在SQL Server 2012中有所扩展(对付SQL Server 2014如故保持稳固):

>碰着严峻性> gt = 20的错误的任何会话的sql_text和session_id.
>碰着与内存相干的错误的任何会话的sql_text和session_id.错误包罗17803,701,802,8645,8651,8657和8902.
>任何非屈服调治措施题目的记录. (它们在SQL Server错误日记中表现为错误17883.)
>检测到的任何死锁.
>对付守候锁定(或其他风趣资源)的任何会话的callstack,用于> 15秒
>任何已守候>锁定的会话的callstack,sql_text和session_id 30秒.
>用于抢占守候很长时刻的任何会话的callstack,sql_text和session_id.一连时刻因守候范例而异.争先守候是SQL Server守候外部API挪用的处所.
>用于CLR分派和假造分派失败的callstack和session_id.
>内存署理,调治措施监督器,内存节点OOM,安详性和毗连的ring_buffer变乱.
> sp_server_diagnostics的体系组件功效.
> scheduler_monitor_system_health_ring_buffer_recorded网络的实例运行状况.
> CLR分派失败.
>行使connectivity_ring_buffer_recorded的毗连错误.
>行使security_error_ring_buffer_recorded的安详错误.

在SQL Server 2016中,还捕捉了其它两个变乱:

>行使KILL呼吁终止历程时.
> SQL Server封锁时已启动.

(该文档尚未更新,but I blogged about how I discover these and other changes.)

要得到合用于特定版本的越发隐秘的设置,您始终可以直接运行以下查询,可是您必需表明名称并理会谓词以匹配上面更天然的说话列表:

SELECT e.package,e.event_id,e.name,e.predicate
  FROM sys.server_event_session_events AS e
  INNER JOIN sys.server_event_sessions AS s
  ON e.event_session_id = s.event_session_id
 WHERE s.name = N'system_health'
 ORDER BY e.package,e.name;

假如您正在行使可用性组,则还会发明两个正在运行的新会话:AlwaysOn_failover和AlwaysOn_health.您可以行使以下查询查察他们网络的数据:

SELECT s.name,e.package,e.predicate
  FROM sys.server_event_session_events AS e
  INNER JOIN sys.server_event_sessions AS s
  ON e.event_session_id = s.event_session_id
 WHERE s.name LIKE N'AlwaysOn[_]%'
 ORDER BY s.name,e.name;

这些变乱会话行使环形缓冲区方针来存储数据,因此 – 如缓冲池和打算缓存 – 往变乱将慢慢裁减,因此您不必然可以或许从所需的日期范畴中提取变乱.

在这个题目中我提出了这个虚拟的题目:

How many memory-related errors have happened today?

以下是可以从system_health会话中提取此信息的示例(也许不长短常高效)查询:

;WITH src(x) AS
(
  SELECT y.query('.')
  FROM
  (
    SELECT x = CONVERT(XML,t.target_data)
      FROM sys.dm_xe_sessions AS s
      INNER JOIN sys.dm_xe_session_targets AS t
      ON s.[address] = t.event_session_address
      WHERE s.name = N'system_health'
  ) AS x
  CROSS APPLY x.x.nodes('/RingBufferTarget/event') AS y(y)
)
SELECT 
  x,ts = CONVERT(DATETIME,NULL),err = CONVERT(INT,NULL)
INTO #blat FROM src;

DELETE #blat WHERE x.value('(/event/@name)[1]','varchar(255)') <> 'error_reported';

UPDATE #blat SET ts = x.value('(/event/@timestamp)[1]','datetime');

UPDATE #blat SET err = x.value('(/event/data/value)[1]','int');

SELECT err,number_of_events = COUNT(*)
  FROM #blat
  WHERE err IN (17803,8657,8902)
  AND ts >= CONVERT(DATE,CURRENT_TIMESTAMP)
  GROUP BY err;

DROP TABLE #blat;

(这个例子从Amit Banerjee’s introductory blog post on the system_health session开始宽容借用.)

有关扩展变乱的更多信息(包罗可以查询特定命据的很多示例),请参阅Jonathan Kehayias撰写的这个由31部门构成的博客系列:

https://www.sqlskills.com/blogs/jonathan/an-xevent-a-day-31-days-of-extended-events/

错误日记

SQL Server默认保存当前加上6个最新的错误日记文件(可是you can change this).存储了大量信息,包罗启动信息(正在行使的内核数目,内存中的锁定页面是否配置,身份验证模式等)以及错误和其他严峻到足以记录的环境(而且未在其他处所捕捉).最近的一个例子是有人在数据库脱机时探求.您可以通过扫描每个最新的7个错误日记来确定文本配置数据库选项OFFLINE:

EXEC sys.sp_readerrorlog 0,1,'Setting database option OFFLINE';
EXEC sys.sp_readerrorlog 1,'Setting database option OFFLINE';
EXEC sys.sp_readerrorlog 2,'Setting database option OFFLINE';
EXEC sys.sp_readerrorlog 3,'Setting database option OFFLINE';
EXEC sys.sp_readerrorlog 4,'Setting database option OFFLINE';
EXEC sys.sp_readerrorlog 5,'Setting database option OFFLINE';
EXEC sys.sp_readerrorlog 6,'Setting database option OFFLINE';

我先容了其他一些细节in this recent answer,尚有一些很好的配景信息at toadworld和in the official documentation.

默认环境下,错误日记会跟踪一组“错误” – 而且可以使重要信息更快地离开 – 是每个乐成的备份动静.您可以在enabling trace flag 3226之前阻止这些错误日记填满噪音.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读