由于IMS短时间内还无法脱离SQLServer,仍有有可能因为数据库阻塞导致业务异常,通常该情况都比较紧急,在出现阻塞时需要各位第一时间协助排查出阻塞事务并通过sqle平台提交kill脚本执行申请。
处理时请注意,主库、从库都有可能阻塞,需要分别检查一下:
主库数据源:BOH2GIMSDB_SYSTEM
从库数据源:BOH2GIMSDB_SYSTEM_SLAVE
阻塞查询脚本有两个:
- 阻塞会话查询脚本
- 查看后台任务脚本
阻塞查询步骤:
-
执行阻塞事务查询脚本,根据bID字段查看是否有大量会话被阻塞在某个
session_id上 -
查看阻塞的
session_id本身是不是还被阻塞在其他session_id上,一路溯源,直到:1. bID为空;2. 或bID是个比较小的数,且在结果集中不存在- 情况一:bID为空,说明本条会话就是罪魁祸首,记录下这条会话的session_id;
- 情况二:bID是个比较小的数,且在结果集中不存在,说明本条会话被主从同步阻塞了。此时需要执行“sp_who2”查看后台任务脚本,找到SPID=bID的那条任务,记录BlkBy,然后再用“阻塞会话查询”脚本查询并找到session_id=BlkBy的会话,通常该会话就是引起阻塞的罪魁祸首,记录下这条会话的session_id;
-
在sqle上提交
“kill {session_id};”脚本,找古力、钮师傅、红军执行
阻塞sql查询脚本如下:
-- 阻塞会话查询
SELECT
(select max(hostname) from master..sysprocesses where spid=[session_id]) as hostname,
(select max(cpu) from master..sysprocesses where spid=[session_id]) as cpu,
[session_id],
--[request_id],
[start_time] AS '开始时间',
DATEDIFF ( second , [start_time], getdate() ) hs,
[status] AS '状态',
[command] AS '命令',
DB_NAME([database_id]) AS 'DB',
[blocking_session_id] AS 'bID',
[wait_time] AS '等待时间',
dest.[text] AS 'sql语句',
[wait_type] AS '等待资源类型',
[wait_resource] AS '等待的资源',
[reads] AS '物理读次数',
[writes] AS '写次数',
[logical_reads] AS '逻辑读次数',
[row_count] AS '返回结果行数'
FROM sys.[dm_exec_requests] AS der CROSS APPLY sys.dm_exec_sql_text AS dest
--where DB_NAME([database_id]) ='BOH2G_RSC_WORK_BOH'
--and dest.[text] like '%fnd_t_operation_log%'
--where [blocking_session_id]<>0
--and DB_NAME([database_id]) ='BOH2G_RSC_WORK_BOH'
order by DATEDIFF ( second , [start_time], getdate() ) desc,[wait_time] desc
-- 查看后台任务
sp_who2
-- kill脚本
kill {session_id};