Como monitorar o bloqueio no SQL Server 2005 e no 2000 de SQL Server

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 271509
Sumário
Se você estiver usando o Microsoft SQL Server 2000, você deve aplicar o SQL Server 2000 Services Pack 3a (SP3a) antes de usar o script que é descrito neste artigo.

Para obter mais informações sobre como obter o SQL Server 2000 Service Pack 3a, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
290211Como obter o service pack mais recente do SQL Server 2000
Este artigo é uma atualização para o SQL Server 2000 ou versões posteriores do SQL Server de o seguinte artigo da Base de dados de Conhecimento da Microsoft, que se aplica ao Microsoft SQL Server 7.0:
251004 Como monitorar o bloqueio de SQL Server 7.0
Este artigo documenta o uso e o design de um procedimento armazenado que você pode usar para diagnosticar problemas de desempenho e de bloqueio. Para obter uma descrição de como entender e resolver o bloqueio, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
224453 Compreendendo e Solucionando problemas de bloqueio de 2000 ou 7.0 do SQL Server
No Microsoft SQL Server 2005, você também pode usar a classe de evento de Relatório de processo bloqueado no SQL Server Profiler para capturar informações sobre uma tarefa que foi bloqueada por mais de um período de tempo especificado.

Para obter mais informações sobre a classe de evento de Relatório de processo bloqueado , visite o seguinte site da Microsoft Developer Network (MSDN):
Mais Informação
A seguinte descrição do procedimento armazenado de sp_blocker_pss08 captura essas informações. Essas informações também se aplica ao SQL Server 2005.
  • A hora de início (de acordo com o computador é executando SQL Server) para que esta amostragem de bloqueio pode ser tempo alinhado outras informações de desempenho, como um desempenho de Windows NT da Microsoft Monitorar o log ou um log de SQL Profiler.
  • Informações sobre conexões de SQL Server, consultando a tabela de processos do sistema.
  • Informações sobre recursos de bloqueio, consultando a tabela de sistema syslockinfo .
  • Informações sobre o recurso de espera, executando DBCC SQLPERF (WAITSTATS).
  • Atual executando SQL Server lote para conexões são bloqueados por outros usuários ou bloqueando outros, executando o DBCC INPUTBUFFER instrução.
  • A hora de término, de acordo com o computador que está executando SQL Server.
O procedimento armazenado foi criado com o seguinte otimizações para reduzir o efeito no desempenho e bloqueio executando isso procedimento armazenado:
  • Não há nenhuma saída gerada, a menos que pelo menos uma conexão está aguardando um recurso.
  • Processos e syslockinfo tabelas de sistema do banco de dados mestre são consultadas diretamente, para aumentar o desempenho e impedi que esse procedimento armazenado bloqueadas. Portanto, isso armazenado procedimento é específico para Microsoft SQL Server 2000 ou versões posteriores do SQL Server.
  • Uma pequena tabela de trabalho é criada pelo cursor para obter o Saída do DBCC INPUTBUFFER; Isso deve ter nenhum efeito perceptível no uso do banco de dados tempdb .
  • Porque o bloqueio pode mudar durante a coleta de informações, existe um modo rápido, que aumenta o desempenho diminuindo o resultados relevantes linhas de tabelas de sistema processos e syslockinfo .
  • Se tentar controlar o recurso de bloqueio não aguarda, um modo de trava existe, que faz com que o bloqueio de saída que serão omitidos.
