select * from master.dbo.sysprocesses with(nolock)
where blocked <> 0
Vous pouvez aussi utiliser mon script ci-dessous.
Il creer une stored procedure "usp_BlockedProcessTrace" qui log les
"processes" bloqués (depuis un temps x) dans une table
dbo.BlockedProcessTrace, vous devez executer cette stored procedure a
partir d'un SQL Job a un intervalle regulier
(voir deploiement a la fin du script)
Vous pouvez aussi changer facilement la SP usp_BlockedProcessTrace pour
qu'elle log les resultats sur l'ecran au lieu d'une table
--- debut du script
use master -- ou utiliser une autre BD dedié
go
--- 1. create working table
if Object_id('dbo.BlockedProcessTrace') is null
begin
print 'create table dbo.BlockedProcessTrace'
create table dbo.BlockedProcessTrace
(
ID int identity(1,1) not null,
creationdate datetime,
spid smallint,
blocked1 smallint,
blocked2 smallint,
waittime int,
waittype binary,
lastwaittype nchar(32),
waitresource nchar(256),
dbid smallint,
cpu int,
physical_io bigint,
memusage int,
cmd varchar(1000),
loginame nchar(128),
open_tran smallint,
QueryBlocked varchar(255),
QueryBlockedBy1 varchar(255),
QueryBlockedBy2 varchar(255)
)
end
go
--- 2. create stored procedure 'dbo.usp_BlockedProcessTrace
if object_id('dbo.usp_BlockedProcessTrace') is not null
drop proc dbo.usp_BlockedProcessTrace
go
Create Proc dbo.usp_BlockedProcessTrace
(
@WaitTimeInSeconde int
)
as
/*
*********************************************************************
Description : Log blocked processes in dbo.BlockedProcessTrace table
Author : Bouarroudj Mohamed
E-mail :
Date : November 2004
*********************************************************************
*/
set nocount on
---------------------------------------------------------------------
-- Declarations
---------------------------------------------------------------------
declare
@Query varchar(50),
@CurrentDate datetime,
@QueryBlocked varchar(255), -- the Query blocked
@QueryBlockedBy1 varchar(255), -- The Query that blocks the 1st one
@QueryBlockedBy2 varchar(255), -- The Query that blocks the seconde
one, generally NULL
@spid smallint,
@blocked1 smallint,
@blocked2 smallint,
@waittime int,
@waittype binary,
@waitresource nchar(256),
@dbid smallint,
@cpu int,
@cmd varchar(1000),
@loginame nchar(128),
@open_tran smallint,
@lastwaittype nchar(32),
@physical_io bigint,
@memusage int
---------------------------------------------------------------------
-- Initializations
---------------------------------------------------------------------
set @CurrentDate = GetDate()
create table #dbc
(
EventType varchar(15),
Parameters int,
EventInfo varchar(255)
)
if @WaitTimeInSeconde is null
set @WaitTimeInSeconde = 60 * 1000 -- 1 minute
else
set @WaitTimeInSeconde = @WaitTimeInSeconde * 1000 -- convert to ms
---------------------------------------------------------------------
-- Processing
---------------------------------------------------------------------
declare processes_cursor cursor fast_forward
for
select T1.spid, T1.blocked, T1.waittime, T1.waittype, T1.waitresource,
T1.dbid, T1.cpu, T1.cmd, T1.loginame,
T1.open_tran, T1.lastwaittype, T1.physical_io, T1.memusage,
T2.blocked
from master.dbo.sysprocesses T1 with(nolock)
join master.dbo.sysprocesses T2 with(nolock) on T2.spid = t1.blocked
where T1.blocked <> 0
and T1.waittime > @WaitTimeInSeconde
open processes_cursor
fetch next from processes_cursor
into @spid, @blocked1, @waittime, @waittype, @waitresource, @dbid, @cpu,
@cmd, @loginame,
@open_tran, @lastwaittype, @physical_io, @memusage, @blocked2
while (@@fetch_status <> -1)
begin
delete from #dbc
set @Query = 'DBCC INPUTBUFFER(' + Cast(@spid as varchar(10)) + ')'
insert #dbc EXEC(@Query)
select @QueryBlocked = EventInfo from #dbc
set @Query = 'DBCC INPUTBUFFER(' + Cast(@blocked1 as varchar(10)) + ')'
insert #dbc EXEC(@Query)
select @QueryBlockedBy1 = EventInfo from #dbc
if (@blocked2 > 0 and @blocked2 is not null)
begin
set @Query = 'DBCC INPUTBUFFER(' + Cast(@blocked2 as varchar(10)) +
')'
insert #dbc EXEC(@Query)
select @QueryBlockedBy2 = EventInfo from #dbc
end
insert into dbo.BlockedProcessTrace
(
creationdate,
spid,
blocked1,
blocked2,
waittime,
waittype,
lastwaittype,
waitresource,
dbid,
cpu,
physical_io,
memusage,
cmd,
loginame,
open_tran,
QueryBlocked,
QueryBlockedBy1,
QueryBlockedBy2
)
values
(
@CurrentDate,
@spid,
@blocked1,
@blocked2,
@waittime,
@waittype,
@lastwaittype,
@waitresource,
@dbid,
@cpu,
@physical_io,
@memusage,
@cmd,
@loginame,
@open_tran,
@QueryBlocked,
@QueryBlockedBy1,
@QueryBlockedBy2
)
fetch next from processes_cursor
into @spid, @blocked1, @waittime, @waittype, @waitresource, @dbid,
@cpu, @cmd, @loginame,
@open_tran, @lastwaittype, @physical_io, @memusage, @blocked2
end
close processes_cursor
deallocate processes_cursor
go
/*
Deployement : We suggest the creation of SQL Job that run every x minutes
Test :
1. Create SQL Job or run the following script
use master
while 1=1
begin
exec dbo.usp_BlockedProcessTrace @WaitTimeInSeconde = 1
WAITFOR DELAY '00:01:00'
end
2. open new window in Query Analyser and run :
use northwind
begin tran
update dbo.Customers set ContactName = 'M. Maria Anders' where CustomerID
= 'ALFKI'
--commit
3. open new window in Query Analyser and run :
use northwind
begin tran
select * from dbo.Customers
4. the process will be blocked and after 1 minute a new entry is created
in dbo.BlockedProcessTrace table
select * from master.dbo.BlockedProcessTrace
*/
"jbw" wrote in message
news:
Salut,
Je cherche à savoir via une requette si des SPID sont en état
bloqué.
Dans entreprise manager, on voit ça dans
Gestion/ActivitésEnCours/VerrousIdDeProcessus. Ceux qui sont bloqués
apparaissent avec un petit carré ou cadenas rouge.
Par avance, merci.
jbat
select * from master.dbo.sysprocesses with(nolock)
where blocked <> 0
Vous pouvez aussi utiliser mon script ci-dessous.
Il creer une stored procedure "usp_BlockedProcessTrace" qui log les
"processes" bloqués (depuis un temps x) dans une table
dbo.BlockedProcessTrace, vous devez executer cette stored procedure a
partir d'un SQL Job a un intervalle regulier
(voir deploiement a la fin du script)
Vous pouvez aussi changer facilement la SP usp_BlockedProcessTrace pour
qu'elle log les resultats sur l'ecran au lieu d'une table
--- debut du script
use master -- ou utiliser une autre BD dedié
go
--- 1. create working table
if Object_id('dbo.BlockedProcessTrace') is null
begin
print 'create table dbo.BlockedProcessTrace'
create table dbo.BlockedProcessTrace
(
ID int identity(1,1) not null,
creationdate datetime,
spid smallint,
blocked1 smallint,
blocked2 smallint,
waittime int,
waittype binary,
lastwaittype nchar(32),
waitresource nchar(256),
dbid smallint,
cpu int,
physical_io bigint,
memusage int,
cmd varchar(1000),
loginame nchar(128),
open_tran smallint,
QueryBlocked varchar(255),
QueryBlockedBy1 varchar(255),
QueryBlockedBy2 varchar(255)
)
end
go
--- 2. create stored procedure 'dbo.usp_BlockedProcessTrace
if object_id('dbo.usp_BlockedProcessTrace') is not null
drop proc dbo.usp_BlockedProcessTrace
go
Create Proc dbo.usp_BlockedProcessTrace
(
@WaitTimeInSeconde int
)
as
/*
*********************************************************************
Description : Log blocked processes in dbo.BlockedProcessTrace table
Author : Bouarroudj Mohamed
E-mail : mbouarroudj@sqldbtools.com
Date : November 2004
*********************************************************************
*/
set nocount on
---------------------------------------------------------------------
-- Declarations
---------------------------------------------------------------------
declare
@Query varchar(50),
@CurrentDate datetime,
@QueryBlocked varchar(255), -- the Query blocked
@QueryBlockedBy1 varchar(255), -- The Query that blocks the 1st one
@QueryBlockedBy2 varchar(255), -- The Query that blocks the seconde
one, generally NULL
@spid smallint,
@blocked1 smallint,
@blocked2 smallint,
@waittime int,
@waittype binary,
@waitresource nchar(256),
@dbid smallint,
@cpu int,
@cmd varchar(1000),
@loginame nchar(128),
@open_tran smallint,
@lastwaittype nchar(32),
@physical_io bigint,
@memusage int
---------------------------------------------------------------------
-- Initializations
---------------------------------------------------------------------
set @CurrentDate = GetDate()
create table #dbc
(
EventType varchar(15),
Parameters int,
EventInfo varchar(255)
)
if @WaitTimeInSeconde is null
set @WaitTimeInSeconde = 60 * 1000 -- 1 minute
else
set @WaitTimeInSeconde = @WaitTimeInSeconde * 1000 -- convert to ms
---------------------------------------------------------------------
-- Processing
---------------------------------------------------------------------
declare processes_cursor cursor fast_forward
for
select T1.spid, T1.blocked, T1.waittime, T1.waittype, T1.waitresource,
T1.dbid, T1.cpu, T1.cmd, T1.loginame,
T1.open_tran, T1.lastwaittype, T1.physical_io, T1.memusage,
T2.blocked
from master.dbo.sysprocesses T1 with(nolock)
join master.dbo.sysprocesses T2 with(nolock) on T2.spid = t1.blocked
where T1.blocked <> 0
and T1.waittime > @WaitTimeInSeconde
open processes_cursor
fetch next from processes_cursor
into @spid, @blocked1, @waittime, @waittype, @waitresource, @dbid, @cpu,
@cmd, @loginame,
@open_tran, @lastwaittype, @physical_io, @memusage, @blocked2
while (@@fetch_status <> -1)
begin
delete from #dbc
set @Query = 'DBCC INPUTBUFFER(' + Cast(@spid as varchar(10)) + ')'
insert #dbc EXEC(@Query)
select @QueryBlocked = EventInfo from #dbc
set @Query = 'DBCC INPUTBUFFER(' + Cast(@blocked1 as varchar(10)) + ')'
insert #dbc EXEC(@Query)
select @QueryBlockedBy1 = EventInfo from #dbc
if (@blocked2 > 0 and @blocked2 is not null)
begin
set @Query = 'DBCC INPUTBUFFER(' + Cast(@blocked2 as varchar(10)) +
')'
insert #dbc EXEC(@Query)
select @QueryBlockedBy2 = EventInfo from #dbc
end
insert into dbo.BlockedProcessTrace
(
creationdate,
spid,
blocked1,
blocked2,
waittime,
waittype,
lastwaittype,
waitresource,
dbid,
cpu,
physical_io,
memusage,
cmd,
loginame,
open_tran,
QueryBlocked,
QueryBlockedBy1,
QueryBlockedBy2
)
values
(
@CurrentDate,
@spid,
@blocked1,
@blocked2,
@waittime,
@waittype,
@lastwaittype,
@waitresource,
@dbid,
@cpu,
@physical_io,
@memusage,
@cmd,
@loginame,
@open_tran,
@QueryBlocked,
@QueryBlockedBy1,
@QueryBlockedBy2
)
fetch next from processes_cursor
into @spid, @blocked1, @waittime, @waittype, @waitresource, @dbid,
@cpu, @cmd, @loginame,
@open_tran, @lastwaittype, @physical_io, @memusage, @blocked2
end
close processes_cursor
deallocate processes_cursor
go
/*
Deployement : We suggest the creation of SQL Job that run every x minutes
Test :
1. Create SQL Job or run the following script
use master
while 1=1
begin
exec dbo.usp_BlockedProcessTrace @WaitTimeInSeconde = 1
WAITFOR DELAY '00:01:00'
end
2. open new window in Query Analyser and run :
use northwind
begin tran
update dbo.Customers set ContactName = 'M. Maria Anders' where CustomerID
= 'ALFKI'
--commit
3. open new window in Query Analyser and run :
use northwind
begin tran
select * from dbo.Customers
4. the process will be blocked and after 1 minute a new entry is created
in dbo.BlockedProcessTrace table
select * from master.dbo.BlockedProcessTrace
*/
"jbw" <jean-baptiste.watremez@jci.com> wrote in message
news:1126703048.608653.233300@g47g2000cwa.googlegroups.com...
Salut,
Je cherche à savoir via une requette si des SPID sont en état
bloqué.
Dans entreprise manager, on voit ça dans
Gestion/ActivitésEnCours/VerrousIdDeProcessus. Ceux qui sont bloqués
apparaissent avec un petit carré ou cadenas rouge.
Par avance, merci.
jbat
select * from master.dbo.sysprocesses with(nolock)
where blocked <> 0
Vous pouvez aussi utiliser mon script ci-dessous.
Il creer une stored procedure "usp_BlockedProcessTrace" qui log les
"processes" bloqués (depuis un temps x) dans une table
dbo.BlockedProcessTrace, vous devez executer cette stored procedure a
partir d'un SQL Job a un intervalle regulier
(voir deploiement a la fin du script)
Vous pouvez aussi changer facilement la SP usp_BlockedProcessTrace pour
qu'elle log les resultats sur l'ecran au lieu d'une table
--- debut du script
use master -- ou utiliser une autre BD dedié
go
--- 1. create working table
if Object_id('dbo.BlockedProcessTrace') is null
begin
print 'create table dbo.BlockedProcessTrace'
create table dbo.BlockedProcessTrace
(
ID int identity(1,1) not null,
creationdate datetime,
spid smallint,
blocked1 smallint,
blocked2 smallint,
waittime int,
waittype binary,
lastwaittype nchar(32),
waitresource nchar(256),
dbid smallint,
cpu int,
physical_io bigint,
memusage int,
cmd varchar(1000),
loginame nchar(128),
open_tran smallint,
QueryBlocked varchar(255),
QueryBlockedBy1 varchar(255),
QueryBlockedBy2 varchar(255)
)
end
go
--- 2. create stored procedure 'dbo.usp_BlockedProcessTrace
if object_id('dbo.usp_BlockedProcessTrace') is not null
drop proc dbo.usp_BlockedProcessTrace
go
Create Proc dbo.usp_BlockedProcessTrace
(
@WaitTimeInSeconde int
)
as
/*
*********************************************************************
Description : Log blocked processes in dbo.BlockedProcessTrace table
Author : Bouarroudj Mohamed
E-mail :
Date : November 2004
*********************************************************************
*/
set nocount on
---------------------------------------------------------------------
-- Declarations
---------------------------------------------------------------------
declare
@Query varchar(50),
@CurrentDate datetime,
@QueryBlocked varchar(255), -- the Query blocked
@QueryBlockedBy1 varchar(255), -- The Query that blocks the 1st one
@QueryBlockedBy2 varchar(255), -- The Query that blocks the seconde
one, generally NULL
@spid smallint,
@blocked1 smallint,
@blocked2 smallint,
@waittime int,
@waittype binary,
@waitresource nchar(256),
@dbid smallint,
@cpu int,
@cmd varchar(1000),
@loginame nchar(128),
@open_tran smallint,
@lastwaittype nchar(32),
@physical_io bigint,
@memusage int
---------------------------------------------------------------------
-- Initializations
---------------------------------------------------------------------
set @CurrentDate = GetDate()
create table #dbc
(
EventType varchar(15),
Parameters int,
EventInfo varchar(255)
)
if @WaitTimeInSeconde is null
set @WaitTimeInSeconde = 60 * 1000 -- 1 minute
else
set @WaitTimeInSeconde = @WaitTimeInSeconde * 1000 -- convert to ms
---------------------------------------------------------------------
-- Processing
---------------------------------------------------------------------
declare processes_cursor cursor fast_forward
for
select T1.spid, T1.blocked, T1.waittime, T1.waittype, T1.waitresource,
T1.dbid, T1.cpu, T1.cmd, T1.loginame,
T1.open_tran, T1.lastwaittype, T1.physical_io, T1.memusage,
T2.blocked
from master.dbo.sysprocesses T1 with(nolock)
join master.dbo.sysprocesses T2 with(nolock) on T2.spid = t1.blocked
where T1.blocked <> 0
and T1.waittime > @WaitTimeInSeconde
open processes_cursor
fetch next from processes_cursor
into @spid, @blocked1, @waittime, @waittype, @waitresource, @dbid, @cpu,
@cmd, @loginame,
@open_tran, @lastwaittype, @physical_io, @memusage, @blocked2
while (@@fetch_status <> -1)
begin
delete from #dbc
set @Query = 'DBCC INPUTBUFFER(' + Cast(@spid as varchar(10)) + ')'
insert #dbc EXEC(@Query)
select @QueryBlocked = EventInfo from #dbc
set @Query = 'DBCC INPUTBUFFER(' + Cast(@blocked1 as varchar(10)) + ')'
insert #dbc EXEC(@Query)
select @QueryBlockedBy1 = EventInfo from #dbc
if (@blocked2 > 0 and @blocked2 is not null)
begin
set @Query = 'DBCC INPUTBUFFER(' + Cast(@blocked2 as varchar(10)) +
')'
insert #dbc EXEC(@Query)
select @QueryBlockedBy2 = EventInfo from #dbc
end
insert into dbo.BlockedProcessTrace
(
creationdate,
spid,
blocked1,
blocked2,
waittime,
waittype,
lastwaittype,
waitresource,
dbid,
cpu,
physical_io,
memusage,
cmd,
loginame,
open_tran,
QueryBlocked,
QueryBlockedBy1,
QueryBlockedBy2
)
values
(
@CurrentDate,
@spid,
@blocked1,
@blocked2,
@waittime,
@waittype,
@lastwaittype,
@waitresource,
@dbid,
@cpu,
@physical_io,
@memusage,
@cmd,
@loginame,
@open_tran,
@QueryBlocked,
@QueryBlockedBy1,
@QueryBlockedBy2
)
fetch next from processes_cursor
into @spid, @blocked1, @waittime, @waittype, @waitresource, @dbid,
@cpu, @cmd, @loginame,
@open_tran, @lastwaittype, @physical_io, @memusage, @blocked2
end
close processes_cursor
deallocate processes_cursor
go
/*
Deployement : We suggest the creation of SQL Job that run every x minutes
Test :
1. Create SQL Job or run the following script
use master
while 1=1
begin
exec dbo.usp_BlockedProcessTrace @WaitTimeInSeconde = 1
WAITFOR DELAY '00:01:00'
end
2. open new window in Query Analyser and run :
use northwind
begin tran
update dbo.Customers set ContactName = 'M. Maria Anders' where CustomerID
= 'ALFKI'
--commit
3. open new window in Query Analyser and run :
use northwind
begin tran
select * from dbo.Customers
4. the process will be blocked and after 1 minute a new entry is created
in dbo.BlockedProcessTrace table
select * from master.dbo.BlockedProcessTrace
*/
"jbw" wrote in message
news:
Salut,
Je cherche à savoir via une requette si des SPID sont en état
bloqué.
Dans entreprise manager, on voit ça dans
Gestion/ActivitésEnCours/VerrousIdDeProcessus. Ceux qui sont bloqués
apparaissent avec un petit carré ou cadenas rouge.
Par avance, merci.
jbat
Par contre, pour combler ma curiosité, si tu voulais (toi ou un autre)
bien m'expliquer comment ce script en arrive à ses fins, je t'en serai
reconnaissant. En effet, quand je le lis, dès le cinquième mot, je
commence progressivement à perdre pied...
Mes questions :
-Pourquoi en "with nolock" ?
-Pourquoi "where spid >10" ?
-Si "blocked <> 0" Alors pourquoi "case blocked whene 0 then..." ?
Juste pour m'éclairer, si vous pouviez me corriger et/ou me
compléter...
Par contre, pour combler ma curiosité, si tu voulais (toi ou un autre)
bien m'expliquer comment ce script en arrive à ses fins, je t'en serai
reconnaissant. En effet, quand je le lis, dès le cinquième mot, je
commence progressivement à perdre pied...
Mes questions :
-Pourquoi en "with nolock" ?
-Pourquoi "where spid >10" ?
-Si "blocked <> 0" Alors pourquoi "case blocked whene 0 then..." ?
Juste pour m'éclairer, si vous pouviez me corriger et/ou me
compléter...
Par contre, pour combler ma curiosité, si tu voulais (toi ou un autre)
bien m'expliquer comment ce script en arrive à ses fins, je t'en serai
reconnaissant. En effet, quand je le lis, dès le cinquième mot, je
commence progressivement à perdre pied...
Mes questions :
-Pourquoi en "with nolock" ?
-Pourquoi "where spid >10" ?
-Si "blocked <> 0" Alors pourquoi "case blocked whene 0 then..." ?
Juste pour m'éclairer, si vous pouviez me corriger et/ou me
compléter...
"jbw" wrote in message
news:
Re-salut,
Tu peux connaître différent temps :
use master
select spid,
case blocked when 0 then 'blocking' else 'blocked' end as status ,
datediff(second,login_time, getdate()) as ConnectedSeconds ,
[waittime],
[lastwaittype]
from sysprocesses with (nolock) where spid > 10
and ( blocked <> 0 or spid in (select blocked from sysprocesses with
(nolock) where blocked <> 0) ) order by blocked
Et évaluer ce qu'il faut faire, attention je pense que le waittime est en
ms.
Sinon la solution de Mohamed semble bonne aussi.
Pascal
"jbw" <jean-baptiste.watremez@jci.com> wrote in message
news:1126796804.650120.193580@g14g2000cwa.googlegroups.com...
Re-salut,
Tu peux connaître différent temps :
use master
select spid,
case blocked when 0 then 'blocking' else 'blocked' end as status ,
datediff(second,login_time, getdate()) as ConnectedSeconds ,
[waittime],
[lastwaittype]
from sysprocesses with (nolock) where spid > 10
and ( blocked <> 0 or spid in (select blocked from sysprocesses with
(nolock) where blocked <> 0) ) order by blocked
Et évaluer ce qu'il faut faire, attention je pense que le waittime est en
ms.
Sinon la solution de Mohamed semble bonne aussi.
Pascal
"jbw" wrote in message
news:
Re-salut,
Tu peux connaître différent temps :
use master
select spid,
case blocked when 0 then 'blocking' else 'blocked' end as status ,
datediff(second,login_time, getdate()) as ConnectedSeconds ,
[waittime],
[lastwaittype]
from sysprocesses with (nolock) where spid > 10
and ( blocked <> 0 or spid in (select blocked from sysprocesses with
(nolock) where blocked <> 0) ) order by blocked
Et évaluer ce qu'il faut faire, attention je pense que le waittime est en
ms.
Sinon la solution de Mohamed semble bonne aussi.
Pascal