最近公司数据库同步机制常发生阻塞, 时不时的导致 PCB 工程系统卡死现象, 只有找到阻塞源头并处理掉, 才以消除阻塞, 但数据库中查看会话阻塞是通过二维表方式展示的父子会话进程 ID 的, 是很难清楚的展示各会话进程 ID 的关系图的.
举例: 这好比公路上的汽车我们开车前行, 遇到前方塞车了, 前方的车阻塞你, 但后方又继续来车, 你也成为后方的车阻塞者.
如果能以思维导图的方式展示那不完美了, 我们可以通过此图可很快的找找到阻焊塞的源头, 只要把源头打通, 道路才能保持畅通.
一. 阻塞查询相关 SQL 语句
查询当前数据库阻塞:
select * from sys.sysprocesses where blocked<>0
查询阻塞的会话在执行的 SQL 以及运行状态:
select * from sys.sysprocesses where spid=197
查询阻塞会话执行所有 DB 库
select * from sys.sysdatabases WHERE dbid = 7
通过 sql_handle 句柄来查询正在跑的 SQL 的 SQL_TEXT 文本内容, 即 SQL 内容:
SELECT * FROM ::FN_GET_SQL(0x0300FF7F587A2F063508ED005E9B000001000000)
删除进程会话 ID
KILL 197
二. 阻塞进程思维导图 ---- 展示效果
通过如图展示, 非常清楚的知道阻塞进程源头来自哪个进程号了 [源头: 会话进程 ID 536 导致整个数据库阻塞]
三. html 实现代码
HTML 实现代码:(用百度他们家的 echar 套用数据即可实现)
http://pcbren.cn/DB_BlockedView.html
四. 阻塞进程数据源
通过此 SQL 取出 2 部份数据
1.EChart nodes 节点数据
2.EChart links 关连关系数据
-- 查询当前数据库阻塞进程插入临时表
select * INTO #sysprocesses FROM sys.sysprocesses where blocked<>0
-- 获取进程节点 [数据给到 EChart nodes]
-- 将数据按 3 个等级分类, 按实例图展示效果
- SELECT
- '{category:'+ (CASE WHEN PerentCount = 0 THEN '0' WHEN ChildCount> 0 THEN '1' ELSE '2' END) +', name:'''+ CAST(spid AS VARCHAR(1000))
- +''', value :'+ (CASE WHEN PerentCount = 0 THEN '3' WHEN ChildCount> 0 THEN '2' ELSE '1' END) + '},'
- FROM
- (
- SELECT
- (SELECT COUNT(1) FROM #sysprocesses WHERE blocked = t.spid) ChildCount
- ,(SELECT COUNT(1) FROM #sysprocesses WHERE spid = t.spid) PerentCount
- ,spid
- FROM
- (
- SELECT spid spid
- FROM #sysprocesses
- UNION ALL
- SELECT blocked spid
- FROM #sysprocesses
- ) t
- GROUP BY spid
- ) t
-- 获取节点之前的关连关系 [数据给到 EChart links]
- SELECT '{source :'''+ CAST(spid AS VARCHAR(1000)) +''', target :'''+ CAST(blocked AS VARCHAR(1000))+''', weight : 1},'
- FROM #sysprocesses
- drop table #sysprocesses
来源: https://www.cnblogs.com/pcbren/p/11210887.html