Esse procedimento é útil executando qualquer consulta ferramenta. No entanto, a Microsoft sugere que você siga estas etapas para executar análise de bloqueio:
  1. Criar sp_blocker_pss08de procedimento armazenado, que está incluído no final deste artigo, a partir de qualquer consulta ferramenta enquanto você estiver conectado com uma conta que tenha privilégios sysadmin no servidor de SQL Server ou a instância de SQL Server você planeja monitorar.
  2. Criar um arquivo de script com a consulta a seguir para executar o procedimento armazenado em um loop. Observe que o atraso deve ser entre 5 e 60
    segundos:

    WHILE 1=1
    BEGIN
    Tempdb.dbo.sp_blocker_pss08 EXEC
    -- Ou para o modo rápido
    -EXEC tempdb.dbo.sp_blocker_pss08 @fast = 1
    -- Ou para o modo de trava
    -EXEC tempdb.dbo.sp_blocker_pss08 @latch=1
    WAITFOR DELAY ' 00:00:15'
    END
    GO
  3. Essa saída é muito útil quando combinado com a Microsoft Log do Monitor de desempenho de Windows NT e um log SQL Profiler, criando assim, ambos ao mesmo tempo é sugerido. Para obter informações sobre qual Profiler e Eventos do Monitor de desempenho para capturar e para obter informações sobre como interpretar os resultados, consulte o seguinte artigo na Microsoft Knowledge Base:
    224453Compreendendo e Solucionando problemas de bloqueio de 2000 ou 7.0 do SQL Server
  4. Execute o arquivo de script criado na etapa 2 do ISQL, a ferramenta de consulta osql. exe ou o utilitário Sqlcmd em um prompt de comando do Windows no computador que está executando o SQL Server para o qual você pretende monitorar para impedir que problemas de rede desconectando a ferramenta de consulta. A seguir está uma linha de comando de exemplo que você pode usar para iniciar osql. exe, que pressupõe que o cliente é executado no computador que está executando o SQL Server, e que o nome do arquivo de script é Checkblk.sql. Certifique-se de corrigir o parâmetro -S e substitua "server" com o nome do seu servidor de SQL Server (ou "servername\instance") se você estiver monitorando uma instância nomeada. Também corrigir -i parâmetro e substituir "checkblk.sql" com o nome e caminho do arquivo de script criado na etapa 2.
    osql -E -Sserver -icheckblk.sql -ocheckblk.out -w2000
    Observe que você deve usar as outras opções de linha de comando para o seguintes razões:

    • Para evitar a quebra de linha na saída de arquivos que facilita a leitura.
    • Para enviar a saída para um arquivo especificado com -o parâmetro, ao invés da tela, de modo que, se a ferramenta de consulta tem problemas, você ainda tem saída até que a ferramenta de consulta falha.
