新单位使用sqlserver数据库的always on集群,当遇到问题的时慌张无法快速定位问题,于是记录下基础的排查思路,方便排查问题;
一、看sqlserver日志:
方法1:sql server management studio中可以查看:
方法2:直接查看错误日志文件
默认情况下,错误日志位于
C:\Program Files\Microsoft SQL Server\MSSQL.版本号\MSSQL\Log\ERRORLOG
二、查看always on的扩展事件:
三、看wsfc日志、wsfc集群事件
1)wsfc运行日志:如下所示可以查看wsfc的日志

2)集群事件:开始--->Windows管理工具--->故障转移集群管理器--->集群事件
四、windows 服务器的运行日志
五、排查锁等待:
该sql可以拿到被锁的,以及产生锁的会话以及sql信息, 其中
blocked=0:表示他没有被别的会话阻塞,
他可能就是持有源头锁的会话;
spid的值:表示本会话的id
kpid的值: Windows 线程 ID。
blocked不等于0: 表示阻塞本会话的会话id,值大于0表示被阻塞, 值为本身进程ID表示io操作。
waittime的值:表示持有锁或者被锁的时间。单位毫秒
SELECT CASE WHEN ST1.text IS NULL THEN ST2.text ELSE SUBSTRING (ST1.text,SR.statement_start_offset/2,(CASE WHEN SR.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), ST1.text)) * 2 ELSE SR.statement_end_offset END - SR.statement_start_offset)/2) END AS [sql_text],SP.loginame,DB_NAME(SP.dbid) AS [db_name],SP.hostname,sp.spid,sp.blocked,sp.waittime FROM SYS.SYSPROCESSES SP LEFT JOIN SYS.DM_EXEC_REQUESTS SR ON SP.spid=SR.session_id LEFT JOIN SYS.DM_EXEC_CONNECTIONS SC ON SP.spid=SC.session_id OUTER APPLY SYS.DM_EXEC_SQL_TEXT(SC.most_recent_sql_handle) AS ST2 OUTER APPLY SYS.DM_EXEC_SQL_TEXT(SR.sql_handle) AS ST1 WHERE SP.spid IN (SELECT BLOCKED FROM SYS.SYSPROCESSES WHERE BLOCKED<>0) AND SP.BLOCKED=0 union all SELECT replace(qr.text,'(@1 varchar(8000),@2 tinyint)',''), s.loginame,DB_NAME(S.dbid) AS [db_name] ,s.hostname,s.spid,s.blocked ,s.waittime FROM SYS.DM_EXEC_REQUESTS qs LEFT JOIN (SELECT spid,blocked ,loginame,dbid,hostname ,waittime FROM SYS.SYSPROCESSES) s ON qs.session_id=s.spid OUTER APPLY SYS.DM_EXEC_SQL_TEXT(qs.sql_handle) AS qr WHERE qs.status = N'suspended';
如下所示:
update liuwenhe set name='liu' where id=3语句阻塞了update liuwenhe set name='liu9' where id=3这个语句;id=65的会话阻塞了id=55的会话;并且阻塞了63毫秒了
紧急处理:
kill持有锁的会话:kill 65
六、慢sql查询,
注意:spend_time表示sql执行时间(单位秒),处于被阻塞的sql也就会被查询出来
select replace(qt.text,'(@1 varchar(8000),@2 tinyint)','') sql_text ,DB_NAME(dbid) db_name,datediff(second,start_time,GETDATE()) spend_time from sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS qt where session_Id > 50 /* Ignore system spids.*/ AND session_Id NOT IN (@@SPID) and start_time