SQLSERVER DBCC TRACEON

一、跟踪标志:

  3604:直接返回信息到 当前客户端;而不是 打印信息 到 错误日志文件

  2588:显示隐藏的DBCC命令、以及提供帮助信息

  -1:用作 traceon的最后一个参数。表示服务器范围有效;否则仅仅当前会话有效

      1204: 返回参与死锁的锁的资源和类型,以及受影响的当前命令;

      1222:返回参与死锁的锁的资源和类型,以及使用了不符合任何XSD架构的XML格式的受影响的当前命令(比1204更进一步,2005及以上版本可以使用);

      3605: 将DBCC的结果输出到错误日志;

二、命令示例:DBCC TRACEON(3605,1204,1222,-1)

                  DBCC TRACEON(1204,-1)

                  DBCC TRACEON(1222,-1)

三、以上跟踪标志作用域是全局,知道sqlserver重启会失效,如果希望自动启动开启这些标志,可以再服务启动选项中设置

--查询错误日志的语句:

exec xp_readerrorlog 0,1,N'lock',N‘’,NULL,NULL,N'DESC'

exec xp_readerrorlog 0,1,N'lock',N‘’,'2017-01-01','2017-01-31',N'DESC'

xp_readerrorlog 一共有7个参数

1. 存档编号 

2. 日志类型(1为SQL Server日志,2为SQL Agent日志)
3. 查询包含的字符串
4. 查询包含的字符串
5. LogDate开始时间
6. 结果排序,按LogDate排序(可以为降序"Desc" Or 升序"Asc")
7. 结果排序,按LogDate排序(可以为降序"Desc" Or 升序"Asc") 

-----------求每天死锁次数
--drop table #t
go
create table #t (logdate datetime ,pro varchar(200),rem varchar(200))
go
insert into #t exec xp_readerrorlog 0,1,N'deadlock victim',N'','2018-11-14','2018-11-17',N'DESC'--73

select convert(varchar(10),logdate,120) Dated,count(1) deadlock_counts from #t group by convert(varchar(10),logdate,120) order by 1
 

1204:exec xp_readerrorlog 0,1,N'Deadlock encountered',N'','2018-11-23','2019-01-31',N'DESC'

1222:exec xp_readerrorlog 0,1,N'deadlock victim',N'','2018-11-14','2018-11-17',N'DESC'

四、1204错误日志分析详解

处于死锁状态时,跟踪标记 1204 在等待的线程、存在等待线程的资源和控制这些资源的线程间画出相关循环。

跟踪标记 1204 报告中的术语 尽管根据所涉及的资源,跟踪标记 1204 会返回不同信息,但是报告通常会包含如下术语:

1. Node 节点:x 在死锁的链中表示项目号 (x)。

2. List 列表 锁的所有者可能是如下列表中的一部分:授权、转换和等待。

3. Grant List 授权列表 列举资源的当前所有者。

转换列表 列举要把锁转换到较高级别的当前所有者。

4. Wait List 等待列表 列举当前新锁对资源的请求。 SPID:x ECID:x

在并行进程情况下,标识系统进程 ID 线程。条目 SPID x ECID 0 表示主线程,而 SPID x ECID > 0 表示同一 SPID 的子线程。

5. Statement Type 语句类型 为 SELECT, INSERT, UPDATE 或 DELETE 语句,线程在这些语句上具有权限。

行号 发生死锁时,列出当前正在执行的批处理语句行。

6. Input Buf 列出当前批处理中所有的语句。

7. Mode 为线程请求、授权或等待的特定资源,指定锁的类型。模式可以是 IS(意向共享)、S(共享)、U(更新)、IX(意向独占)、SIX(与意向独占共享)和 X(独占)。有关更多信息,请参见SQL Server 中的锁定介绍。

8. RID 在对锁进行控制或请求的表中,标识单个行。

9. RID 在跟踪标记 1204 中,表示为 RID:db_id:file_id:page_no:row_no;例如,RID: 1:1:1253:0。

10. TAB 标识对锁进行控制或请求的表。 TAB 在跟踪标记 1204 中表示为 TAB:db_id:object_id;例如,TAB: 2:2009058193。

11. KEY 在对锁进行控制或请求的索引内,标识键范围。 KEY 在跟踪标记 1204中表示为 KEY:db_id:object_id:index_id;例如,KEY: 2:1977058079:1。

12. PAG 标识对锁进行控制或请求的页资源。 PAG 在跟踪标记 1204 中表示为 PAG:db_id:file_id:page_no;例如 PAG: 7:1:168。

13. EXT 标识扩展盘区结构。 EXT 在跟踪标记 1204 中表示为 EXT:db_id:file_id:extent_no;例如,EXT: 7:1:9。

14 .DB 标识数据库锁。 DB 在跟踪标记 1204 中表示为如下方式之一:

DB:db_id DB:db_id[BULK-OP-DB] 标识了备份数据库占用的数据库锁。 DB:db_id[BULK-OP-LOG] 标识了特定数据库的备份日志占用的锁。 IND

标识在索引资源上创建的索引占用的锁。

15. IND 在跟踪标记 1204 中表示为如下方式之一: IND:db_id:object_id:index_id IND:db_id:object_id:index_id[INDEX_ID] 表明锁在索引 ID 上。IND:db_id:object_id:index_id[INDEX_NAME] 表明锁在索引名上。

16. APP 标识应用程序资源占用的锁。 APP 在跟踪标记 1204 中表示为APP:lock_resource;例如,APP:Formf370f478。

当 SQL Server 选取应用程序资源为死锁牺牲品时,该应用程序资源的所有者将不会得到先前描述的错误信息。相反,当 sp_getapplock 存储过程在该应用程序资源上执行时,应用程序所有者会获得返回代码"-3"。有关信息,请参见 sp_getapplock。

17. Victim Resource Owner 将 SQL Server 选择的特殊线程指定为中断死锁循环的牺牲品。选中的线程(以 SPID x ECID 0 标识)和所有现有子线程(以 SPID x ECID > 0 标识)将被终止。

下一个分支 表示来自死锁循环中涉及的相同 SPID 的两个或多个子线程。

当死锁涉及到平行线程时,各种子线程可能会在通讯缓冲区发生阻塞,而且一个线程会在等待别的子线程中结束。只有所有的其它线程都涉及死锁,才会发生死锁状态。下一个分支表示跟踪其它路径的死锁链。

根据PAG锁要找到相关数据库表的方法:

DBCC TRACEON (3604) DBCC PAGE (db_id,file_id,page_no) DBCC TRACEOFF (3604)
--------------------- 
作者:Foliole 
来源:CSDN 
原文:https://blog.csdn.net/xiaoye1202/article/details/84062824 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/hzp666/article/details/86611808