A seguir está o script para criar o procedimento armazenado de sp_blocker_pss08 :
/*Note: This script is meant to have 3 creations of the same stored procedure and two of them will failwith either 207 errors or a 2714 error.*/use masterGOif exists (select * from sysobjects where id = object_id('dbo.sp_blocker_pss08') and sysstat & 0xf = 4)   drop procedure dbo.sp_blocker_pss08GOcreate procedure dbo.sp_blocker_pss08 (@latch int = 1, @fast int = 1, @appname sysname='PSSDIAG')as --version 19.2005 - 2005 or Laterif is_member('sysadmin')=0 begin  print 'Must be a member of the sysadmin group in order to run this procedure'  returnendset nocount onSET LANGUAGE 'us_english'declare @spid varchar(6)declare @blocked varchar(6)declare @time datetimedeclare @time2 datetimedeclare @dbname nvarchar(128)declare @status sql_variantdeclare @useraccess sql_variantdeclare @request varchar(12)set @time = getdate()declare @probclients table(spid smallint, request_id int, ecid smallint, blocked smallint, waittype binary(2), dbid smallint,   ignore_app tinyint, primary key (blocked, spid, request_id, ecid))insert @probclients select spid, request_id, ecid, blocked, waittype, dbid,   case when convert(varchar(128),hostname) = @appname then 1 else 0 end   from master.dbo.sysprocesses where blocked!=0 or waittype != 0x0000if exists (select spid from @probclients where ignore_app != 1)begin   set @time2 = getdate()   print ''   print '9.0 Start time: ' + convert(varchar(26), @time, 121) + ' ' + convert(varchar(12), datediff(ms,@time,@time2)) + ' 19.2005 '+ltrim(str(@latch))+' '+ltrim(str(@fast))    insert @probclients select distinct blocked, 0, 0, 0, 0x0000, 0, 0 from @probclients      where blocked not in (select spid from @probclients) and blocked != 0   if (@fast = 1)   begin      print ''      print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)      select spid, status, blocked, open_tran, waitresource, waittype,          waittime, cmd, lastwaittype, cpu, physical_io,         memusage, last_batch=convert(varchar(26), last_batch,121),         login_time=convert(varchar(26), login_time,121),net_address,         net_library, dbid, ecid, kpid, hostname, hostprocess,         loginame, program_name, nt_domain, nt_username, uid, sid,         sql_handle, stmt_start, stmt_end, request_id      from master.dbo.sysprocesses      where blocked!=0 or waittype != 0x0000         or spid in (select blocked from @probclients where blocked != 0)         or spid in (select spid from @probclients where blocked != 0)      print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate()))       print ''      print 'SYSPROC FIRST PASS'      select spid, request_id, ecid, waittype from @probclients where waittype != 0x0000      if exists(select blocked from @probclients where blocked != 0)      begin         print 'Blocking via locks at ' + convert(varchar(26), @time, 121)         print ''         print 'SPIDs at the head of blocking chains'         select distinct spid from @probclients -- change: added distinct            where blocked = 0 and spid in (select blocked from @probclients where spid != 0)         if @latch = 0 and exists (select spid from @probclients where waittype between 0x0001 and 0x0017) -- Change: exists         begin            print 'SYSLOCKINFO'            select @time2 = getdate()            select spid = convert (smallint, req_spid),               ecid = convert (smallint, req_ecid),               rsc_dbid As dbid,               rsc_objid As ObjId,               rsc_indid As IndId,               Type = case rsc_type when 1 then 'NUL'                                    when 2 then 'DB'                                    when 3 then 'FIL'                                    when 4 then 'IDX'                                    when 5 then 'TAB'                                    when 6 then 'PAG'                                    when 7 then 'KEY'                                    when 8 then 'EXT'                                    when 9 then 'RID'                                    when 10 then 'APP' end,               Resource = substring (rsc_text, 1, 16),               Mode = case req_mode + 1 when 1 then NULL                                        when 2 then 'Sch-S'                                        when 3 then 'Sch-M'                                        when 4 then 'S'                                        when 5 then 'U'                                        when 6 then 'X'                                        when 7 then 'IS'                                        when 8 then 'IU'                                        when 9 then 'IX'                                        when 10 then 'SIU'                                        when 11 then 'SIX'                                        when 12 then 'UIX'                                        when 13 then 'BU'                                        when 14 then 'RangeS-S'                                        when 15 then 'RangeS-U'                                        when 16 then 'RangeIn-Null'                                        when 17 then 'RangeIn-S'                                        when 18 then 'RangeIn-U'                                        when 19 then 'RangeIn-X'                                        when 20 then 'RangeX-S'                                        when 21 then 'RangeX-U'                                        when 22 then 'RangeX-X'end,               Status = case req_status when 1 then 'GRANT'                                        when 2 then 'CNVT'                                        when 3 then 'WAIT' end,               req_transactionID As TransID, req_transactionUOW As TransUOW            from master.dbo.syslockinfo s,               @probclients p            where p.spid = s.req_spid               --and ((p.waittype between 0x0001 and 0x0017) or ()) --change: added line            print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate()))          end -- latch not set      end      else         print 'No blocking via locks at ' + convert(varchar(26), @time, 121)      print ''   end  -- fast set   else     begin  -- Fast not set      print ''      print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)      select spid, status, blocked, open_tran, waitresource, waittype,          waittime, cmd, lastwaittype, cpu, physical_io,         memusage, last_batch=convert(varchar(26), last_batch,121),         login_time=convert(varchar(26), login_time,121),net_address,         net_library, dbid, ecid, kpid, hostname, hostprocess,         loginame, program_name, nt_domain, nt_username, uid, sid,         sql_handle, stmt_start, stmt_end, request_id      from master.dbo.sysprocesses      print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate()))       print ''      print 'SYSPROC FIRST PASS'      select spid, request_id, ecid, waittype from @probclients where waittype != 0x0000      if exists(select blocked from @probclients where blocked != 0)      begin         print 'Blocking via locks at ' + convert(varchar(26), @time, 121)         print ''         print 'SPIDs at the head of blocking chains'         select spid from @probclients         where blocked = 0 and spid in (select blocked from @probclients where spid != 0)         if @latch = 0         begin            print 'SYSLOCKINFO'            select @time2 = getdate()            select spid = convert (smallint, req_spid),               ecid = convert (smallint, req_ecid),               rsc_dbid As dbid,               rsc_objid As ObjId,               rsc_indid As IndId,               Type = case rsc_type when 1 then 'NUL'                                    when 2 then 'DB'                                    when 3 then 'FIL'                                    when 4 then 'IDX'                                    when 5 then 'TAB'                                    when 6 then 'PAG'                                    when 7 then 'KEY'                                    when 8 then 'EXT'                                    when 9 then 'RID'                                    when 10 then 'APP' end,               Resource = substring (rsc_text, 1, 16),               Mode = case req_mode + 1 when 1 then NULL                                        when 2 then 'Sch-S'                                        when 3 then 'Sch-M'                                        when 4 then 'S'                                        when 5 then 'U'                                        when 6 then 'X'                                        when 7 then 'IS'                                        when 8 then 'IU'                                        when 9 then 'IX'                                        when 10 then 'SIU'                                        when 11 then 'SIX'                                        when 12 then 'UIX'                                        when 13 then 'BU'                                        when 14 then 'RangeS-S'                                        when 15 then 'RangeS-U'                                        when 16 then 'RangeIn-Null'                                        when 17 then 'RangeIn-S'                                        when 18 then 'RangeIn-U'                                        when 19 then 'RangeIn-X'                                        when 20 then 'RangeX-S'                                        when 21 then 'RangeX-U'                                        when 22 then 'RangeX-X'end,               Status = case req_status when 1 then 'GRANT'                                        when 2 then 'CNVT'                                        when 3 then 'WAIT' end,               req_transactionID As TransID, req_transactionUOW As TransUOW            from master.dbo.syslockinfo            print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate()))          end -- latch not set      end      else        print 'No blocking via locks at ' + convert(varchar(26), @time, 121)      print ''   end -- Fast not set   print 'sys.dm_os_wait_stats'   select * from sys.dm_os_wait_stats where waiting_tasks_count > 0   print 'OWS'   Print ''   Print '*********************************************************************'   Print 'Print out DBCC Input buffer for all blocked or blocking spids.'   Print '*********************************************************************'   declare ibuffer cursor fast_forward for   select distinct cast (spid as varchar(6)) as spid, cast (request_id as varchar(12)) as request_id   from @probclients   where (spid <> @@spid) and (spid > 50) and      ((blocked!=0 or (waittype != 0x0000 and ignore_app = 0))      or spid in (select blocked from @probclients where blocked != 0))   open ibuffer   fetch next from ibuffer into @spid, @request   while (@@fetch_status != -1)   begin      print ''      print 'DBCC INPUTBUFFER FOR SPID ' + @spid +'('+@request+')'      exec ('dbcc inputbuffer (' + @spid + ',' + @request +')')      fetch next from ibuffer into @spid, @request   end   deallocate ibuffer   Print ''   Print '*******************************************************************************'   Print 'Print out DBCC OPENTRAN for active databases for all blocked or blocking spids.'   Print '*******************************************************************************'   declare ibuffer cursor fast_forward for   select distinct cast (dbid as varchar(6)) from @probclients   where dbid != 0   open ibuffer   fetch next from ibuffer into @spid   while (@@fetch_status != -1)   begin      print ''      set @dbname = db_name(@spid)      set @status = DATABASEPROPERTYEX(@dbname,'Status')      set @useraccess = DATABASEPROPERTYEX(@dbname,'UserAccess')      print 'DBCC OPENTRAN FOR DBID ' + @spid + ' ['+ @dbname + ']'      if @status = N'ONLINE' and @useraccess != N'SINGLE_USER'         dbcc opentran(@dbname)      else         print 'Skipped: Status=' + convert(nvarchar(128),@status)            + ' UserAccess=' + convert(nvarchar(128),@useraccess)      print ''      if @spid = '2' select @blocked = 'Y'      fetch next from ibuffer into @spid   end   deallocate ibuffer   if @blocked != 'Y'    begin      print ''      print 'DBCC OPENTRAN FOR DBID  2 [tempdb]'      dbcc opentran ('tempdb')   end   print 'End time: ' + convert(varchar(26), getdate(), 121)end -- Allelse  print '8 No Waittypes: ' + convert(varchar(26), @time, 121) + ' '      + convert(varchar(12), datediff(ms,@time,getdate())) + ' ' + ISNULL (@@servername,'(null)') + ' 19.2005'GO    create procedure dbo.sp_blocker_pss08 (@latch int = 1, @fast int = 1, @appname sysname='PSSDIAG')as --version 19.20003 --2000 SP3 or Laterif is_member('sysadmin')=0 begin  print 'Must be a member of the sysadmin group in order to run this procedure'  returnendset nocount onSET LANGUAGE 'us_english'declare @spid varchar(6)declare @blocked varchar(6)declare @time datetimedeclare @time2 datetimedeclare @dbname nvarchar(128)declare @status sql_variantdeclare @useraccess sql_variantset @time = getdate()declare @probclients table(spid smallint, ecid smallint, blocked smallint, waittype binary(2), dbid smallint,   ignore_app tinyint, primary key (blocked, spid, ecid))insert @probclients select spid, ecid, blocked, waittype, dbid,   case when convert(varchar(128),hostname) = @appname then 1 else 0 end   from master.dbo.sysprocesses where blocked!=0 or waittype != 0x0000if exists (select spid from @probclients where ignore_app != 1 or waittype != 0x020B)begin   set @time2 = getdate()   print ''   print '8.2 Start time: ' + convert(varchar(26), @time, 121) + ' ' + convert(varchar(12), datediff(ms,@time,@time2)) + ' 19.20003 ' +ltrim(str(@latch))+' '+ltrim(str(@fast))    insert @probclients select distinct blocked, 0, 0, 0x0000, 0, 0 from @probclients      where blocked not in (select spid from @probclients) and blocked != 0   if (@fast = 1)   begin      print ''      print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)      select spid, status, blocked, open_tran, waitresource, waittype,          waittime, cmd, lastwaittype, cpu, physical_io,         memusage, last_batch=convert(varchar(26), last_batch,121),         login_time=convert(varchar(26), login_time,121),net_address,         net_library, dbid, ecid, kpid, hostname, hostprocess,         loginame, program_name, nt_domain, nt_username, uid, sid,         sql_handle, stmt_start, stmt_end      from master.dbo.sysprocesses      where blocked!=0 or waittype != 0x0000         or spid in (select blocked from @probclients where blocked != 0)         or spid in (select spid from @probclients where blocked != 0)      print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate()))       print ''      print 'SYSPROC FIRST PASS'      select spid, ecid, waittype from @probclients where waittype != 0x0000      if exists(select blocked from @probclients where blocked != 0)      begin         print 'Blocking via locks at ' + convert(varchar(26), @time, 121)         print ''         print 'SPIDs at the head of blocking chains'         select spid from @probclients            where blocked = 0 and spid in (select blocked from @probclients where spid != 0)         if @latch = 0         begin            print 'SYSLOCKINFO'            select @time2 = getdate()            select spid = convert (smallint, req_spid),               ecid = convert (smallint, req_ecid),               rsc_dbid As dbid,               rsc_objid As ObjId,               rsc_indid As IndId,               Type = case rsc_type when 1 then 'NUL'                                    when 2 then 'DB'                                    when 3 then 'FIL'                                    when 4 then 'IDX'                                    when 5 then 'TAB'                                    when 6 then 'PAG'                                    when 7 then 'KEY'                                    when 8 then 'EXT'                                    when 9 then 'RID'                                    when 10 then 'APP' end,               Resource = substring (rsc_text, 1, 16),               Mode = case req_mode + 1 when 1 then NULL                                        when 2 then 'Sch-S'                                        when 3 then 'Sch-M'                                        when 4 then 'S'                                        when 5 then 'U'                                        when 6 then 'X'                                        when 7 then 'IS'                                        when 8 then 'IU'                                        when 9 then 'IX'                                        when 10 then 'SIU'                                        when 11 then 'SIX'                                        when 12 then 'UIX'                                        when 13 then 'BU'                                        when 14 then 'RangeS-S'                                        when 15 then 'RangeS-U'                                        when 16 then 'RangeIn-Null'                                        when 17 then 'RangeIn-S'                                        when 18 then 'RangeIn-U'                                        when 19 then 'RangeIn-X'                                        when 20 then 'RangeX-S'                                        when 21 then 'RangeX-U'                                        when 22 then 'RangeX-X'end,               Status = case req_status when 1 then 'GRANT'                                        when 2 then 'CNVT'                                        when 3 then 'WAIT' end,               req_transactionID As TransID, req_transactionUOW As TransUOW            from master.dbo.syslockinfo s,               @probclients p            where p.spid = s.req_spid            print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate()))          end -- latch not set      end      else         print 'No blocking via locks at ' + convert(varchar(26), @time, 121)      print ''   end  -- fast set   else     begin  -- Fast not set      print ''      print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)      select spid, status, blocked, open_tran, waitresource, waittype,          waittime, cmd, lastwaittype, cpu, physical_io,         memusage, last_batch=convert(varchar(26), last_batch,121),         login_time=convert(varchar(26), login_time,121),net_address,         net_library, dbid, ecid, kpid, hostname, hostprocess,         loginame, program_name, nt_domain, nt_username, uid, sid,         sql_handle, stmt_start, stmt_end      from master.dbo.sysprocesses      print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate()))       print ''      print 'SYSPROC FIRST PASS'      select spid, ecid, waittype from @probclients where waittype != 0x0000      if exists(select blocked from @probclients where blocked != 0)      begin         print 'Blocking via locks at ' + convert(varchar(26), @time, 121)         print ''         print 'SPIDs at the head of blocking chains'         select spid from @probclients         where blocked = 0 and spid in (select blocked from @probclients where spid != 0)         if @latch = 0         begin            print 'SYSLOCKINFO'            select @time2 = getdate()            select spid = convert (smallint, req_spid),               ecid = convert (smallint, req_ecid),               rsc_dbid As dbid,               rsc_objid As ObjId,               rsc_indid As IndId,               Type = case rsc_type when 1 then 'NUL'                                    when 2 then 'DB'                                    when 3 then 'FIL'                                    when 4 then 'IDX'                                    when 5 then 'TAB'                                    when 6 then 'PAG'                                    when 7 then 'KEY'                                    when 8 then 'EXT'                                    when 9 then 'RID'                                    when 10 then 'APP' end,               Resource = substring (rsc_text, 1, 16),               Mode = case req_mode + 1 when 1 then NULL                                        when 2 then 'Sch-S'                                        when 3 then 'Sch-M'                                        when 4 then 'S'                                        when 5 then 'U'                                        when 6 then 'X'                                        when 7 then 'IS'                                        when 8 then 'IU'                                        when 9 then 'IX'                                        when 10 then 'SIU'                                        when 11 then 'SIX'                                        when 12 then 'UIX'                                        when 13 then 'BU'                                        when 14 then 'RangeS-S'                                        when 15 then 'RangeS-U'                                        when 16 then 'RangeIn-Null'                                        when 17 then 'RangeIn-S'                                        when 18 then 'RangeIn-U'                                        when 19 then 'RangeIn-X'                                        when 20 then 'RangeX-S'                                        when 21 then 'RangeX-U'                                        when 22 then 'RangeX-X'end,               Status = case req_status when 1 then 'GRANT'                                        when 2 then 'CNVT'                                        when 3 then 'WAIT' end,               req_transactionID As TransID, req_transactionUOW As TransUOW            from master.dbo.syslockinfo            print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate()))          end -- latch not set      end      else        print 'No blocking via locks at ' + convert(varchar(26), @time, 121)      print ''   end -- Fast not set   print 'DBCC SQLPERF(WAITSTATS)'   dbcc sqlperf(waitstats)   Print ''   Print '*********************************************************************'   Print 'Print out DBCC Input buffer for all blocked or blocking spids.'   Print '*********************************************************************'   declare ibuffer cursor fast_forward for   select distinct cast (spid as varchar(6)) as spid   from @probclients   where (spid <> @@spid) and       ((blocked!=0 or (waittype != 0x0000 and ignore_app = 0))      or spid in (select blocked from @probclients where blocked != 0))   open ibuffer   fetch next from ibuffer into @spid   while (@@fetch_status != -1)   begin      print ''      print 'DBCC INPUTBUFFER FOR SPID ' + @spid      exec ('dbcc inputbuffer (' + @spid + ')')      fetch next from ibuffer into @spid   end   deallocate ibuffer   Print ''   Print '*******************************************************************************'   Print 'Print out DBCC OPENTRAN for active databases for all blocked or blocking spids.'   Print '*******************************************************************************'   declare ibuffer cursor fast_forward for   select distinct cast (dbid as varchar(6)) from @probclients   where dbid != 0   open ibuffer   fetch next from ibuffer into @spid   while (@@fetch_status != -1)   begin      print ''      set @dbname = db_name(@spid)      set @status = DATABASEPROPERTYEX(@dbname,'Status')      set @useraccess = DATABASEPROPERTYEX(@dbname,'UserAccess')      print 'DBCC OPENTRAN FOR DBID ' + @spid + ' ['+ @dbname + ']'      if @status = N'ONLINE' and @useraccess != N'SINGLE_USER'         dbcc opentran(@dbname)      else         print 'Skipped: Status=' + convert(nvarchar(128),@status)            + ' UserAccess=' + convert(nvarchar(128),@useraccess)      print ''      if @spid = '2' select @blocked = 'Y'      fetch next from ibuffer into @spid   end   deallocate ibuffer   if @blocked != 'Y'    begin      print ''      print 'DBCC OPENTRAN FOR DBID  2 [tempdb]'      dbcc opentran ('tempdb')   end   print 'End time: ' + convert(varchar(26), getdate(), 121)end -- Allelse  print '8 No Waittypes: ' + convert(varchar(26), @time, 121) + ' '      + convert(varchar(12), datediff(ms,@time,getdate())) + ' ' + ISNULL (@@servername,'(null)') + ' 19.20003'GO    create procedure dbo.sp_blocker_pss08 (@latch int = 1, @fast int = 1, @appname sysname='PSSDIAG')as --version 19.2000 -- 2000 before SP3if is_member('sysadmin')=0begin  print 'Must be a member of the sysadmin group in order to run this procedure'  returnendset nocount ondeclare @spid varchar(6)declare @blocked varchar(6)declare @time datetimedeclare @time2 datetimedeclare @dbname nvarchar(128)declare @status sql_variantdeclare @useraccess sql_variantset @time = getdate()declare @probclients table(spid smallint, ecid smallint, blocked smallint, waittype binary(2), dbid smallint,   ignore_app tinyint, primary key (blocked, spid, ecid))insert @probclients select spid, ecid, blocked, waittype, dbid,   case when convert(varchar(128),hostname) = @appname then 1 else 0 end   from master.dbo.sysprocesses where blocked!=0 or waittype != 0x0000if exists (select spid from @probclients where ignore_app != 1 or waittype != 0x020B)begin   set @time2 = getdate()   print ''   print '8 Start time: ' + convert(varchar(26), @time, 121) + ' ' + convert(varchar(12), datediff(ms,@time,@time2)) + ' 19.2000 '+ltrim(str(@latch))+' '+ltrim(str(@fast))    insert @probclients select distinct blocked, 0, 0, 0x0000, 0, 0 from @probclients      where blocked not in (select spid from @probclients) and blocked != 0   if (@fast = 1)   begin      print ''      print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)      select spid, status, blocked, open_tran, waitresource, waittype,          waittime, cmd, lastwaittype, cpu, physical_io,         memusage,last_batch=convert(varchar(26), last_batch,121),         login_time=convert(varchar(26), login_time,121), net_address,         net_library, dbid, ecid, kpid, hostname, hostprocess,         loginame, program_name, nt_domain, nt_username, uid, sid      from master.dbo.sysprocesses      where blocked!=0 or waittype != 0x0000         or spid in (select blocked from @probclients where blocked != 0)         or spid in (select spid from @probclients where waittype != 0x0000)      print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate()))       print ''      print 'SYSPROC FIRST PASS'      select spid, ecid, waittype from @probclients where waittype != 0x0000      if exists(select blocked from @probclients where blocked != 0)      begin         print 'Blocking via locks at ' + convert(varchar(26), @time, 121)         print ''         print 'SPIDs at the head of blocking chains'         select spid from @probclients            where blocked = 0 and spid in (select blocked from @probclients where spid != 0)         if @latch = 0         begin            print 'SYSLOCKINFO'            select @time2 = getdate()            select spid = convert (smallint, req_spid),               ecid = convert (smallint, req_ecid),               rsc_dbid As dbid,               rsc_objid As ObjId,               rsc_indid As IndId,               Type = case rsc_type when 1 then 'NUL'                                    when 2 then 'DB'                                    when 3 then 'FIL'                                    when 4 then 'IDX'                                    when 5 then 'TAB'                                    when 6 then 'PAG'                                    when 7 then 'KEY'                                    when 8 then 'EXT'                                    when 9 then 'RID'                                    when 10 then 'APP' end,               Resource = substring (rsc_text, 1, 16),               Mode = case req_mode + 1 when 1 then NULL                                        when 2 then 'Sch-S'                                        when 3 then 'Sch-M'                                        when 4 then 'S'                                        when 5 then 'U'                                        when 6 then 'X'                                        when 7 then 'IS'                                        when 8 then 'IU'                                        when 9 then 'IX'                                        when 10 then 'SIU'                                        when 11 then 'SIX'                                        when 12 then 'UIX'                                        when 13 then 'BU'                                        when 14 then 'RangeS-S'                                        when 15 then 'RangeS-U'                                        when 16 then 'RangeIn-Null'                                        when 17 then 'RangeIn-S'                                        when 18 then 'RangeIn-U'                                        when 19 then 'RangeIn-X'                                        when 20 then 'RangeX-S'                                        when 21 then 'RangeX-U'                                        when 22 then 'RangeX-X'end,               Status = case req_status when 1 then 'GRANT'                                        when 2 then 'CNVT'                                        when 3 then 'WAIT' end,               req_transactionID As TransID, req_transactionUOW As TransUOW            from master.dbo.syslockinfo s,               @probclients p            where p.spid = s.req_spid            print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate()))          end -- latch not set      end      else         print 'No blocking via locks at ' + convert(varchar(26), @time, 121)      print ''   end  -- fast set   else     begin  -- Fast not set      print ''      print 'SYSPROCESSES ' + ISNULL (@@servername,'(null)') + ' ' + str(@@microsoftversion)      select spid, status, blocked, open_tran, waitresource, waittype,          waittime, cmd, lastwaittype, cpu, physical_io,         memusage,last_batch=convert(varchar(26), last_batch,121),         login_time=convert(varchar(26), login_time,121), net_address,         net_library, dbid, ecid, kpid, hostname, hostprocess,         loginame, program_name, nt_domain, nt_username, uid, sid      from master.dbo.sysprocesses      print 'ESP ' + convert(varchar(12), datediff(ms,@time2,getdate()))       print ''      print 'SYSPROC FIRST PASS'      select spid, ecid, waittype from @probclients where waittype != 0x0000      if exists(select blocked from @probclients where blocked != 0)      begin         print 'Blocking via locks at ' + convert(varchar(26), @time, 121)         print ''         print 'SPIDs at the head of blocking chains'         select spid from @probclients         where blocked = 0 and spid in (select blocked from @probclients where spid != 0)         if @latch = 0         begin            print 'SYSLOCKINFO'            select @time2 = getdate()            select spid = convert (smallint, req_spid),               ecid = convert (smallint, req_ecid),               rsc_dbid As dbid,               rsc_objid As ObjId,               rsc_indid As IndId,               Type = case rsc_type when 1 then 'NUL'                                    when 2 then 'DB'                                    when 3 then 'FIL'                                    when 4 then 'IDX'                                    when 5 then 'TAB'                                    when 6 then 'PAG'                                    when 7 then 'KEY'                                    when 8 then 'EXT'                                    when 9 then 'RID'                                    when 10 then 'APP' end,               Resource = substring (rsc_text, 1, 16),               Mode = case req_mode + 1 when 1 then NULL                                        when 2 then 'Sch-S'                                        when 3 then 'Sch-M'                                        when 4 then 'S'                                        when 5 then 'U'                                        when 6 then 'X'                                        when 7 then 'IS'                                        when 8 then 'IU'                                        when 9 then 'IX'                                        when 10 then 'SIU'                                        when 11 then 'SIX'                                        when 12 then 'UIX'                                        when 13 then 'BU'                                        when 14 then 'RangeS-S'                                        when 15 then 'RangeS-U'                                        when 16 then 'RangeIn-Null'                                        when 17 then 'RangeIn-S'                                        when 18 then 'RangeIn-U'                                        when 19 then 'RangeIn-X'                                        when 20 then 'RangeX-S'                                        when 21 then 'RangeX-U'                                        when 22 then 'RangeX-X'end,               Status = case req_status when 1 then 'GRANT'                                        when 2 then 'CNVT'                                        when 3 then 'WAIT' end,               req_transactionID As TransID, req_transactionUOW As TransUOW            from master.dbo.syslockinfo            print 'ESL ' + convert(varchar(12), datediff(ms,@time2,getdate()))          end -- latch not set      end      else        print 'No blocking via locks at ' + convert(varchar(26), @time, 121)      print ''   end -- Fast not set   print 'DBCC SQLPERF(WAITSTATS)'   dbcc sqlperf(waitstats)   Print ''   Print '*********************************************************************'   Print 'Print out DBCC Input buffer for all blocked or blocking spids.'   Print '*********************************************************************'   declare ibuffer cursor fast_forward for   select distinct cast (spid as varchar(6)) as spid   from @probclients   where (spid <> @@spid) and       ((blocked!=0 or (waittype != 0x0000 and ignore_app = 0))      or spid in (select blocked from @probclients where blocked != 0))   open ibuffer   fetch next from ibuffer into @spid   while (@@fetch_status != -1)   begin      print ''      print 'DBCC INPUTBUFFER FOR SPID ' + @spid      exec ('dbcc inputbuffer (' + @spid + ')')      fetch next from ibuffer into @spid   end   deallocate ibuffer   Print ''   Print '*******************************************************************************'   Print 'Print out DBCC OPENTRAN for active databases for all blocked or blocking spids.'   Print '*******************************************************************************'   declare ibuffer cursor fast_forward for   select distinct cast (dbid as varchar(6)) from @probclients   where dbid != 0   open ibuffer   fetch next from ibuffer into @spid   while (@@fetch_status != -1)   begin      print ''      set @dbname = db_name(@spid)      set @status = DATABASEPROPERTYEX(@dbname,'Status')      set @useraccess = DATABASEPROPERTYEX(@dbname,'UserAccess')      print 'DBCC OPENTRAN FOR DBID ' + @spid + ' ['+ @dbname + ']'      if @status = N'ONLINE' and @useraccess != N'SINGLE_USER'         dbcc opentran(@dbname)      else         print 'Skipped: Status=' + convert(nvarchar(128),@status)            + ' UserAccess=' + convert(nvarchar(128),@useraccess)      print ''      if @spid = '2' select @blocked = 'Y'      fetch next from ibuffer into @spid   end   deallocate ibuffer   if @blocked != 'Y'    begin      print ''      print 'DBCC OPENTRAN FOR DBID  2 [tempdb]'      dbcc opentran ('tempdb')   end   print 'End time: ' + convert(varchar(26), getdate(), 121)end -- Allelse  print '8 No Waittypes: ' + convert(varchar(26), @time, 121) + ' '     + convert(varchar(12), datediff(ms,@time,getdate())) + ' ' + ISNULL (@@servername,'(null)') + ' 19.2000'GO 
Para obter mais informações, visite o seguinte site:

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 271509 - Última Revisão: 09/30/2012 04:37:00 - Revisão: 3.0

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL 2005 Server Workgroup, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL 2005 Server Enterprise, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2000 Workgroup Edition, Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Enterprise Edition

  • kbsqlsetup kbhowto kbinfo kbmt KB271509 KbMtpt
Comentários