zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

SQLSERVER 数据库根据LCK_M_S对应的waitsorce 查看被锁的表信息的简单方法

SQLServer数据库方法 简单 查看 信息 根据 对应
2023-09-27 14:24:15 时间

公司一个开发大牛召冠总搞过一个 DMSQLMONITOR 工具 能够识别Oracle以及SQLSERVER 数据库的锁和事务等问题, 非常好用 

今天环境出现了不可用的情况, 所以这边着急进行一下问题分析, 使用这个工具进行了跟踪, 但是跟踪出来之后发现自己搞不太明白 查看哪些资源是被锁的..

工具的现象如下, 工具比较好用 可以导出到 excel 

 

 根据图 会发现有很多 锁的内容, 并且等待时间非常长..

但是工具查询出来的是RID 的信息 没有表 也没有 sql信息. 

没办法 自己学习一下是数据库相关的知识 (越学越发现自己的数据库能力简直就是垃圾)

然后一翻瞎百度, 找到一个网站资源不错 

https://my.oschina.net/u/4355973/blog/3609875

找到一个 waitsource 的定义 这里面 抄录如下:

在调查阻塞或死锁时,你可能很想知道阻塞的等待资源(wait_resource)是什么,通常等待资源的类型是Page、Key和RID,它们的格式分别是:

waitresource="PAGE: 6:3:70133 "
waitresource="KEY: 6:72057594041991168 (ce52f92a058c)"
waitresource="RID: 6:15:11695844:3"

从等待资源的格式中可以看出,不同类型的等待资源,其资源描述符是不同的,通过资源描述符的各个成分,可以探测到阻塞发生的时候,竞争的临界资源到底是什么。

一,等待资源PAGE
对于等待资源是PAGE的情况,PAGE的格式是 Database_Id : File_Id : PageNumber,如下所示:

waitresource=“PAGE: 6:3:70133 ” = Database_Id : FileId : PageNumber

二,等待资源Key
对于等待的资源是Key的情况,该阻塞发生在聚集索引上,Key资源的格式是 database_id, hobt_id (Magic Hash),其中 Magic Hash的某一个数据行的哈希值:

 waitresource=“KEY: 6:72057594041991168 (ce52f92a058c)” = Database_Id, HOBT_Id ( Magic Hash )

三,等待资源RID
对于等待资源是RID的情况,阻塞发生在heap上,也就是说,RID等待只会发生在没有创建聚集索引的表上,RID等待资源各描述符的含义如下:

waitresource="RID: 6:15:11695844:3"= Databae_Id:File_Id:Page_Id:Slot_No

但是只有给 RID 没有 具体的信息 继续瞎百度..

https://www.cnblogs.com/Amaranthus/archive/2011/05/03/2035497.html

里面有一个比较好用的说明 

dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])

The printopt parameter has the following meanings:

0 - print just the page header
1 - page header plus per-row hex dumps and a dump of the page slot array (unless its a page that doesn't have one, like allocation bitmaps)
2 - page header plus whole page hex dump
3 - page header plus detailed per-row interpretation
=========================
dbcc traceon(3604)
dbcc page(northwind,1,100,1)

根据这个例子能够简单的学习一下. 当然了 我比较懒 只是用了一小部分

学习和操作如下:

注意 需要使用 sa 用户

第一步执行 dbcc traceon 设置trace打开

第二步 执行 dbcc page 具体的内容 注意可以使用id 不用非得使用名字. 

 

 

第三步 查看 sqlserver的系统表 查看表名.

注意一点 得使用 具体的业务数据库进行查询 sa 是查询不出来. 

 

 

就能够查询出具体的表来了.