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


    公司一个开发大牛召冠总搞过一个 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 是查询不出来. 

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

  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/14431884.html
Copyright © 2020-2023  润新知