SQL Block的初级排查
使用下面的语句来找到被block的session.
select a.blocking_session_id, * from sys.dm_exec_requests a where a.blocking_session_id <> 0
使用下面的语句来找出阻塞其他session的session, 即阻塞其他人, 但自己没被阻塞.
select kpid, * from sys.sysprocesses where spid in (select blocked from sys.sysprocesses) and blocked = 0
如果通过上面的语句你拿到了session的SPID, 那么你可以通过下面的语句得到这个session当下正在做的事. 其中125是session的SPID.
DBCC INPUTBUFFER(125)
使用下面的语句来找到该session所对应的客户端的信息, 比如说机器名, IP, 端口.
select a.host_process_id, a.host_name, a.client_interface_name, a.login_name, b.wait_type, b.wait_time, c.client_net_address, c.client_tcp_port from sys.dm_exec_sessions a, sys.dm_exec_requests b, sys.dm_exec_connections c where a.session_id = b.session_id and b.session_id = c.session_id and a.session_id = 108
一些简单的基础知识.
sys.sysprocesses | 这个系统视图包含SQL实例中的各项操作(processes)的信息. 这些操作可以是系统操作也可以是客户端操作. |
DBCC INPUTBUFFER (session_id) | 显示从客户端发送到 Microsoft SQL Server 实例的最后一个语句 |
sys.dm_exec_sessions | 该以服务器为范围的视图视图显示所有活动用户的数据库连接还有内部的任务. 信息包括客户端版本, 客户端程序名, 登录时间, 登录用户等等. 可以首先使用这个视图来查看当前系统的负载, 以及发现感兴趣的session, 之后再用其他的动态管理视图或动态管理函数来获取该session的更多信息. |
sys.dm_exec_requests | 返回有关在 SQL Server 中执行的每个请求的信息 |
sys.dm_exec_connections | 返回该数据库实例上的连接以及每个连接的具体信息. |
参考资料
====================
sys.sysprocesses
http://msdn.microsoft.com/en-us/library/ms179881.aspx
DBCC INPUTBUFFER
http://technet.microsoft.com/zh-cn/library/ms187730.aspx
sys.dm_exec_sessions
http://msdn.microsoft.com/en-us/library/ms176013.aspx
sys.dm_exec_requests
http://msdn.microsoft.com/zh-cn/library/ms177648.aspx
sys.dm_exec_connections