文章出處
前些天一個棘手的問題,早上上班剛到公司不久,就發現系統里面出現了大量的查詢超時。
前些天一個棘手的問題,早上上班剛到公司不久,就發現系統里面出現了大量的查詢超時。
一開始以為是某個語句鎖住了,感覺查查,看看系統里面是否有語句死鎖了,,
select 0 , blocked
from ( select * from master..sysprocesses where blocked>0 )a
where not exists( select * from master..sysprocesses where a.blocked =spid and blocked >0)
union select spid ,blocked from master ..sysprocesses where blocked >0
在數據庫執行這個語句,發現沒有死鎖的問題,
系統還一直在超時的錯誤,突然想起來,是不是某個語句阻塞了,導致數據庫其他查詢都被阻塞了。于是趕緊問牛逼的 文佳哥。
給了我一段查詢系統阻塞的sql 語句,
--查看阻塞
SELECT
SPID = er.session_id
,STATUS = ses.STATUS
,[LOGIN] = ses.login_name
,HOST = ses.host_name
,BlkBy = er.blocking_session_id
,DBName = DB_NAME(er.database_id)
,CommandType = er.command
,SQLStatement = st.text
,BlockingText = bst.text
,ObjectName = OBJECT_NAME(st.objectid)
,ElapsedMS = er.total_elapsed_time
,CPUTime = er.cpu_time
,IOReads = er.logical_reads + er.reads
,IOWrites = er.writes
,LastWaitType = er.last_wait_type
,StartTime = er.start_time
,Protocol = con.net_transport
,ConnectionWrites = con.num_writes
,ConnectionReads = con.num_reads
,ClientAddress = con.client_net_address
,Authentication = con.auth_scheme
FROM sys.dm_exec_requests er
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st
LEFT JOIN sys.dm_exec_sessions ses
ON ses.session_id = er.session_id
LEFT JOIN sys.dm_exec_connections con
ON con.session_id = ses.session_id
LEFT JOIN sys.dm_exec_requests ber
ON er.blocking_session_id=ber.session_id
OUTER APPLY sys.dm_exec_sql_text(ber.sql_handle) bst
WHERE er.session_id > 50
ORDER BY er.blocking_session_id DESC,er.session_id
SELECT
SPID = er.session_id
,STATUS = ses.STATUS
,[LOGIN] = ses.login_name
,HOST = ses.host_name
,BlkBy = er.blocking_session_id
,DBName = DB_NAME(er.database_id)
,CommandType = er.command
,SQLStatement = st.text
,BlockingText = bst.text
,ObjectName = OBJECT_NAME(st.objectid)
,ElapsedMS = er.total_elapsed_time
,CPUTime = er.cpu_time
,IOReads = er.logical_reads + er.reads
,IOWrites = er.writes
,LastWaitType = er.last_wait_type
,StartTime = er.start_time
,Protocol = con.net_transport
,ConnectionWrites = con.num_writes
,ConnectionReads = con.num_reads
,ClientAddress = con.client_net_address
,Authentication = con.auth_scheme
FROM sys.dm_exec_requests er
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st
LEFT JOIN sys.dm_exec_sessions ses
ON ses.session_id = er.session_id
LEFT JOIN sys.dm_exec_connections con
ON con.session_id = ses.session_id
LEFT JOIN sys.dm_exec_requests ber
ON er.blocking_session_id=ber.session_id
OUTER APPLY sys.dm_exec_sql_text(ber.sql_handle) bst
WHERE er.session_id > 50
ORDER BY er.blocking_session_id DESC,er.session_id
通過這個語句一查,還真有幾條語句處于阻塞的狀態,一直在等待,但是等待的語句太多,也不知道是因為那個阻塞的,通過阻塞時間,和其他的參數也看不出來,也沒辦只能把所有阻塞的語句都kill 掉。kill SPID
經過一陣折騰,系統總算是恢復正常了。但是還是沒有找到罪魁禍首,沒辦法有加了一些日子,果然,沒過多次時間,又被阻塞了,于是分析相關的日志,終于找到相關的語句了。
不含病毒。www.avast.com |
全站熱搜
留言列表