SQLServer通过DMV实现低影响的自动监控和历史场景追溯 (九)

2014-11-24 01:42:01 · 作者: · 浏览: 35
_time, C.last_read, C.last_write,
C.net_transport, C.client_net_address, C.client_tcp_port, C.local_tcp_port,
R.start_time, R.wait_time, R.wait_type, R.last_wait_type, R.wait_resource,
R.open_transaction_count,GETDATE()
FROMsys.dm_exec_sessions S
LEFTJOINsys.dm_exec_connections C
ONS.session_id =C.session_id
LEFTJOINsys.dm_exec_requests R
ONS.session_id =R.session_id
ANDC.connection_id =R.connection_id
OUTERAPPLY sys.dm_exec_sql_text(R.sql_handle) T
WHERE S.is_user_process =1 -- 如果不限制此条件,则查询所有进程(系统和用户进程)
ANDcommand isnotnull


--记录当前阻塞信息
insertintodc_info_BlockedInfo
select@banch_id,t1.resource_type as[lock type],db_name(resource_database_id) as[database]
,t1.resource_associated_entity_id as[blk object]
,t1.request_mode as[lock req] -- lock requested
,t1.request_session_id as[waiter sid] -- spid of waiter
,t2.wait_duration_ms as[wait time]
,(selecttextfromsys.dm_exec_requests asr --- get sql for waiter
crossapply sys.dm_exec_sql_text(r.sql_handle)
wherer.session_id =t1.request_session_id) aswaiter_batch
,(selectsubstring(qt.text,r.statement_start_offset/2,
(casewhenr.statement_end_offset =-1thenlen(convert(nvarchar(max), qt.text)) *2
elser.statement_end_offset end-r.statement_start_offset)/2)
fromsys.dm_exec_requests asr
crossapply sys.dm_exec_sql_text(r.sql_handle) asqt
wherer.session_id =t1.request_session_id) aswaiter_stmt --- statement executing now
,t2.blocking_session_id as[blocker sid] --- spid of blocker
,(selecttextfromsys.sysprocesses asp --- get sql for blocker
crossapply sys.dm_exec_sql_text(p.sql_handle)
wherep.spid =t2.blocking_session_id) asblocker_stmt,getdate()
fromsys.dm_tran_locks ast1, sys.dm_os_waiting_tasks ast2
wheret1.lock_owner_address =t2.resource_address


--记录资源信息
insertintodc_Blocked_Resource_Info
select convert(smallint, req_spid) Asspid,
rsc_dbid Asdbid,
rsc_objid AsObjId,
rsc_indid AsIndId,
substring(v.name, 1, 4) AsType,
substring(rsc_text, 1, 32) asResource,
substring(u.name, 1, 8) AsMode,
substring(x.name, 1, 5) AsStatus ,@banch_id
from master.dbo.syslockinfo,
master.dbo.spt_values v,
master.dbo.spt_values x,
master.dbo.spt_values u
where master.dbo.syslockinfo.rsc_type =v.number
andv.type ='LR'
andmaster.dbo.syslockinfo.req_status =x.number
andx.type ='LS'
andmaster.dbo.syslockinfo.req_mode +1=u.number
andu.type ='L'
andsubstring(x.name, 1, 5) ='WAIT'
orderbyspid

execusp_blocker_info @banch_id

end

GO

3. 创建信息收集和邮件报警的SP:

说明:

SP定义了一个邮件发送的过程,需要先配置好数据库的邮件发送(google一下很多的);

SP需要做到JOB里面,一分钟运行一次收集信息;

SP收集信息时的条件(不同的系统触发条件不一样):

a. 用户链接数大于550,活动链接数大于40;

b. 阻塞进程比率大于10%;

USE[master]
GO
--创建触发监控条件,并发邮件
CREATEproc[dbo].[ConAlert]
as
begin
DECLARE@connfloat,@activeconnfloat,@blockedcountfloat,@spidcountfloat,@spidblockedfloat,@countint
DECLARE@bodyNVARCHAR(MAX),@subject nvarchar(200)

-- User Connections
Select@